@picovoice/eagle-web 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +63 -61
- package/dist/esm/index.min.js +1 -1
- package/dist/iife/index.js +63 -61
- package/dist/iife/index.min.js +1 -1
- package/dist/types/eagle.d.ts +0 -3
- package/dist/types/eagle.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/eagle.ts +26 -20
package/dist/esm/index.js
CHANGED
|
@@ -2893,9 +2893,6 @@ var EagleBase = /*#__PURE__*/function () {
|
|
|
2893
2893
|
_defineProperty$1(this, "_wasmMemory", void 0);
|
|
2894
2894
|
_defineProperty$1(this, "_alignedAlloc", void 0);
|
|
2895
2895
|
_defineProperty$1(this, "_pvFree", void 0);
|
|
2896
|
-
_defineProperty$1(this, "_memoryBuffer", void 0);
|
|
2897
|
-
_defineProperty$1(this, "_memoryBufferUint8", void 0);
|
|
2898
|
-
_defineProperty$1(this, "_memoryBufferView", void 0);
|
|
2899
2896
|
_defineProperty$1(this, "_functionMutex", void 0);
|
|
2900
2897
|
_defineProperty$1(this, "_pvError", void 0);
|
|
2901
2898
|
EagleBase._sampleRate = handleWasm.sampleRate;
|
|
@@ -2905,9 +2902,6 @@ var EagleBase = /*#__PURE__*/function () {
|
|
|
2905
2902
|
this._alignedAlloc = handleWasm.alignedAlloc;
|
|
2906
2903
|
this._pvFree = handleWasm.pvFree;
|
|
2907
2904
|
this._pvError = handleWasm.pvError;
|
|
2908
|
-
this._memoryBuffer = new Int16Array(handleWasm.memory.buffer);
|
|
2909
|
-
this._memoryBufferUint8 = new Uint8Array(handleWasm.memory.buffer);
|
|
2910
|
-
this._memoryBufferView = new DataView(handleWasm.memory.buffer);
|
|
2911
2905
|
this._functionMutex = new Mutex();
|
|
2912
2906
|
}
|
|
2913
2907
|
/**
|
|
@@ -3105,7 +3099,7 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3105
3099
|
case 4:
|
|
3106
3100
|
return _context3.abrupt("return", new Promise(function (resolve, reject) {
|
|
3107
3101
|
_this2._functionMutex.runExclusive( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee2() {
|
|
3108
|
-
var pcmAddress,
|
|
3102
|
+
var pcmAddress, feedbackAddress, percentageAddress, memoryBufferInt16, status, memoryBufferUint8, memoryBufferView, feedback, percentage;
|
|
3109
3103
|
return regenerator$1.wrap(function _callee2$(_context2) {
|
|
3110
3104
|
while (1) switch (_context2.prev = _context2.next) {
|
|
3111
3105
|
case 0:
|
|
@@ -3119,28 +3113,28 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3119
3113
|
return _this2._alignedAlloc(Int16Array.BYTES_PER_ELEMENT, pcm.length * Int16Array.BYTES_PER_ELEMENT);
|
|
3120
3114
|
case 4:
|
|
3121
3115
|
pcmAddress = _context2.sent;
|
|
3122
|
-
|
|
3123
|
-
memoryBufferInt16.set(pcm, pcmAddress / Int16Array.BYTES_PER_ELEMENT);
|
|
3124
|
-
_context2.next = 9;
|
|
3116
|
+
_context2.next = 7;
|
|
3125
3117
|
return _this2._alignedAlloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT);
|
|
3126
|
-
case
|
|
3118
|
+
case 7:
|
|
3127
3119
|
feedbackAddress = _context2.sent;
|
|
3128
3120
|
if (!(feedbackAddress === 0)) {
|
|
3129
|
-
_context2.next =
|
|
3121
|
+
_context2.next = 10;
|
|
3130
3122
|
break;
|
|
3131
3123
|
}
|
|
3132
3124
|
throw new Error('malloc failed: Cannot allocate memory');
|
|
3133
|
-
case
|
|
3134
|
-
_context2.next =
|
|
3125
|
+
case 10:
|
|
3126
|
+
_context2.next = 12;
|
|
3135
3127
|
return _this2._alignedAlloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT);
|
|
3136
|
-
case
|
|
3128
|
+
case 12:
|
|
3137
3129
|
percentageAddress = _context2.sent;
|
|
3138
3130
|
if (!(percentageAddress === 0)) {
|
|
3139
|
-
_context2.next =
|
|
3131
|
+
_context2.next = 15;
|
|
3140
3132
|
break;
|
|
3141
3133
|
}
|
|
3142
3134
|
throw new Error('malloc failed: Cannot allocate memory');
|
|
3143
|
-
case
|
|
3135
|
+
case 15:
|
|
3136
|
+
memoryBufferInt16 = new Int16Array(_this2._wasmMemory.buffer);
|
|
3137
|
+
memoryBufferInt16.set(pcm, pcmAddress / Int16Array.BYTES_PER_ELEMENT);
|
|
3144
3138
|
_context2.next = 19;
|
|
3145
3139
|
return _this2._pvEagleProfilerEnroll(_this2._objectAddress, pcmAddress, pcm.length, feedbackAddress, percentageAddress);
|
|
3146
3140
|
case 19:
|
|
@@ -3149,7 +3143,7 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3149
3143
|
return _this2._pvFree(pcmAddress);
|
|
3150
3144
|
case 22:
|
|
3151
3145
|
if (!(status !== PV_STATUS_SUCCESS)) {
|
|
3152
|
-
_context2.next =
|
|
3146
|
+
_context2.next = 38;
|
|
3153
3147
|
break;
|
|
3154
3148
|
}
|
|
3155
3149
|
_context2.next = 25;
|
|
@@ -3158,31 +3152,33 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3158
3152
|
_context2.next = 27;
|
|
3159
3153
|
return _this2._pvFree(percentageAddress);
|
|
3160
3154
|
case 27:
|
|
3155
|
+
memoryBufferUint8 = new Uint8Array(_this2._wasmMemory.buffer);
|
|
3161
3156
|
_context2.t0 = Error;
|
|
3162
3157
|
_context2.t1 = "enroll failed with status ";
|
|
3163
3158
|
_context2.t2 = arrayBufferToStringAtIndex;
|
|
3164
|
-
_context2.t3 =
|
|
3165
|
-
_context2.next =
|
|
3159
|
+
_context2.t3 = memoryBufferUint8;
|
|
3160
|
+
_context2.next = 34;
|
|
3166
3161
|
return _this2._pvStatusToString(status);
|
|
3167
|
-
case
|
|
3162
|
+
case 34:
|
|
3168
3163
|
_context2.t4 = _context2.sent;
|
|
3169
3164
|
_context2.t5 = (0, _context2.t2)(_context2.t3, _context2.t4);
|
|
3170
3165
|
_context2.t6 = _context2.t1.concat.call(_context2.t1, _context2.t5);
|
|
3171
3166
|
throw new _context2.t0(_context2.t6);
|
|
3172
|
-
case
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
case 40:
|
|
3177
|
-
percentage = _this2._memoryBufferView.getFloat32(percentageAddress, true);
|
|
3167
|
+
case 38:
|
|
3168
|
+
memoryBufferView = new DataView(_this2._wasmMemory.buffer);
|
|
3169
|
+
feedback = memoryBufferView.getInt32(feedbackAddress, true);
|
|
3170
|
+
percentage = memoryBufferView.getFloat32(percentageAddress, true);
|
|
3178
3171
|
_context2.next = 43;
|
|
3179
|
-
return _this2._pvFree(
|
|
3172
|
+
return _this2._pvFree(feedbackAddress);
|
|
3180
3173
|
case 43:
|
|
3174
|
+
_context2.next = 45;
|
|
3175
|
+
return _this2._pvFree(percentageAddress);
|
|
3176
|
+
case 45:
|
|
3181
3177
|
return _context2.abrupt("return", {
|
|
3182
3178
|
feedback: feedback,
|
|
3183
3179
|
percentage: percentage
|
|
3184
3180
|
});
|
|
3185
|
-
case
|
|
3181
|
+
case 46:
|
|
3186
3182
|
case "end":
|
|
3187
3183
|
return _context2.stop();
|
|
3188
3184
|
}
|
|
@@ -3220,7 +3216,7 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3220
3216
|
case 0:
|
|
3221
3217
|
return _context5.abrupt("return", new Promise(function (resolve, reject) {
|
|
3222
3218
|
_this3._functionMutex.runExclusive( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee4() {
|
|
3223
|
-
var profileAddress, status, profile;
|
|
3219
|
+
var profileAddress, status, _memoryBufferUint, memoryBufferUint8, profile;
|
|
3224
3220
|
return regenerator$1.wrap(function _callee4$(_context4) {
|
|
3225
3221
|
while (1) switch (_context4.prev = _context4.next) {
|
|
3226
3222
|
case 0:
|
|
@@ -3239,32 +3235,34 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3239
3235
|
case 7:
|
|
3240
3236
|
status = _context4.sent;
|
|
3241
3237
|
if (!(status !== PV_STATUS_SUCCESS)) {
|
|
3242
|
-
_context4.next =
|
|
3238
|
+
_context4.next = 22;
|
|
3243
3239
|
break;
|
|
3244
3240
|
}
|
|
3245
3241
|
_context4.next = 11;
|
|
3246
3242
|
return _this3._pvFree(profileAddress);
|
|
3247
3243
|
case 11:
|
|
3244
|
+
_memoryBufferUint = new Uint8Array(_this3._wasmMemory.buffer);
|
|
3248
3245
|
_context4.t0 = Error;
|
|
3249
3246
|
_context4.t1 = "export failed with status ";
|
|
3250
3247
|
_context4.t2 = arrayBufferToStringAtIndex;
|
|
3251
|
-
_context4.t3 =
|
|
3252
|
-
_context4.next =
|
|
3248
|
+
_context4.t3 = _memoryBufferUint;
|
|
3249
|
+
_context4.next = 18;
|
|
3253
3250
|
return _this3._pvStatusToString(status);
|
|
3254
|
-
case
|
|
3251
|
+
case 18:
|
|
3255
3252
|
_context4.t4 = _context4.sent;
|
|
3256
3253
|
_context4.t5 = (0, _context4.t2)(_context4.t3, _context4.t4);
|
|
3257
3254
|
_context4.t6 = _context4.t1.concat.call(_context4.t1, _context4.t5);
|
|
3258
3255
|
throw new _context4.t0(_context4.t6);
|
|
3259
|
-
case
|
|
3260
|
-
|
|
3261
|
-
|
|
3256
|
+
case 22:
|
|
3257
|
+
memoryBufferUint8 = new Uint8Array(_this3._wasmMemory.buffer);
|
|
3258
|
+
profile = memoryBufferUint8.slice(profileAddress / Uint8Array.BYTES_PER_ELEMENT, profileAddress / Uint8Array.BYTES_PER_ELEMENT + EagleProfiler._profileSize);
|
|
3259
|
+
_context4.next = 26;
|
|
3262
3260
|
return _this3._pvFree(profileAddress);
|
|
3263
|
-
case
|
|
3261
|
+
case 26:
|
|
3264
3262
|
return _context4.abrupt("return", {
|
|
3265
3263
|
bytes: profile
|
|
3266
3264
|
});
|
|
3267
|
-
case
|
|
3265
|
+
case 27:
|
|
3268
3266
|
case "end":
|
|
3269
3267
|
return _context4.stop();
|
|
3270
3268
|
}
|
|
@@ -3300,7 +3298,7 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3300
3298
|
case 0:
|
|
3301
3299
|
return _context7.abrupt("return", new Promise(function (resolve, reject) {
|
|
3302
3300
|
_this4._functionMutex.runExclusive( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee6() {
|
|
3303
|
-
var status;
|
|
3301
|
+
var status, memoryBufferUint8;
|
|
3304
3302
|
return regenerator$1.wrap(function _callee6$(_context6) {
|
|
3305
3303
|
while (1) switch (_context6.prev = _context6.next) {
|
|
3306
3304
|
case 0:
|
|
@@ -3315,21 +3313,22 @@ var EagleProfiler = /*#__PURE__*/function (_EagleBase) {
|
|
|
3315
3313
|
case 4:
|
|
3316
3314
|
status = _context6.sent;
|
|
3317
3315
|
if (!(status !== PV_STATUS_SUCCESS)) {
|
|
3318
|
-
_context6.next =
|
|
3316
|
+
_context6.next = 17;
|
|
3319
3317
|
break;
|
|
3320
3318
|
}
|
|
3319
|
+
memoryBufferUint8 = new Uint8Array(_this4._wasmMemory.buffer);
|
|
3321
3320
|
_context6.t0 = Error;
|
|
3322
3321
|
_context6.t1 = "reset failed with status ";
|
|
3323
3322
|
_context6.t2 = arrayBufferToStringAtIndex;
|
|
3324
|
-
_context6.t3 =
|
|
3325
|
-
_context6.next =
|
|
3323
|
+
_context6.t3 = memoryBufferUint8;
|
|
3324
|
+
_context6.next = 13;
|
|
3326
3325
|
return _this4._pvStatusToString(status);
|
|
3327
|
-
case
|
|
3326
|
+
case 13:
|
|
3328
3327
|
_context6.t4 = _context6.sent;
|
|
3329
3328
|
_context6.t5 = (0, _context6.t2)(_context6.t3, _context6.t4);
|
|
3330
3329
|
_context6.t6 = _context6.t1.concat.call(_context6.t1, _context6.t5);
|
|
3331
3330
|
throw new _context6.t0(_context6.t6);
|
|
3332
|
-
case
|
|
3331
|
+
case 17:
|
|
3333
3332
|
case "end":
|
|
3334
3333
|
return _context6.stop();
|
|
3335
3334
|
}
|
|
@@ -3716,7 +3715,7 @@ var Eagle = /*#__PURE__*/function (_EagleBase2) {
|
|
|
3716
3715
|
case 4:
|
|
3717
3716
|
return _context14.abrupt("return", new Promise(function (resolve, reject) {
|
|
3718
3717
|
_this7._functionMutex.runExclusive( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee13() {
|
|
3719
|
-
var pcmAddress, memoryBufferInt16, status, scores, i;
|
|
3718
|
+
var pcmAddress, memoryBufferInt16, status, memoryBufferUint8, memoryBufferView, scores, i;
|
|
3720
3719
|
return regenerator$1.wrap(function _callee13$(_context13) {
|
|
3721
3720
|
while (1) switch (_context13.prev = _context13.next) {
|
|
3722
3721
|
case 0:
|
|
@@ -3740,27 +3739,29 @@ var Eagle = /*#__PURE__*/function (_EagleBase2) {
|
|
|
3740
3739
|
return _this7._pvFree(pcmAddress);
|
|
3741
3740
|
case 12:
|
|
3742
3741
|
if (!(status !== PV_STATUS_SUCCESS)) {
|
|
3743
|
-
_context13.next =
|
|
3742
|
+
_context13.next = 24;
|
|
3744
3743
|
break;
|
|
3745
3744
|
}
|
|
3745
|
+
memoryBufferUint8 = new Uint8Array(_this7._wasmMemory.buffer);
|
|
3746
3746
|
_context13.t0 = Error;
|
|
3747
3747
|
_context13.t1 = "process failed with status ";
|
|
3748
3748
|
_context13.t2 = arrayBufferToStringAtIndex;
|
|
3749
|
-
_context13.t3 =
|
|
3750
|
-
_context13.next =
|
|
3749
|
+
_context13.t3 = memoryBufferUint8;
|
|
3750
|
+
_context13.next = 20;
|
|
3751
3751
|
return _this7._pvStatusToString(status);
|
|
3752
|
-
case
|
|
3752
|
+
case 20:
|
|
3753
3753
|
_context13.t4 = _context13.sent;
|
|
3754
3754
|
_context13.t5 = (0, _context13.t2)(_context13.t3, _context13.t4);
|
|
3755
3755
|
_context13.t6 = _context13.t1.concat.call(_context13.t1, _context13.t5);
|
|
3756
3756
|
throw new _context13.t0(_context13.t6);
|
|
3757
|
-
case
|
|
3757
|
+
case 24:
|
|
3758
|
+
memoryBufferView = new DataView(_this7._wasmMemory.buffer);
|
|
3758
3759
|
scores = [];
|
|
3759
3760
|
for (i = 0; i < _this7._numSpeakers; i++) {
|
|
3760
|
-
scores.push(
|
|
3761
|
+
scores.push(memoryBufferView.getFloat32(_this7._scoresAddress + i * Float32Array.BYTES_PER_ELEMENT, true));
|
|
3761
3762
|
}
|
|
3762
3763
|
return _context13.abrupt("return", scores);
|
|
3763
|
-
case
|
|
3764
|
+
case 28:
|
|
3764
3765
|
case "end":
|
|
3765
3766
|
return _context13.stop();
|
|
3766
3767
|
}
|
|
@@ -3797,7 +3798,7 @@ var Eagle = /*#__PURE__*/function (_EagleBase2) {
|
|
|
3797
3798
|
case 0:
|
|
3798
3799
|
return _context16.abrupt("return", new Promise(function (resolve, reject) {
|
|
3799
3800
|
_this8._functionMutex.runExclusive( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee15() {
|
|
3800
|
-
var status;
|
|
3801
|
+
var status, memoryBufferUint8;
|
|
3801
3802
|
return regenerator$1.wrap(function _callee15$(_context15) {
|
|
3802
3803
|
while (1) switch (_context15.prev = _context15.next) {
|
|
3803
3804
|
case 0:
|
|
@@ -3812,21 +3813,22 @@ var Eagle = /*#__PURE__*/function (_EagleBase2) {
|
|
|
3812
3813
|
case 4:
|
|
3813
3814
|
status = _context15.sent;
|
|
3814
3815
|
if (!(status !== PV_STATUS_SUCCESS)) {
|
|
3815
|
-
_context15.next =
|
|
3816
|
+
_context15.next = 17;
|
|
3816
3817
|
break;
|
|
3817
3818
|
}
|
|
3819
|
+
memoryBufferUint8 = new Uint8Array(_this8._wasmMemory.buffer);
|
|
3818
3820
|
_context15.t0 = Error;
|
|
3819
3821
|
_context15.t1 = "reset failed with status ";
|
|
3820
3822
|
_context15.t2 = arrayBufferToStringAtIndex;
|
|
3821
|
-
_context15.t3 =
|
|
3822
|
-
_context15.next =
|
|
3823
|
+
_context15.t3 = memoryBufferUint8;
|
|
3824
|
+
_context15.next = 13;
|
|
3823
3825
|
return _this8._pvStatusToString(status);
|
|
3824
|
-
case
|
|
3826
|
+
case 13:
|
|
3825
3827
|
_context15.t4 = _context15.sent;
|
|
3826
3828
|
_context15.t5 = (0, _context15.t2)(_context15.t3, _context15.t4);
|
|
3827
3829
|
_context15.t6 = _context15.t1.concat.call(_context15.t1, _context15.t5);
|
|
3828
3830
|
throw new _context15.t0(_context15.t6);
|
|
3829
|
-
case
|
|
3831
|
+
case 17:
|
|
3830
3832
|
case "end":
|
|
3831
3833
|
return _context15.stop();
|
|
3832
3834
|
}
|
|
@@ -4168,7 +4170,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
4168
4170
|
};
|
|
4169
4171
|
}
|
|
4170
4172
|
|
|
4171
|
-
var WorkerFactory$1 = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvciQxKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcCQxKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWVFeHBvcnRzID0ge307CiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0gewogICAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHM7IH0sCiAgICBzZXQgZXhwb3J0cyh2KXsgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzID0ge307CiAgdmFyIF90eXBlb2YkMiA9IHsKICAgIGdldCBleHBvcnRzKCl7IHJldHVybiBfdHlwZW9mRXhwb3J0czsgfSwKICAgIHNldCBleHBvcnRzKHYpeyBfdHlwZW9mRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogIAkgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgCSAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAJICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChfdHlwZW9mJDIpKTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0c1siZGVmYXVsdCJdOwogIAlmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogIAkgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgICByZXR1cm4gZXhwb3J0czsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIAkgIHZhciBleHBvcnRzID0ge30sCiAgCSAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgCSAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwKICAJICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogIAkgICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7CiAgCSAgICB9LAogIAkgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogIAkgICAgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIiwKICAJICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciIsCiAgCSAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAJICAgICAgdmFsdWU6IHZhbHVlLAogIAkgICAgICBlbnVtZXJhYmxlOiAhMCwKICAJICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAJICAgICAgd3JpdGFibGU6ICEwCiAgCSAgICB9KSwgb2JqW2tleV07CiAgCSAgfQogIAkgIHRyeSB7CiAgCSAgICBkZWZpbmUoe30sICIiKTsKICAJICB9IGNhdGNoIChlcnIpIHsKICAJICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CiAgCSAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwKICAJICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogIAkgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwogIAkgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgIl9pbnZva2UiLCB7CiAgCSAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgCSAgICB9KSwgZ2VuZXJhdG9yOwogIAkgIH0KICAJICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKQogIAkgICAgICB9OwogIAkgICAgfSBjYXRjaCAoZXJyKSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogInRocm93IiwKICAJICAgICAgICBhcmc6IGVycgogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBleHBvcnRzLndyYXAgPSB3cmFwOwogIAkgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAJICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQogIAkgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogIAkgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pOwogIAkgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogIAkgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAJICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgewogIAkgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIAkgICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsKICAJICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKICAJICAgICAgfSk7CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgCSAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgCSAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsCiAgCSAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAJICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgCSAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgCSAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogIAkgICAgICAgIH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CiAgCSAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAJICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgfSk7CiAgCSAgICAgIH0KICAJICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogIAkgICAgfQogIAkgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAJICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgc3RhdGUgPSAic3VzcGVuZGVkU3RhcnQiOwogIAkgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgewogIAkgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAJICAgICAgaWYgKCJjb21wbGV0ZWQiID09PSBzdGF0ZSkgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBtZXRob2QpIHRocm93IGFyZzsKICAJICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsKICAJICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogIAkgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogIAkgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgCSAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAJICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogIAkgICAgICAgICAgfQogIAkgICAgICAgIH0KICAJICAgICAgICBpZiAoIm5leHQiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKCJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB7CiAgCSAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogIAkgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CiAgCSAgICAgICAgfSBlbHNlICJyZXR1cm4iID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOwogIAkgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgCSAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOwogIAkgICAgICAgIGlmICgibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUpIHsKICAJICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgCSAgICAgICAgICByZXR1cm4gewogIAkgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAJICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIH0KICAJICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogIAkgICAgICB9CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLAogIAkgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAJICAgIGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yWyJyZXR1cm4iXSAmJiAoY29udGV4dC5tZXRob2QgPSAicmV0dXJuIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCAidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgfHwgInJldHVybiIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciICsgbWV0aG9kTmFtZSArICInIG1ldGhvZCIpKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CiAgCSAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgInJldHVybiIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgCSAgICB2YXIgZW50cnkgPSB7CiAgCSAgICAgIHRyeUxvYzogbG9jc1swXQogIAkgICAgfTsKICAJICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgCSAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAJICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogIAkgIH0KICAJICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogIAkgICAgaWYgKGl0ZXJhYmxlKSB7CiAgCSAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAJICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7CiAgCSAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBpID0gLTEsCiAgCSAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogIAkgICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogIAkgICAgICB9CiAgCSAgICB9CiAgCSAgICByZXR1cm4gewogIAkgICAgICBuZXh0OiBkb25lUmVzdWx0CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAJICAgICAgZG9uZTogITAKICAJICAgIH07CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgdmFyIGN0b3IgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogIAkgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgCSAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOwogIAkgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgCSAgICByZXR1cm4gewogIAkgICAgICBfX2F3YWl0OiBhcmcKICAJICAgIH07CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAJICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7CiAgCSAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7CiAgCSAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogIAkgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKICAJICAgIH0pOwogIAkgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogIAkgIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7CiAgCSAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksCiAgCSAgICAgIGtleXMgPSBbXTsKICAJICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpOwogIAkgICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgewogIAkgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgCSAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgCSAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAJICAgIH0sCiAgCSAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgewogIAkgICAgICB0aGlzLmRvbmUgPSAhMDsKICAJICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAJICAgICAgaWYgKCJ0aHJvdyIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgCSAgICB9LAogIAkgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgewogIAkgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgCSAgICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgCSAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgCSAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogIAkgICAgICAgIGlmICgicm9vdCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCAiY2F0Y2hMb2MiKSwKICAJICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwogIAkgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7CiAgCSAgICAgICAgICBicmVhazsKICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgICAgZmluYWxseUVudHJ5ICYmICgiYnJlYWsiID09PSB0eXBlIHx8ICJjb250aW51ZSIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7CiAgCSAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogIAkgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAJICAgIH0sCiAgCSAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogIAkgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiAiYnJlYWsiID09PSByZWNvcmQudHlwZSB8fCAiY29udGludWUiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiAicmV0dXJuIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0sCiAgCSAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogIAkgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgICByZXR1cm4gdGhyb3duOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAJICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgCSAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksCiAgCSAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAJICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgCSAgICAgIH0sICJuZXh0IiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0KICAJICB9LCBleHBvcnRzOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICAvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLgoKICB2YXIgcnVudGltZSQxID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZiQxKG8pIHsKICAgIF9nZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiQxKG8pOwogIH0KCiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mJDEob2JqZWN0KTsKICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0OwogIH0KCiAgZnVuY3Rpb24gX2dldCgpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsKICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0LmJpbmQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICBpZiAoIWJhc2UpIHJldHVybjsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwoYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiByZWNlaXZlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXNjLnZhbHVlOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICAgIG8uX19wcm90b19fID0gcDsKICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzJDEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZiQxKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKICB9CgogIGZ1bmN0aW9uIF90eXBlb2YkMShvYmopIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2YkMShvYmopOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMShzZWxmLCBjYWxsKSB7CiAgICBpZiAoY2FsbCAmJiAoX3R5cGVvZiQxKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUkMShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YkMShpbnB1dCkgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKF90eXBlb2YkMShyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5JDEoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlJDEoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gX3R5cGVvZiQxKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleSQxKGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSBfdG9Qcm9wZXJ0eUtleSQxKGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGNvbnN0IEVfQ0FOQ0VMRUQgPSBuZXcgRXJyb3IoJ3JlcXVlc3QgZm9yIGxvY2sgY2FuY2VsZWQnKTsKCiAgdmFyIF9fYXdhaXRlciQyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgICB9KTsKICB9OwogIGNsYXNzIFNlbWFwaG9yZSB7CiAgICAgIGNvbnN0cnVjdG9yKF92YWx1ZSwgX2NhbmNlbEVycm9yID0gRV9DQU5DRUxFRCkgewogICAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzID0gW107CiAgICAgICAgICB0aGlzLl93ZWlnaHRlZFdhaXRlcnMgPSBbXTsKICAgICAgfQogICAgICBhY3F1aXJlKHdlaWdodCA9IDEpIHsKICAgICAgICAgIGlmICh3ZWlnaHQgPD0gMCkKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2VpZ2h0ICR7d2VpZ2h0fTogbXVzdCBiZSBwb3NpdGl2ZWApOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdKQogICAgICAgICAgICAgICAgICB0aGlzLl93ZWlnaHRlZFF1ZXVlc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaywgd2VpZ2h0ID0gMSkgewogICAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUod2VpZ2h0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHdhaXRGb3JVbmxvY2sod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLnB1c2gocmVzb2x2ZSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIGlzTG9ja2VkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7CiAgICAgIH0KICAgICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgIH0KICAgICAgc2V0VmFsdWUodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIHJlbGVhc2Uod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICB0aGlzLl92YWx1ZSArPSB3ZWlnaHQ7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzLmZvckVhY2goKHF1ZXVlKSA9PiBxdWV1ZS5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSkpOwogICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRRdWV1ZXMgPSBbXTsKICAgICAgfQogICAgICBfZGlzcGF0Y2goKSB7CiAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBjb25zdCBxdWV1ZUVudHJ5ID0gKF9hID0gdGhpcy5fd2VpZ2h0ZWRRdWV1ZXNbd2VpZ2h0IC0gMV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zaGlmdCgpOwogICAgICAgICAgICAgIGlmICghcXVldWVFbnRyeSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX3ZhbHVlOwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzV2VpZ2h0ID0gd2VpZ2h0OwogICAgICAgICAgICAgIHRoaXMuX3ZhbHVlIC09IHdlaWdodDsKICAgICAgICAgICAgICB3ZWlnaHQgPSB0aGlzLl92YWx1ZSArIDE7CiAgICAgICAgICAgICAgcXVldWVFbnRyeS5yZXNvbHZlKFtwcmV2aW91c1ZhbHVlLCB0aGlzLl9uZXdSZWxlYXNlcihwcmV2aW91c1dlaWdodCldKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2RyYWluVW5sb2NrV2FpdGVycygpOwogICAgICB9CiAgICAgIF9uZXdSZWxlYXNlcih3ZWlnaHQpIHsKICAgICAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNhbGxlZCkKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHdlaWdodCk7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIF9kcmFpblVubG9ja1dhaXRlcnMoKSB7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKCkpOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgfQogICAgICB9CiAgfQoKICB2YXIgX19hd2FpdGVyJDEgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgIH0pOwogIH07CiAgY2xhc3MgTXV0ZXggewogICAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikgewogICAgICAgICAgdGhpcy5fc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxLCBjYW5jZWxFcnJvcik7CiAgICAgIH0KICAgICAgYWNxdWlyZSgpIHsKICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICBjb25zdCBbLCByZWxlYXNlcl0gPSB5aWVsZCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgpOwogICAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5ydW5FeGNsdXNpdmUoKCkgPT4gY2FsbGJhY2soKSk7CiAgICAgIH0KICAgICAgaXNMb2NrZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCk7CiAgICAgIH0KICAgICAgd2FpdEZvclVubG9jaygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUud2FpdEZvclVubG9jaygpOwogICAgICB9CiAgICAgIHJlbGVhc2UoKSB7CiAgICAgICAgICBpZiAodGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCkpCiAgICAgICAgICAgICAgdGhpcy5fc2VtYXBob3JlLnJlbGVhc2UoKTsKICAgICAgfQogICAgICBjYW5jZWwoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmNhbmNlbCgpOwogICAgICB9CiAgfQoKICBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7CiAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogIAlyZXR1cm4gZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwogIH0KCiAgdmFyIF90eXBlb2ZfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG9iaik7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIHZhciBfdHlwZW9mID0gX3R5cGVvZl8xWyJkZWZhdWx0Il07CiAgZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgICAgIHJldHVybiBleHBvcnRzOwogICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICAgIHZhciBleHBvcnRzID0ge30sCiAgICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksCiAgICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogICAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTsKICAgICAgfSwKICAgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogICAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiLAogICAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogICAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogICAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgIH0pLCBvYmpba2V5XTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGRlZmluZSh7fSwgIiIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsKICAgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsCiAgICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7CiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsICJfaW52b2tlIiwgewogICAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgICAgIH0pLCBnZW5lcmF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJ0aHJvdyIsCiAgICAgICAgICBhcmc6IGVycgogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMud3JhcCA9IHdyYXA7CiAgICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwogICAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogICAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLAogICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogICAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7CiAgICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsKICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkLCByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgICAgIH0KICAgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgIl9pbnZva2UiLCB7CiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICAgIHZhciBzdGF0ZSA9ICJzdXNwZW5kZWRTdGFydCI7CiAgICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsKICAgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgICBpZiAoImNvbXBsZXRlZCIgPT09IHN0YXRlKSB7CiAgICAgICAgICBpZiAoInRocm93IiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7CiAgICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7CiAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOwogICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCJuZXh0IiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmICgidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgewogICAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKICAgICAgICAgIH0gZWxzZSAicmV0dXJuIiA9PT0gY29udGV4dC5tZXRob2QgJiYgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CiAgICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCiAgICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKICAgICAgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZCwKICAgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsICJ0aHJvdyIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdICYmIChjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksICJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbWV0aG9kTmFtZSAmJiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBtZXRob2ROYW1lICsgIicgbWV0aG9kIikpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOwogICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKICAgICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsICJyZXR1cm4iICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpOwogICAgfQogICAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsKICAgICAgdmFyIGVudHJ5ID0gewogICAgICAgIHRyeUxvYzogbG9jc1swXQogICAgICB9OwogICAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHsKICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CiAgICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogICAgfQogICAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgewogICAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogICAgICAgIHRyeUxvYzogInJvb3QiCiAgICAgIH1dLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZSkgewogICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlOwogICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogICAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5leHQ6IGRvbmVSZXN1bHQKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICBkb25lOiAhMAogICAgICB9OwogICAgfQogICAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHZhciBjdG9yID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsKICAgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsKICAgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgX19hd2FpdDogYXJnCiAgICAgIH07CiAgICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsKICAgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOwogICAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpOwogICAgICB9KTsKICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBkZWZpbmUoR3AsICJ0b1N0cmluZyIsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogICAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLAogICAgICAgIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7CiAgICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgfTsKICAgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsCiAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7CiAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAgICAgfSwKICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICB0aGlzLmRvbmUgPSAhMDsKICAgICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogICAgICAgIGlmICgidGhyb3ciID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOwogICAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgICAgIH0sCiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKICAgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICBpZiAoInJvb3QiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpLAogICAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKICAgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHlFbnRyeSAmJiAoImJyZWFrIiA9PT0gdHlwZSB8fCAiY29udGludWUiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpOwogICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogICAgICB9LAogICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgICByZXR1cm4gImJyZWFrIiA9PT0gcmVjb3JkLnR5cGUgfHwgImNvbnRpbnVlIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogInJldHVybiIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSAicmV0dXJuIiwgdGhpcy5uZXh0ID0gImVuZCIpIDogIm5vcm1hbCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0sCiAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJjYXRjaCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogICAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAgICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAgICAgICAgIG5leHRMb2M6IG5leHRMb2MKICAgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KICAgIH0sIGV4cG9ydHM7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUgPSByZWdlbmVyYXRvclJ1bnRpbWUkMSgpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgY29uc3QgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIG5ldyBQcm94eSh0LHtnZXQ6KHQscik9PmUodFtyXSl9KX1jbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT12b2lkIDAsdGhpcy5leHBvcnRzPW51bGw7fWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKX1hc3NlcnROb25lU3RhdGUoKXtsZXQgdD10aGlzLmdldFN0YXRlKCk7aWYoMCE9PXQpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIHN0YXRlICR7dH0sIGV4cGVjdGVkIDAuYCl9d3JhcEltcG9ydEZuKHQpe3JldHVybiAoLi4uZSk9PntpZigyPT09dGhpcy5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKSx0aGlzLnZhbHVlO3RoaXMuYXNzZXJ0Tm9uZVN0YXRlKCk7bGV0IHI9dCguLi5lKTtpZighKHM9cil8fCJvYmplY3QiIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnRoZW4pcmV0dXJuIHI7dmFyIHM7dGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZCgxNiksdGhpcy52YWx1ZT1yO319d3JhcE1vZHVsZUltcG9ydHModCl7cmV0dXJuIGUodCx0PT4iZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLndyYXBJbXBvcnRGbih0KTp0KX13cmFwSW1wb3J0cyh0KXtpZih2b2lkIDAhPT10KXJldHVybiBlKHQsKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSk9PnRoaXMud3JhcE1vZHVsZUltcG9ydHModCkpfXdyYXBFeHBvcnRGbihlKXtsZXQgcj10LmdldChlKTtyZXR1cm4gdm9pZCAwIT09cnx8KHI9YXN5bmMoLi4udCk9Pnt0aGlzLmFzc2VydE5vbmVTdGF0ZSgpO2xldCByPWUoLi4udCk7Zm9yKDsxPT09dGhpcy5nZXRTdGF0ZSgpOyl0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKSx0aGlzLnZhbHVlPWF3YWl0IHRoaXMudmFsdWUsdGhpcy5hc3NlcnROb25lU3RhdGUoKSx0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfcmV3aW5kKDE2KSxyPWUoKTtyZXR1cm4gdGhpcy5hc3NlcnROb25lU3RhdGUoKSxyfSx0LnNldChlLHIpKSxyfXdyYXBFeHBvcnRzKGUpe2xldCByPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCB0IGluIGUpe2xldCBzPWVbdF07ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHQuc3RhcnRzV2l0aCgiYXN5bmNpZnlfIil8fChzPXRoaXMud3JhcEV4cG9ydEZuKHMpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocix0LHtlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KTt9cmV0dXJuIHQuc2V0KGUscikscn1pbml0KHQsZSl7Y29uc3R7ZXhwb3J0czpyfT10LG49ci5tZW1vcnl8fGUuZW52JiZlLmVudi5tZW1vcnk7bmV3IEludDMyQXJyYXkobi5idWZmZXIsMTYpLnNldChbMjQsMTAyNF0pLHRoaXMuZXhwb3J0cz10aGlzLndyYXBFeHBvcnRzKHIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LHMucHJvdG90eXBlKTt9fWNsYXNzIHMgZXh0ZW5kcyBXZWJBc3NlbWJseS5JbnN0YW5jZXtjb25zdHJ1Y3Rvcih0LGUpe2xldCBzPW5ldyByO3N1cGVyKHQscy53cmFwSW1wb3J0cyhlKSkscy5pbml0KHRoaXMsZSk7fWdldCBleHBvcnRzKCl7cmV0dXJuIHQuZ2V0KHN1cGVyLmV4cG9ydHMpfX1hc3luYyBmdW5jdGlvbiBuKHQsZSl7bGV0IHM9bmV3IHIsbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LHMud3JhcEltcG9ydHMoZSkpO3JldHVybiBzLmluaXQobiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP246bi5pbnN0YW5jZSxlKSxufWFzeW5jIGZ1bmN0aW9uIGEodCxlKXtsZXQgcz1uZXcgcixuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHQscy53cmFwSW1wb3J0cyhlKSk7cmV0dXJuIHMuaW5pdChuLmluc3RhbmNlLGUpLG59T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLCJleHBvcnRzIix7ZW51bWVyYWJsZTohMH0pOwoKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2Yob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmIChfdHlwZW9mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgewogICAgICByZXR1cm4gY2FsbDsKICAgIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsKICAgIH07CiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOwogIH0KCiAgZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9CiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfcGF0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21ldGEiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RmlsZSwgW3sKICAgICAga2V5OiAibWV0YSIsCiAgICAgIGdldDoKICAgICAgLyoqDQogICAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5fbWV0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCQxKHsKICAgICAgICAgIHZlcnNpb246IDAKICAgICAgICB9LCB0aGlzLl9tZXRhKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZGaWxlLCAiX2ZpbGVQdHJzIiwgbmV3IE1hcCgpKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDEoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQxKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBJbmRleGVkIERCIGNvbmZpZ3VyYXRpb25zDQogICAqLwogIHZhciBEQl9OQU1FID0gJ3B2X2RiJzsKICB2YXIgUFZfRklMRV9TVE9SRSA9ICdwdl9maWxlJzsKICB2YXIgREJfVkVSU0lPTiA9IDM7CiAgLyoqDQogICAqIEhlbHBlciB0byBnZXQgSW5kZXhlZERCLg0KICAgKi8KICBmdW5jdGlvbiBnZXREQigpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTsKICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgfTsKICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7CiAgICAgIH07CiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhQVl9GSUxFX1NUT1JFKSkgewogICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSk7CiAgICAgICAgfQogICAgICB9OwogICAgfSk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgSW5kZXhlZERCLg0KICAgKiBJbmRleGVkREIgaXMgUkVRVUlSRUQuDQogICAqLwogIHZhciBQdkZpbGVJREIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVJREIsIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQxKFB2RmlsZUlEQik7CiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3RvciBvZiBQdkZpbGUgaW5zdGFuY2UuDQogICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgYSBmaWxlLg0KICAgICAqIEBwYXJhbSBtZXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZS4NCiAgICAgKiBAcGFyYW0gZGIgVGhlIGRiIGluc3RhbmNlIGN1cnJlbnRseSByZWxhdGVkIHRvIHRoZSBvcGVuZWQgZmlsZS4NCiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSAtIGVpdGhlciByZWFkb25seSBvciByZWFkd3JpdGUuDQogICAgICovCiAgICBmdW5jdGlvbiBQdkZpbGVJREIocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlSURCKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BhZ2VTaXplIiwgNjU1MzYpOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfZGIiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlUHRyIiwgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlT2Zmc2V0IiwgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fZGIgPSBkYjsKICAgICAgX3RoaXMuX21vZGUgPSBtb2RlOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBPcGVucyBhIGZpbGUgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQdkZpbGUuIEEgZmlsZSBjYW4gYmUgb3BlbmVkIGluIHJlYWRvbmx5IG9yIHJlYWR3cml0ZSBtb2RlDQogICAgICogd2hpY2ggZm9sbG93cyBJbmRleGVkREIgc3RhbmRhcmQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyB2YWx1ZXMgdG8gdGhlIGRiLg0KICAgICAqIFRoZSBmaWxlIGlzIHN0b3JlZCBhcyBhbiBVaW50OEFycmF5IHNlcGFyYXRlZCBieSBwYWdlcy4NCiAgICAgKiBOT1RFOiBUaGUga2V5IGV4YWN0bHkgbWF0Y2hpbmcgdGhlIHBhdGggZXhwZWN0cyBhIHZhbHVlIG9mIHR5cGUgUHZGaWxlTWV0YS4NCiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBvcGVuIHN0b3JlZCBpbiBJbmRleGVkREIuDQogICAgICogQHBhcmFtIG1vZGUgQSBzdHJpbmcsIGlmIGl0IGNvbnRhaW5zICdyJyBpbiB0aGUgc3RyaW5nLCBpdCB3aWxsIG9wZW4gdGhlIGZpbGUgaW4gcmVhZG9ubHkgbW9kZSwgZWxzZSBpdA0KICAgICAqIHdpbGwgb3BlbiBpbiByZWFkd3JpdGUgbW9kZS4NCiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFB2RmlsZT4gQW4gaW5zdGFuY2Ugb2YgUHZGaWxlLg0KICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlSURCLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIENsb3NlcyB0aGUgZGIgY29ubmVjdGlvbi4gQW55IG90aGVyIGluc3RhbmNlIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3Qgd29yayBvbmNlDQogICAgICAgKiB0aGUgZGIgaXMgY2xvc2VkLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2Nsb3NlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgICAgICByZXR1cm4gX2Nsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbG9zZTsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVhZHMgYSB0b3RhbCBvZiAnY291bnQnIGVsZW1lbnRzLCBlYWNoIHdpdGggYSBzaXplIG9mICdzaXplJyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uDQogICAgICAgKiBNb3ZlcyB0aGUgc3RyZWFtIGJ5IHRoZSBhbW91bnQgb2YgZWxlbWVudHMgcmVhZC4NCiAgICAgICAqIElmIHRoZSBsYXN0IGZldyBieXRlcyBpcyBzbWFsbGVyIHRoYW4gJ3NpemUnIGl0IHdpbGwgbm90IHJlYWQgKHNpbWlsYXIgdG8gZnJlYWQpIHRoZSBieXRlcy4NCiAgICAgICAqIEBwYXJhbSBzaXplIFRoZSBlbGVtZW50IHNpemUuDQogICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkLg0KICAgICAgICogQHJldHVybnMgUHJvbWlzZTxVaW50OEFycmF5PiBBIFVpbnQ4QXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgY29waWVkIHRvIGl0Lg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVhZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzaXplLCBjb3VudCkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBpZiAoIV90aGlzMi5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIiciLmNvbmNhdChfdGhpczIuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDsKICAgICAgICAgICAgICAgICAgdmFyIG1heFRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgX3RoaXMyLl9tZXRhLnNpemUpOwogICAgICAgICAgICAgICAgICB2YXIgdG90YWxFbGVtcyA9IG1heFRvQ29weSAtIG1heFRvQ29weSAlIHNpemU7CiAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbEVsZW1zKTsKICAgICAgICAgICAgICAgICAgdmFyIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMi5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMyLl9wYWdlUHRyKSksICIiLmNvbmNhdChfdGhpczIuX3BhdGgsICItIikuY29uY2F0KFB2RmlsZUlEQi5jcmVhdGVQYWdlKF90aGlzMi5fbWV0YS5udW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gX3RoaXMyLl9zdG9yZTsKICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yIHx8IF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHRvdGFsRWxlbXMgLSBjb3BpZWQsIGN1cnNvci52YWx1ZS5sZW5ndGggLSBfdGhpczIuX3BhZ2VPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoY3Vyc29yLnZhbHVlLnNsaWNlKF90aGlzMi5fcGFnZU9mZnNldCwgX3RoaXMyLl9wYWdlT2Zmc2V0ICsgdG9Db3B5KSwgY29waWVkKTsKICAgICAgICAgICAgICAgICAgICBjb3BpZWQgKz0gdG9Db3B5OwogICAgICAgICAgICAgICAgICAgIF90aGlzMi5fcGFnZU9mZnNldCArPSB0b0NvcHk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5fcGFnZU9mZnNldCA9PT0gX3RoaXMyLl9wYWdlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlUHRyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczIuX3BhZ2VPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkIDwgdG90YWxFbGVtcykgewogICAgICAgICAgICAgICAgICAgICAgY3Vyc29yWyJjb250aW51ZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChzdG9yZS50cmFuc2FjdGlvbi5lcnJvcik7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShidWZmZXIuc2xpY2UoMCwgY29waWVkKSk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWFkKF94LCBfeDIpIHsKICAgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogV3JpdGVzIGFuIFVpbnQ4QXJyYXkgdG8gSW5kZXhlZERCIHNlcGVyYXRlZCBieSBwYWdlcy4NCiAgICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBieXRlcyB0byBzYXZlLg0KICAgICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgZmlsZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJ3cml0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF93cml0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjb250ZW50KSB7CiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICAgIHZhciB2ZXJzaW9uLAogICAgICAgICAgICBfYXJnczQgPSBhcmd1bWVudHM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2FyZ3M0Lmxlbmd0aCA+IDEgJiYgX2FyZ3M0WzFdICE9PSB1bmRlZmluZWQgPyBfYXJnczRbMV0gOiAxOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUsIGdldEN1cnJlbnRQYWdlLCBsYXN0LCBuZXdDb250ZW50LCBuZXdTaXplLCBuZXdNZXRhLCBwYWdlcywgaSwga2V5UmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl9tb2RlID09PSAicmVhZG9ubHkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkluc3RhbmNlIGlzIHJlYWRvbmx5IG1vZGUgb25seS4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIHZlcnNpb24gIT09ICJudW1iZXIiICYmIHZlcnNpb24gPD0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJWZXJzaW9uIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzMy5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiBnZXRDdXJyZW50UGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5nZXQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMzLl9wYWdlUHRyKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEucmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhyZXEucmVzdWx0LnNsaWNlKDAsIF90aGlzMy5fcGFnZU9mZnNldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMobmV3IFVpbnQ4QXJyYXkoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG5ldyBVaW50OEFycmF5KGxhc3QubGVuZ3RoICsgY29udGVudC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGxhc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGNvbnRlbnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gX3RoaXMzLl9wYWdlUHRyICogX3RoaXMzLl9wYWdlU2l6ZSArIG5ld0NvbnRlbnQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBuZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM6IE1hdGguY2VpbChuZXdTaXplIC8gX3RoaXMzLl9wYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3TWV0YSwgX3RoaXMzLl9wYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChuZXdDb250ZW50Lmxlbmd0aCAvIF90aGlzMy5fcGFnZVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3Q29udGVudC5zbGljZShpICogX3RoaXMzLl9wYWdlU2l6ZSwgKGkgKyAxKSAqIF90aGlzMy5fcGFnZVNpemUpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX3BhZ2VQdHIgKyBpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMzLmV4aXN0cygpICYmIG5ld01ldGEubnVtUGFnZXMgPCBfdGhpczMuX21ldGEubnVtUGFnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UobmV3TWV0YS5udW1QYWdlcykpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX21ldGEubnVtUGFnZXMpKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVsiZGVsZXRlIl0oa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0b3JlLnRyYW5zYWN0aW9uLmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczMuX21ldGEgPSBuZXdNZXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnNlZWsoMCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQsIF94NSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkpKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHdyaXRlKF94MykgewogICAgICAgICAgcmV0dXJuIF93cml0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGU7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gYnkgJ29mZnNldCcgZWxlbWVudHMgYXQgJ3doZW5jZScgcG9zaXRpb24uDQogICAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZS4NCiAgICAgICAqIEBwYXJhbSB3aGVuY2UgT25lIG9mOg0KICAgICAgICogIC0gMDogbW92ZXMgcG9zaXRpb24gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4NCiAgICAgICAqICAtIDE6IG1vdmVzIHBvc2l0aW9uIGZyb20gY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLg0KICAgICAgICogIC0gMjogbW92ZXMgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBmaWxlLg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDEpIHsKICAgICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fcGFnZVNpemUgKiB0aGlzLl9wYWdlUHRyICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKGN1cnJlbnRPZmZzZXQgKyBvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX21ldGEuc2l6ZSArIG9mZnNldCwgdGhpcy5fbWV0YS5zaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGFnZU9mZnNldCA9IG5ld09mZnNldCAlIHRoaXMuX3BhZ2VTaXplOwogICAgICAgIHRoaXMuX3BhZ2VQdHIgPSBNYXRoLmZsb29yKG5ld09mZnNldCAvIHRoaXMuX3BhZ2VTaXplKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidGVsbCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWxsKCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciAqIHRoaXMuX3BhZ2VTaXplICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJlbW92ZXMgYSBmaWxlIGFuZCBhbnkgcmVsYXRlZCBwYWdlcyBnaXZlbiB0aGUgcGF0aC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVtb3ZlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkgewogICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUGFnZXMsIGtleVJhbmdlLCBzdG9yZSwgcmVxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzID0gX3RoaXM0Ll9tZXRhLm51bVBhZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoX3RoaXM0Ll9wYXRoLCAiIi5jb25jYXQoX3RoaXM0Ll9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShudW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzNC5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID0gc3RvcmVbImRlbGV0ZSJdKGtleVJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fbWV0YSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fcGFnZU9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuX3BhZ2VQdHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94NykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpKSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbGxvd2luZyBwYXRoIGV4aXN0cy4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tZXRhICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc3RyZWFtIGlzIEVPRi4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfaXNFT0YiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciA+PSB0aGlzLl9tZXRhLm51bVBhZ2VzIC0gMSAmJiB0aGlzLl9wYWdlT2Zmc2V0ID49IHRoaXMuX21ldGEuc2l6ZSAlIHRoaXMuX3BhZ2VTaXplOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aGljaCBhcyBhIGtleSB0byBzYXZlIHBhZ2UgZGF0YSB0byBJbmRleGVkREIuDQogICAgICAgKiBUaGlzIGZvcm1hdHMgdGhlIGZpbGUgaW50byAwMDAwLCAwMDAxLCAwMDAyIC4uLg0KICAgICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgbnVtYmVyIHRvIGZvcm1hdC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfc3RvcmUiLAogICAgICBnZXQ6CiAgICAgIC8qKg0KICAgICAgICogR2V0cyBhIG9iamVjdFN0b3JlIGluc3RhbmNlIGZyb20gdGhlIFB2RmlsZSBpbnN0YW5jZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RiLnRyYW5zYWN0aW9uKFBWX0ZJTEVfU1RPUkUsIHRoaXMuX21vZGUpLm9iamVjdFN0b3JlKFBWX0ZJTEVfU1RPUkUpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICBpZiAoIXNlbGYuaW5kZXhlZERCKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICBlcnJvci5uYW1lID0gIkluZGV4ZWREQk5vdFN1cHBvcnRlZCI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZGIsIHJlcSwgX2Vycm9yMjsKICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0NykgewogICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnByZXYgPSAwOwogICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREQigpOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICBkYiA9IF9jb250ZXh0Ny5zZW50OwogICAgICAgICAgICAgICAgICByZXEgPSBkYi50cmFuc2FjdGlvbihQVl9GSUxFX1NUT1JFLCAicmVhZHdyaXRlIikub2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSkuZ2V0KHBhdGgpOwogICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHJlcS5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRiTW9kZSA9IG1vZGUuaW5jbHVkZXMoJ3InKSA/ICJyZWFkb25seSIgOiAicmVhZHdyaXRlIjsKICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PT0gdW5kZWZpbmVkICYmIGRiTW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9lcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgICAgICAgICAgICAgX2Vycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX2Vycm9yKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJREIgPSBuZXcgUHZGaWxlSURCKHBhdGgsIG1ldGEsIGRiLCBkYk1vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgICAgICAgICAgICAgIGZpbGVJREIuc2VlaygwLCAyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlSURCKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gOTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnQwID0gX2NvbnRleHQ3WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ3LnQwLm5hbWUgPT09ICJJbnZhbGlkU3RhdGVFcnJvciIpIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IyID0gbmV3IEVycm9yKCJJbmRleGVkREIgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgICAgICAgIF9lcnJvcjIubmFtZSA9ICJJbmRleGVkREJOb3RTdXBwb3J0ZWQiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChfZXJyb3IyKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NvbnRleHQ3LnQwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgX2NhbGxlZTcsIG51bGwsIFtbMCwgOV1dKTsKICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g4LCBfeDkpIHsKICAgICAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0oKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY3JlYXRlUGFnZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQYWdlKHBhZ2UpIHsKICAgICAgICByZXR1cm4gKCIwMDAiICsgcGFnZSkuc2xpY2UoLTQpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlSURCOwogIH0oUHZGaWxlKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMigpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BvcyIsIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdkZpbGVNZW0sIFt7CiAgICAgIGtleTogImNsb3NlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWFkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQoc2l6ZSwgY291bnQpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFT0YpIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgdGhpcy5fZmlsZS5sZW5ndGggLSB0aGlzLl9wb3MpOwogICAgICAgIHZhciB0b3RhbEVsZW1zID0gdG9Db3B5IC0gdG9Db3B5ICUgc2l6ZTsKICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxFbGVtcyk7CiAgICAgICAgYnVmZmVyLnNldCh0aGlzLl9maWxlLnNsaWNlKHRoaXMuX3BvcywgdGhpcy5fcG9zICsgdG90YWxFbGVtcyksIDApOwogICAgICAgIHRoaXMuX3BvcyArPSB0b3RhbEVsZW1zOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAid3JpdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoY29udGVudCkgewogICAgICAgIHZhciBuZXdGaWxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fcG9zICsgY29udGVudC5sZW5ndGgpOwogICAgICAgIGlmICh0aGlzLl9maWxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KHRoaXMuX2ZpbGUuc2xpY2UoMCwgdGhpcy5fcG9zKSk7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50LCB0aGlzLl9wb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgdGhpcy5fcG9zICs9IGNvbnRlbnQubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wb3M7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3JlbW92ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzWyJkZWxldGUiXSh0aGlzLl9wYXRoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3MgPSAwOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW1vdmU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgX2RlZmluZVByb3BlcnR5KFB2RmlsZU1lbSwgIl9tZW1GaWxlcyIsIG5ldyBNYXAoKSk7CgogIGZ1bmN0aW9uIG93bktleXMkMihvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMkMihPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzJDIoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bIkBAaXRlcmF0b3IiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB9CiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHBocmFzZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZw0KICAgKg0KICAgKiBAcGFyYW0gYXJyYXlCdWZmZXIgaW5wdXQgYXJyYXkgYnVmZmVyDQogICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGhyYXNlIGlzIHN0b3JlZA0KICAgKiBAcmV0dXJuIHJldHJpZXZlZCBzdHJpbmcNCiAgICovCiAgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgoYXJyYXlCdWZmZXIsIGluZGV4U3RhcnQpIHsKICAgIHZhciBpbmRleEVuZCA9IGluZGV4U3RhcnQ7CiAgICB3aGlsZSAoYXJyYXlCdWZmZXJbaW5kZXhFbmRdICE9PSAwKSB7CiAgICAgIGluZGV4RW5kKys7CiAgICB9CiAgICB2YXIgdXRmOGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04Jyk7CiAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKGFycmF5QnVmZmVyLnN1YmFycmF5KGluZGV4U3RhcnQsIGluZGV4RW5kKSk7CiAgfQogIC8qKg0KICAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFuZCBzdG9yZWQgaXQgaW4gYSBVaW50OEFycmF5IGFycmF5DQogICAqDQogICAqIEBwYXJhbSBiYXNlNjRTdHJpbmcgaW5wdXQgYmFzZTY0IHN0cmluZw0KICAgKiBAcmV0dXJuIGRlY29kZWQgYXJyYXkNCiAgICovCiAgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykgewogICAgdmFyIGJhc2U2NFN0cmluZ0RlY29kZWQgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShiYXNlNjRTdHJpbmdEZWNvZGVkLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0cmluZ0RlY29kZWQubGVuZ3RoOyBpKyspIHsKICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiYXNlNjRTdHJpbmdEZWNvZGVkLmNoYXJDb2RlQXQoaSk7CiAgICB9CiAgICByZXR1cm4gYmluYXJ5QXJyYXk7CiAgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgc3RyaW5nIGhlYWRlciB0byBKUyBvYmplY3QNCiAgICoNCiAgICogQHBhcmFtIHN0cmluZ0hlYWRlciBpbnB1dCBzdHJpbmcgaW4ganNvbiBmb3JtYXQNCiAgICogQHJldHVybiByZXRyaWV2ZWQgb2JqZWN0DQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZQogIGZ1bmN0aW9uIHN0cmluZ0hlYWRlclRvT2JqZWN0KHN0cmluZ0hlYWRlcikgewogICAgdmFyIG9iamVjdEhlYWRlciA9IHt9OwogICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEoc3RyaW5nSGVhZGVyLnNwbGl0KCdcclxuJykpLAogICAgICBfc3RlcDsKICAgIHRyeSB7CiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gX3N0ZXAudmFsdWU7CiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IHByb3BlcnR5LnNwbGl0KCc6ICcpOwogICAgICAgIGlmIChrZXlWYWx1ZVBhaXJbMF0gIT09ICcnKSB7CiAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICBvYmplY3RIZWFkZXJba2V5VmFsdWVQYWlyWzBdXSA9IGtleVZhbHVlUGFpclsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgIH0KICAgIHJldHVybiBvYmplY3RIZWFkZXI7CiAgfQogIC8qKg0KICAgKiBBIHdyYXBwZXIgdG8gZmV0Y2ggdGhhdCBhbHNvIHN1cHBvcnRzIHRpbWVvdXQNCiAgICoNCiAgICogQHBhcmFtIHVyaSB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZQ0KICAgKiBAcGFyYW0gb3B0aW9ucyBvdGhlciBvcHRpb25zIHJlbGF0ZWQgdG8gZmV0Y2gNCiAgICogQHBhcmFtIHRpbWUgdGltZW91dCB2YWx1ZQ0KICAgKiBAcmV0dXJuIHJlY2VpdmVkIHJlc3BvbnNlDQogICAqLwogIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoX3gpIHsKICAgIHJldHVybiBfZmV0Y2hXaXRoVGltZW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICAvKioNCiAgICogQ2hlY2tpbmcgd2hldGhlciB0aGUgZ2l2ZW4gQWNjZXNzS2V5IGlzIHZhbGlkDQogICAqDQogICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQWNjZXNzS2V5IGlzIHZhbGlkLCBmYWxzZSBpZiBub3QNCiAgICovCiAgZnVuY3Rpb24gX2ZldGNoV2l0aFRpbWVvdXQoKSB7CiAgICBfZmV0Y2hXaXRoVGltZW91dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKHVyaSkgewogICAgICB2YXIgb3B0aW9ucywKICAgICAgICB0aW1lLAogICAgICAgIGNvbnRyb2xsZXIsCiAgICAgICAgY29uZmlnLAogICAgICAgIHRpbWVvdXQsCiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgb3B0aW9ucyA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDoge307CiAgICAgICAgICAgIHRpbWUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IDUwMDA7CiAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7fSwgewogICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgICAgIH0sIHRpbWUpOwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKICAgICAgICAgICAgcmV0dXJuIGZldGNoKHVyaSwgY29uZmlnKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHJlc3BvbnNlKTsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2ZldGNoV2l0aFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpIHsKICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5ICE9PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgYWNjZXNzS2V5Q2xlYW5lZCA9IGFjY2Vzc0tleS50cmltKCk7CiAgICBpZiAoYWNjZXNzS2V5Q2xlYW5lZCA9PT0gJycpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdHJ5IHsKICAgICAgcmV0dXJuIGJ0b2EoYXRvYihhY2Nlc3NLZXlDbGVhbmVkKSkgPT09IGFjY2Vzc0tleUNsZWFuZWQ7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioNCiAgICogT3BlbnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHBhdGggYW5kIG1vZGUuDQogICAqIEByZXR1cm5zIFB2RmlsZSBpbnN0YW5jZS4NCiAgICovCiAgZnVuY3Rpb24gb3BlbihfeDIsIF94MykgewogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgaGVscGVyLg0KICAgKiBXcml0ZSBtb2RlbEJhc2U2NCB0byBtb2RlbFBhdGggZGVwZW5kaW5nIG9uIG9wdGlvbnMgZm9yY2VXcml0ZSBhbmQgdmVyc2lvbi4NCiAgICovCiAgZnVuY3Rpb24gX29wZW4oKSB7CiAgICBfb3BlbiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwYXRoLCBtb2RlKSB7CiAgICAgIHZhciBlcnJvcjsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAwOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBQdkZpbGVJREIub3BlbihwYXRoLCBtb2RlKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF9jb250ZXh0Mi5zZW50KTsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA2OwogICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbImNhdGNoIl0oMCk7CiAgICAgICAgICAgIGlmIChfY29udGV4dDIudDAubmFtZSA9PT0gJ0luZGV4ZWREQk5vdFN1cHBvcnRlZCcpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybignSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxiYWNrIHRvIGluLW1lbW9yeSBzdG9yYWdlLicpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9jb250ZXh0Mi50MC5uYW1lICE9PSAnRmlsZU5vdEV4aXN0cycpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVW5hYmxlIHRvIGFjY2VzcyBJbmRleGVkREIgKCIuY29uY2F0KF9jb250ZXh0Mi50MC50b1N0cmluZygpLCAiKS4gRmFsbGJhY2sgdG8gaW4tbWVtb3J5IHN0b3JhZ2UuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKAogICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgLy8gQHRzLWlnbm9yZQogICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDAubmFtZSA9PT0gJ0ZpbGVOb3RFeGlzdHMnKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgX2NvbnRleHQyLnQwOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW4tbWVtb3J5IHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgd29ya2VyLicpOwogICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcigiRmFpbGVkIHRvIHN0YXJ0IFB2RmlsZTogIi5jb25jYXQoX2NvbnRleHQyLnQwLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdQdkZpbGVOb3RTdXBwb3J0ZWQnOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBQdkZpbGVNZW0ub3BlbihwYXRoLCBtb2RlKSk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1swLCA2XV0pOwogICAgfSkpOwogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIGZyb21CYXNlNjQoX3g0LCBfeDUsIF94NiwgX3g3KSB7CiAgICByZXR1cm4gX2Zyb21CYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIF9mcm9tQmFzZSgpIHsKICAgIF9mcm9tQmFzZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhtb2RlbFBhdGgsIG1vZGVsQmFzZTY0LCBmb3JjZVdyaXRlLCB2ZXJzaW9uKSB7CiAgICAgIHZhciBwdkZpbGU7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuIG9wZW4obW9kZWxQYXRoLCAndycpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwdkZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgaWYgKCEoZm9yY2VXcml0ZSB8fCBwdkZpbGUubWV0YSA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPiBwdkZpbGUubWV0YS52ZXJzaW9uKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgIHJldHVybiBwdkZpbGUud3JpdGUoYmFzZTY0VG9VaW50OEFycmF5KG1vZGVsQmFzZTY0KSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbUJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgdmFyIEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUyA9IDUwMDA7CiAgdmFyIEJBQ0tPRkZfU1RBUlRfTUlMTElTRUNPTkRTID0gMjsKICAvKioNCiAgICogUHZGaWxlIGhlbHBlci4NCiAgICogV3JpdGUgcHVibGljUGF0aCdzIG1vZGVsIHRvIG1vZGVsUGF0aCBkZXBlbmRpbmcgb24gb3B0aW9ucyBmb3JjZVdyaXRlIGFuZCB2ZXJzaW9uLg0KICAgKi8KICBmdW5jdGlvbiBmcm9tUHVibGljRGlyZWN0b3J5KF94OCwgX3g5LCBfeDEwLCBfeDExLCBfeDEyKSB7CiAgICByZXR1cm4gX2Zyb21QdWJsaWNEaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgLyoqDQogICAqIFRha2VzIGEgUGljb3ZvaWNlIG1vZGVsIGZpbGUgYW5kIGVpdGhlciBkZWNvZGVzIGl0IGZyb20gYmFzZTY0IG9yIGZldGNoZXMNCiAgICogaXQgZnJvbSB0aGUgcHVibGljIGRpcmVjdG9yeS4gU2F2ZXMgdGhlIHJlc3VsdCB0byBzdG9yYWdlIG9uIHZlcnNpb24gaW5jcmVhc2Ugb3INCiAgICogaWYgZm9yY2VXcml0ZSBpcyBlbmFibGVkLg0KICAgKi8KICBmdW5jdGlvbiBfZnJvbVB1YmxpY0RpcmVjdG9yeSgpIHsKICAgIF9mcm9tUHVibGljRGlyZWN0b3J5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KG1vZGVsUGF0aCwgcHVibGljUGF0aCwgZm9yY2VXcml0ZSwgdmVyc2lvbiwgbnVtRmV0Y2hSZXRpZXMpIHsKICAgICAgdmFyIHB2RmlsZSwgd2FpdFRpbWVNaWxsaXNlY29uZHMsIGRlbGF5LCBudW1BdHRlbXB0c0xlZnQsIGVycm9yLCByZXNwb25zZSwgZGF0YSwgcmVzcG9uc2VUZXh0OwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgIHJldHVybiBvcGVuKG1vZGVsUGF0aCwgJ3cnKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHZGaWxlID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGlmICghKGZvcmNlV3JpdGUgfHwgcHZGaWxlLm1ldGEgPT09IHVuZGVmaW5lZCB8fCB2ZXJzaW9uID4gcHZGaWxlLm1ldGEudmVyc2lvbikpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG51bUZldGNoUmV0aWVzIDwgMCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ251bUZldGNoUmV0cmllcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHdhaXRUaW1lTWlsbGlzZWNvbmRzID0gQkFDS09GRl9TVEFSVF9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZGVsYXlNaWxsaXNlY29uZHMpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNaWxsaXNlY29uZHMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBudW1BdHRlbXB0c0xlZnQgPSBudW1GZXRjaFJldGllcyArIDE7CiAgICAgICAgICAgIGVycm9yID0gbnVsbDsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKG51bUF0dGVtcHRzTGVmdCA+IDApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAzODsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IG51bGw7CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMTI7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTU7CiAgICAgICAgICAgIHJldHVybiBmZXRjaChwdWJsaWNQYXRoLCB7CiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE5OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgcmV0dXJuIHB2RmlsZS53cml0ZShuZXcgVWludDhBcnJheShkYXRhKSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI1OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJFcnJvciByZXNwb25zZSByZXR1cm5lZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJzogIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjk7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgxMik7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggbW9kZWwgZnJvbSAnIi5jb25jYXQocHVibGljUGF0aCwgIic6ICIpLmNvbmNhdChfY29udGV4dDQudDAubWVzc2FnZSkpOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgbnVtQXR0ZW1wdHNMZWZ0LS07CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMzU7CiAgICAgICAgICAgIHJldHVybiBkZWxheSh3YWl0VGltZU1pbGxpc2Vjb25kcyk7CiAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICB3YWl0VGltZU1pbGxpc2Vjb25kcyA9IE1hdGgubWluKEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUywgd2FpdFRpbWVNaWxsaXNlY29uZHMgKiBCQUNLT0ZGX1NUQVJUX01JTExJU0VDT05EUyk7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgaWYgKCEoZXJyb3IgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA0MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJyIpKTsKICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzEyLCAyOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbVB1YmxpY0RpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBsb2FkTW9kZWwoX3gxMykgewogICAgcmV0dXJuIF9sb2FkTW9kZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gX2xvYWRNb2RlbCgpIHsKICAgIF9sb2FkTW9kZWwgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUobW9kZWwpIHsKICAgICAgdmFyIGJhc2U2NCwgcHVibGljUGF0aCwgY3VzdG9tV3JpdGVQYXRoLCBfbW9kZWwkZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSwgX21vZGVsJHZlcnNpb24sIHZlcnNpb24sIF9tb2RlbCRudW1GZXRjaFJldHJpZSwgbnVtRmV0Y2hSZXRyaWVzOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShtb2RlbCA9PT0gdW5kZWZpbmVkIHx8IG1vZGVsID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtb2RlbCBpcyB1bmRlZmluZWQgLyBlbXB0eScpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBiYXNlNjQgPSBtb2RlbC5iYXNlNjQsIHB1YmxpY1BhdGggPSBtb2RlbC5wdWJsaWNQYXRoLCBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGgsIF9tb2RlbCRmb3JjZVdyaXRlID0gbW9kZWwuZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSA9IF9tb2RlbCRmb3JjZVdyaXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9tb2RlbCRmb3JjZVdyaXRlLCBfbW9kZWwkdmVyc2lvbiA9IG1vZGVsLnZlcnNpb24sIHZlcnNpb24gPSBfbW9kZWwkdmVyc2lvbiA9PT0gdm9pZCAwID8gMSA6IF9tb2RlbCR2ZXJzaW9uLCBfbW9kZWwkbnVtRmV0Y2hSZXRyaWUgPSBtb2RlbC5udW1GZXRjaFJldHJpZXMsIG51bUZldGNoUmV0cmllcyA9IF9tb2RlbCRudW1GZXRjaFJldHJpZSA9PT0gdm9pZCAwID8gMCA6IF9tb2RlbCRudW1GZXRjaFJldHJpZTsKICAgICAgICAgICAgaWYgKCEoY3VzdG9tV3JpdGVQYXRoID09PSB1bmRlZmluZWQgfHwgY3VzdG9tV3JpdGVQYXRoID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjdXN0b21Xcml0ZVBhdGggb2YgdGhlIHByb3ZpZGVkIG1vZGVsIGlzIHVuZGVmaW5lZCAvIGVtcHR5Jyk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGlmICghKGJhc2U2NCAhPT0gdW5kZWZpbmVkICYmIGJhc2U2NCAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gODsKICAgICAgICAgICAgcmV0dXJuIGZyb21CYXNlNjQoY3VzdG9tV3JpdGVQYXRoLCBiYXNlNjQsIGZvcmNlV3JpdGUsIHZlcnNpb24pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKHB1YmxpY1BhdGggIT09IHVuZGVmaW5lZCAmJiBwdWJsaWNQYXRoICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMzsKICAgICAgICAgICAgcmV0dXJuIGZyb21QdWJsaWNEaXJlY3RvcnkoY3VzdG9tV3JpdGVQYXRoLCBwdWJsaWNQYXRoLCBmb3JjZVdyaXRlLCB2ZXJzaW9uLCBudW1GZXRjaFJldHJpZXMpOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcm92aWRlZCBtb2RlbCBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBwdWJsaWNQYXRoIG9yIGJhc2U2NCB2YWx1ZSIpOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIGN1c3RvbVdyaXRlUGF0aCk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2xvYWRNb2RlbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCwgYXJyb3ctYm9keS1zdHlsZTogMCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOiAwLCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzOiAwICovCiAgdmFyIHdhc2lTbmFwc2hvdFByZXZpZXcxRW11bGF0b3IgPSB7CiAgICBhcmdzX2dldDogZnVuY3Rpb24gYXJnc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IGZ1bmN0aW9uIGFyZ3Nfc2l6ZXNfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fZ2V0OiBmdW5jdGlvbiBlbnZpcm9uX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX3NpemVzX2dldDogZnVuY3Rpb24gZW52aXJvbl9zaXplc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogZnVuY3Rpb24gY2xvY2tfcmVzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja190aW1lX2dldDogZnVuY3Rpb24gY2xvY2tfdGltZV9nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiBmdW5jdGlvbiBmZF9hZHZpc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Nsb3NlOiBmdW5jdGlvbiBmZF9jbG9zZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9kYXRhc3luYzogZnVuY3Rpb24gZmRfZGF0YXN5bmMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogZnVuY3Rpb24gZmRfZmRzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X2ZsYWdzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X2ZsYWdzKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfcmlnaHRzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X3JpZ2h0cyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9nZXQ6IGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfc2l6ZTogZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IGZ1bmN0aW9uIGZkX3ByZWFkKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZ2V0OiBmdW5jdGlvbiBmZF9wcmVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2Rpcl9uYW1lOiBmdW5jdGlvbiBmZF9wcmVzdGF0X2Rpcl9uYW1lKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3B3cml0ZTogZnVuY3Rpb24gZmRfcHdyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlYWQ6IGZ1bmN0aW9uIGZkX3JlYWQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogZnVuY3Rpb24gZmRfcmVhZGRpcihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZW51bWJlcjogZnVuY3Rpb24gZmRfcmVudW1iZXIoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogZnVuY3Rpb24gZmRfc2VlayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zeW5jOiBmdW5jdGlvbiBmZF9zeW5jKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3RlbGw6IGZ1bmN0aW9uIGZkX3RlbGwoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IGZ1bmN0aW9uIGZkX3dyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfY3JlYXRlX2RpcmVjdG9yeTogZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfZ2V0OiBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X3NldF90aW1lczogZnVuY3Rpb24gcGF0aF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiBmdW5jdGlvbiBwYXRoX2xpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiBmdW5jdGlvbiBwYXRoX29wZW4oaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogZnVuY3Rpb24gcGF0aF9yZWFkbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbW92ZV9kaXJlY3Rvcnk6IGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbmFtZTogZnVuY3Rpb24gcGF0aF9yZW5hbWUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiBmdW5jdGlvbiBwYXRoX3N5bWxpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogZnVuY3Rpb24gcGF0aF91bmxpbmtfZmlsZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwb2xsX29uZW9mZjogZnVuY3Rpb24gcG9sbF9vbmVvZmYoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiBmdW5jdGlvbiBwcm9jX2V4aXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogZnVuY3Rpb24gcHJvY19yYWlzZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzY2hlZF95aWVsZDogZnVuY3Rpb24gc2NoZWRfeWllbGQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogZnVuY3Rpb24gcmFuZG9tX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3JlY3Y6IGZ1bmN0aW9uIHNvY2tfcmVjdihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NlbmQ6IGZ1bmN0aW9uIHNvY2tfc2VuZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NodXRkb3duOiBmdW5jdGlvbiBzb2NrX3NodXRkb3duKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH07CgogIC8qKg0KICAgKiBJbXBvcnRzIGFuZCBFeHBvcnRzIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgV0FTTS4NCiAgICoNCiAgICogQHBhcmFtIG1lbW9yeSBJbml0aWFsaXplZCBXZWJBc3NlbWJseSBtZW1vcnkgb2JqZWN0Lg0KICAgKiBAcGFyYW0gd2FzbSBUaGUgd2FzbSBmaWxlIGluIGJhc2U2NCBzdHJpbmcgb3Igc3RyZWFtIHRvIHB1YmxpYyBwYXRoIChpLmUuIGZldGNoKCJmaWxlLndhc20iKSkgdG8gaW5pdGlhbGl6ZS4NCiAgICogQHBhcmFtIHB2RXJyb3IgVGhlIFB2RXJyb3Igb2JqZWN0IHRvIHN0b3JlIGVycm9yIGRldGFpbHMuDQogICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBXQVNNLg0KICAgKi8KICBmdW5jdGlvbiBidWlsZFdhc20oX3gsIF94MiwgX3gzKSB7CiAgICByZXR1cm4gX2J1aWxkV2FzbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBfYnVpbGRXYXNtKCkgewogICAgX2J1aWxkV2FzbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlOShtZW1vcnksIHdhc20sIHB2RXJyb3IpIHsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkh0dHBzUmVxdWVzdFdhc20sIHB2R2V0QnJvd3NlckluZm8sIHB2R2V0T3JpZ2luSW5mbywgcHZGaWxlT3Blbldhc20sIHB2RmlsZUNsb3NlV2FzbSwgcHZGaWxlUmVhZFdhc20sIHB2RmlsZVdyaXRlV2FzbSwgcHZGaWxlU2Vla1dhc20sIHB2RmlsZVRlbGxXYXNtLCBwdkZpbGVSZW1vdmVXYXNtLCBpbXBvcnRPYmplY3QsIGluc3RhbmNlLCByZXNwb25zZSwgZGF0YSwgd2FzbUNvZGVBcnJheSwgYWxpZ25lZF9hbGxvYzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTkkKF9jb250ZXh0OSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgcHZDb25zb2xlTG9nV2FzbSA9IGZ1bmN0aW9uIHB2Q29uc29sZUxvZ1dhc20oaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBpbmRleCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkFzc2VydFdhc20gPSBmdW5jdGlvbiBwdkFzc2VydFdhc20oZXhwciwgbGluZSwgZmlsZU5hbWVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgaWYgKGV4cHIgPT09IDApIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBmaWxlTmFtZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgIi5jb25jYXQobGluZSwgIiBpbiBcIiIpLmNvbmNhdChmaWxlTmFtZSwgIlwiIikpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZUaW1lV2FzbSA9IGZ1bmN0aW9uIHB2VGltZVdhc20oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkh0dHBzUmVxdWVzdFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaHR0cE1ldGhvZEFkZHJlc3MsIHNlcnZlck5hbWVBZGRyZXNzLCBlbmRwb2ludEFkZHJlc3MsIGhlYWRlckFkZHJlc3MsIGJvZHlBZGRyZXNzLCB0aW1lb3V0TXMsIHJlc3BvbnNlQWRkcmVzc0FkZHJlc3MsIHJlc3BvbnNlU2l6ZUFkZHJlc3MsIHJlc3BvbnNlQ29kZUFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBodHRwTWV0aG9kLCBzZXJ2ZXJOYW1lLCBlbmRwb2ludCwgaGVhZGVyLCBib2R5LCBoZWFkZXJPYmplY3QsIHJlc3BvbnNlLCByZXNwb25zZVRleHQsIHN0YXR1c0NvZGUsIHJlc3BvbnNlQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBodHRwTWV0aG9kQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHNlcnZlck5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGVuZHBvaW50QWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaGVhZGVyQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGJvZHlBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck9iamVjdCA9IHN0cmluZ0hlYWRlclRvT2JqZWN0KGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoV2l0aFRpbWVvdXQoJ2h0dHBzOi8vJyArIHNlcnZlck5hbWUgKyBlbmRwb2ludCwgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGh0dHBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keQogICAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dE1zKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbImNhdGNoIl0oNik7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2SHR0cHNSZXF1ZXN0V2FzbScsICJGYWlsZWQgdG8gZmV0Y2g6ICIuY29uY2F0KF9jb250ZXh0LnQwKSk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0WyJjYXRjaCJdKDE3KTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZIdHRwc1JlcXVlc3RXYXNtJywgIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgdGV4dDogIi5jb25jYXQoX2NvbnRleHQudDEpKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChyZXNwb25zZVRleHQubGVuZ3RoICsgMSkgKiBJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzcG9uc2VBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdk1hbGxvY0Vycm9yJywgInB2SHR0cHNSZXF1ZXN0V2FzbTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UiKTsKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3Jlc3BvbnNlQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbcmVzcG9uc2VTaXplQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gcmVzcG9uc2VUZXh0Lmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUFkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSByZXNwb25zZUFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcG9uc2VUZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W3Jlc3BvbnNlQWRkcmVzcyArIGldID0gcmVzcG9uc2VUZXh0LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtyZXNwb25zZUFkZHJlc3MgKyByZXNwb25zZVRleHQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUNvZGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMTNdLCBbMTcsIDIzXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZIdHRwc1JlcXVlc3RXYXNtKF94NCwgX3g1LCBfeDYsIF94NywgX3g4LCBfeDksIF94MTAsIF94MTEsIF94MTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkdldEJyb3dzZXJJbmZvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoYnJvd3NlckluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHVzZXJBZ2VudCwgYnJvd3NlckluZm9BZGRyZXNzLCBpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICd1bmtub3duJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAodXNlckFnZW50Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgYnJvd3NlckluZm9BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShicm93c2VySW5mb0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2TWFsbG9jRXJyb3InLCAicHZHZXRCcm93c2VySW5mbzogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnJvd3NlciBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMlticm93c2VySW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW2Jyb3dzZXJJbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGJyb3dzZXJJbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VyQWdlbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYnJvd3NlckluZm9BZGRyZXNzICsgaV0gPSB1c2VyQWdlbnQuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2Jyb3dzZXJJbmZvQWRkcmVzcyArIHVzZXJBZ2VudC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZHZXRCcm93c2VySW5mbyhfeDEzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2R2V0T3JpZ2luSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKG9yaWdpbkluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIF9zZWxmJG9yaWdpbjsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW4sIGhvc3RuYW1lLCBvcmlnaW5JbmZvQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IChfc2VsZiRvcmlnaW4gPSBzZWxmLm9yaWdpbikgIT09IG51bGwgJiYgX3NlbGYkb3JpZ2luICE9PSB2b2lkIDAgPyBfc2VsZiRvcmlnaW4gOiBzZWxmLmxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChob3N0bmFtZS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkluZm9BZGRyZXNzID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmlnaW5JbmZvQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZNYWxsb2NFcnJvcicsICJwdkdldE9yaWdpbkluZm86IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yaWdpbiBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltvcmlnaW5JbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb3JpZ2luSW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBvcmlnaW5JbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0bmFtZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtvcmlnaW5JbmZvQWRkcmVzcyArIGldID0gaG9zdG5hbWUuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W29yaWdpbkluZm9BZGRyZXNzICsgaG9zdG5hbWUubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2R2V0T3JpZ2luSW5mbyhfeDE0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZU9wZW5XYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZmlsZUFkZHJlc3MsIHBhdGhBZGRyZXNzLCBtb2RlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHBhdGgsIG1vZGUsIGZpbGU7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgbW9kZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAyOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgUHZGaWxlLnNldFB0cihmaWxlQWRkcmVzcywgZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0NC50MC5uYW1lICE9PSAiRmlsZU5vdEV4aXN0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVPcGVuV2FzbScsIF9jb250ZXh0NC50MCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgMTBdXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVPcGVuV2FzbShfeDE1LCBfeDE2LCBfeDE3LCBfeDE4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZUNsb3NlV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGZpbGVBZGRyZXNzLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSA5OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gX2NvbnRleHQ1WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVDbG9zZVdhc20nLCBfY29udGV4dDUudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU1LCBudWxsLCBbWzAsIDldXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oX3gxOSwgX3gyMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5yZWFkKHNpemUsIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnByZXYgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MCA9IF9jb250ZXh0NlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlUmVhZFdhc20nLCBfY29udGV4dDYudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgbnVsbCwgW1swLCAxMV1dKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKF94MjEsIF94MjIsIF94MjMsIF94MjQsIF94MjUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlV3JpdGVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ3LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUud3JpdGUoY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBjb250ZW50Lmxlbmd0aCAvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcudDAgPSBfY29udGV4dDdbImNhdGNoIl0oMCk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVdyaXRlV2FzbScsIF9jb250ZXh0Ny50MCk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1Xcml0ZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU3LCBudWxsLCBbWzAsIDExXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlV3JpdGVXYXNtKF94MjYsIF94MjcsIF94MjgsIF94MjksIF94MzApIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlU2Vla1dhc20gPSBmdW5jdGlvbiBwdkZpbGVTZWVrV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0LCB3aGVuY2UsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlU2Vla1dhc20nLCBlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlVGVsbFdhc20gPSBmdW5jdGlvbiBwdkZpbGVUZWxsV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0QWRkcmVzcykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gZmlsZS50ZWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVUZWxsV2FzbScsIGUpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZW1vdmVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoLCBmaWxlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgucHJldiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlbihwYXRoLCAidyIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBfY29udGV4dDguc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5wcmV2ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgudDAgPSBfY29udGV4dDhbImNhdGNoIl0oMSk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVJlbW92ZVdhc20nLCBfY29udGV4dDgudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU4LCBudWxsLCBbWzEsIDEwXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlUmVtb3ZlV2FzbShfeDMxLCBfeDMyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIGltcG9ydE9iamVjdCA9IHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzaVNuYXBzaG90UHJldmlldzFFbXVsYXRvciwKICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgcHZfY29uc29sZV9sb2dfd2FzbTogcHZDb25zb2xlTG9nV2FzbSwKICAgICAgICAgICAgICAgIHB2X2Fzc2VydF93YXNtOiBwdkFzc2VydFdhc20sCiAgICAgICAgICAgICAgICBwdl90aW1lX3dhc206IHB2VGltZVdhc20sCiAgICAgICAgICAgICAgICBwdl9odHRwc19yZXF1ZXN0X3dhc206IHB2SHR0cHNSZXF1ZXN0V2FzbSwKICAgICAgICAgICAgICAgIHB2X2dldF9icm93c2VyX2luZm86IHB2R2V0QnJvd3NlckluZm8sCiAgICAgICAgICAgICAgICBwdl9nZXRfb3JpZ2luX2luZm86IHB2R2V0T3JpZ2luSW5mbywKICAgICAgICAgICAgICAgIHB2X2ZpbGVfb3Blbl93YXNtOiBwdkZpbGVPcGVuV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfY2xvc2Vfd2FzbTogcHZGaWxlQ2xvc2VXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9yZWFkX3dhc206IHB2RmlsZVJlYWRXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV93cml0ZV93YXNtOiBwdkZpbGVXcml0ZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3NlZWtfd2FzbTogcHZGaWxlU2Vla1dhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3RlbGxfd2FzbTogcHZGaWxlVGVsbFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlbW92ZV93YXNtOiBwdkZpbGVSZW1vdmVXYXNtCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoISh3YXNtIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyMDsKICAgICAgICAgICAgcmV0dXJuIGEod2FzbSwgaW1wb3J0T2JqZWN0KTsKICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgIGluc3RhbmNlID0gX2NvbnRleHQ5LnNlbnQuaW5zdGFuY2U7CiAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyNTsKICAgICAgICAgICAgcmV0dXJuIHdhc207CiAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDI4OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzMTsKICAgICAgICAgICAgcmV0dXJuIG4obmV3IFVpbnQ4QXJyYXkoZGF0YSksIGltcG9ydE9iamVjdCk7CiAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICBpbnN0YW5jZSA9IF9jb250ZXh0OS5zZW50Lmluc3RhbmNlOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICB3YXNtQ29kZUFycmF5ID0gYmFzZTY0VG9VaW50OEFycmF5KHdhc20pOwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM3OwogICAgICAgICAgICByZXR1cm4gbih3YXNtQ29kZUFycmF5LCBpbXBvcnRPYmplY3QpOwogICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dDkuc2VudC5pbnN0YW5jZTsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBpbnN0YW5jZS5leHBvcnRzKTsKICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU5KTsKICAgIH0pKTsKICAgIHJldHVybiBfYnVpbGRXYXNtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQyKGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwogIH0KCiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8sIG1pbkxlbikgewogICAgaWYgKCFvKSByZXR1cm47CiAgICBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQoKICAvKg0KICAgIENvcHlyaWdodCAyMDIzIFBpY292b2ljZSBJbmMuDQoKICAgIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlICJMSUNFTlNFIg0KICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uDQogICAgYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQogICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICB2YXIgUHZFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdkVycm9yKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZFcnJvcik7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21heE51bUVycm9ycyIsIDEwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfZXJyb3JzIiwgW10pOwogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgIl9sYXN0RXJyb3IiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RXJyb3IsIFt7CiAgICAgIGtleTogImFkZEVycm9yIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogU3RvcmUgYW4gZXJyb3Igd2l0aCBhIGtleSBhbmQgbWVzc2FnZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhZGRFcnJvcihrZXksIGVycm9yKSB7CiAgICAgICAgdGhpcy5fbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKTsKICAgICAgICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA+PSB0aGlzLl9tYXhOdW1FcnJvcnMpIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goewogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIG1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KGVycm9yKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IGFsbCByZWNlbnQgZXJyb3IgbWVzc2FnZXMuIENsZWFucyB1cCBlcnJvciBsaXN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9ycyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFcnJvcnMoKSB7CiAgICAgICAgdmFyIGVycm9ycyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLl9lcnJvcnMpOwogICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdOwogICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBHZXQgZXJyb3JzIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9yU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVycm9yU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ycygpLm1hcChmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LAogICAgICAgICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlOwogICAgICAgICAgcmV0dXJuICInIi5jb25jYXQoa2V5LCAiJyBmYWlsZWQgd2l0aDogIikuY29uY2F0KG1lc3NhZ2UsICIuIik7CiAgICAgICAgfSkuam9pbignXG4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhZGRlZCB0byB0aGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldExhc3RFcnJvciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXN0RXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBpdCBjYW4gc3RvcmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0TWF4RXJyb3JOdW0iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWF4RXJyb3JOdW0obnVtKSB7CiAgICAgICAgdGhpcy5fbWF4TnVtRXJyb3JzID0gbnVtOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZFcnJvcjsKICB9KCk7CgogIGNvbnN0IHNpbWQ9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkkMSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZiQxKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YkMSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMSh0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KICB2YXIgUFZfU1RBVFVTX1NVQ0NFU1MgPSAxMDAwMDsKICB2YXIgTUFYX1BDTV9MRU5HVEhfU0VDID0gNjAgKiAxNTsKICB2YXIgRWFnbGVCYXNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEVhZ2xlQmFzZShoYW5kbGVXYXNtKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlQmFzZSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZTdGF0dXNUb1N0cmluZyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfd2FzbU1lbW9yeSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfYWxpZ25lZEFsbG9jIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9wdkZyZWUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX21lbW9yeUJ1ZmZlciIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfbWVtb3J5QnVmZmVyVWludDgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX21lbW9yeUJ1ZmZlclZpZXciLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2Z1bmN0aW9uTXV0ZXgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2RXJyb3IiLCB2b2lkIDApOwogICAgICBFYWdsZUJhc2UuX3NhbXBsZVJhdGUgPSBoYW5kbGVXYXNtLnNhbXBsZVJhdGU7CiAgICAgIEVhZ2xlQmFzZS5fdmVyc2lvbiA9IGhhbmRsZVdhc20udmVyc2lvbjsKICAgICAgdGhpcy5fcHZTdGF0dXNUb1N0cmluZyA9IGhhbmRsZVdhc20ucHZTdGF0dXNUb1N0cmluZzsKICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IGhhbmRsZVdhc20ubWVtb3J5OwogICAgICB0aGlzLl9hbGlnbmVkQWxsb2MgPSBoYW5kbGVXYXNtLmFsaWduZWRBbGxvYzsKICAgICAgdGhpcy5fcHZGcmVlID0gaGFuZGxlV2FzbS5wdkZyZWU7CiAgICAgIHRoaXMuX3B2RXJyb3IgPSBoYW5kbGVXYXNtLnB2RXJyb3I7CiAgICAgIHRoaXMuX21lbW9yeUJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KGhhbmRsZVdhc20ubWVtb3J5LmJ1ZmZlcik7CiAgICAgIHRoaXMuX21lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoaGFuZGxlV2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgICAgdGhpcy5fbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhoYW5kbGVXYXNtLm1lbW9yeS5idWZmZXIpOwogICAgICB0aGlzLl9mdW5jdGlvbk11dGV4ID0gbmV3IE11dGV4KCk7CiAgICB9CiAgICAvKioNCiAgICAgKiBBdWRpbyBzYW1wbGUgcmF0ZSByZXF1aXJlZCBieSBFYWdsZS4NCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlQmFzZSwgW3sKICAgICAga2V5OiAic2FtcGxlUmF0ZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZUJhc2UuX3NhbXBsZVJhdGU7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBWZXJzaW9uIG9mIEVhZ2xlLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInZlcnNpb24iLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGVCYXNlLl92ZXJzaW9uOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogU2V0IGJhc2U2NCB3YXNtIGZpbGUuDQogICAgICAgKiBAcGFyYW0gd2FzbSBCYXNlNjQnZCB3YXNtIGZpbGUgdG8gdXNlIHRvIGluaXRpYWxpemUgd2FzbS4NCiAgICAgICAqLwogICAgfV0sIFt7CiAgICAgIGtleTogInNldFdhc20iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2FzbSh3YXNtKSB7CiAgICAgICAgaWYgKHRoaXMuX3dhc20gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fd2FzbSA9IHdhc207CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogU2V0IGJhc2U2NCB3YXNtIGZpbGUgd2l0aCBTSU1EIGZlYXR1cmUuDQogICAgICAgKiBAcGFyYW0gd2FzbVNpbWQgQmFzZTY0J2Qgd2FzbSBmaWxlIHRvIHVzZSB0byBpbml0aWFsaXplIHdhc20uDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0V2FzbVNpbWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2FzbVNpbWQod2FzbVNpbWQpIHsKICAgICAgICBpZiAodGhpcy5fd2FzbVNpbWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fd2FzbVNpbWQgPSB3YXNtU2ltZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2luaXRCYXNlV2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0QmFzZVdhc20yID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlKHdhc21CYXNlNjQsIHdhc21NZW1vcnlTaXplKSB7CiAgICAgICAgICB2YXIgbWVtb3J5LCBtZW1vcnlCdWZmZXJVaW50OCwgcHZFcnJvciwgZXhwb3J0cywgYWxpZ25lZF9hbGxvYywgcHZfZnJlZSwgcHZfZWFnbGVfdmVyc2lvbiwgcHZfc2FtcGxlX3JhdGUsIHB2X3N0YXR1c190b19zdHJpbmcsIHNhbXBsZVJhdGUsIHZlcnNpb25BZGRyZXNzLCB2ZXJzaW9uOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIC8vIEEgV2ViQXNzZW1ibHkgcGFnZSBoYXMgYSBjb25zdGFudCBzaXplIG9mIDY0S2lCLiAtPiAxTWlCIH49IDE2IHBhZ2VzCiAgICAgICAgICAgICAgICBtZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsKICAgICAgICAgICAgICAgICAgaW5pdGlhbDogd2FzbU1lbW9yeVNpemUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPSBuZXcgUHZFcnJvcigpOwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7CiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRXYXNtKG1lbW9yeSwgd2FzbUJhc2U2NCwgcHZFcnJvcik7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgZXhwb3J0cyA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICAgICAgICAgICAgcHZfZnJlZSA9IGV4cG9ydHMucHZfZnJlZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3ZlcnNpb24gPSBleHBvcnRzLnB2X2VhZ2xlX3ZlcnNpb247CiAgICAgICAgICAgICAgICBwdl9zYW1wbGVfcmF0ZSA9IGV4cG9ydHMucHZfc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICBwdl9zdGF0dXNfdG9fc3RyaW5nID0gZXhwb3J0cy5wdl9zdGF0dXNfdG9fc3RyaW5nOwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X3NhbXBsZV9yYXRlKCk7CiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3ZlcnNpb24oKTsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgdmVyc2lvbkFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgdmVyc2lvbiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCB2ZXJzaW9uQWRkcmVzcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgICBhbGlnbmVkQWxsb2M6IGFsaWduZWRfYWxsb2MsCiAgICAgICAgICAgICAgICAgIHB2RnJlZTogcHZfZnJlZSwKICAgICAgICAgICAgICAgICAgcHZFcnJvcjogcHZFcnJvciwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgcHZTdGF0dXNUb1N0cmluZzogcHZfc3RhdHVzX3RvX3N0cmluZywKICAgICAgICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIF9pbml0QmFzZVdhc20oX3gsIF94MikgewogICAgICAgICAgcmV0dXJuIF9pbml0QmFzZVdhc20yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdEJhc2VXYXNtOwogICAgICB9KCkKICAgIH1dKTsKICAgIHJldHVybiBFYWdsZUJhc2U7CiAgfSgpOwogIC8qKg0KICAgKiBKYXZhU2NyaXB0L1dlYkFzc2VtYmx5IGJpbmRpbmcgZm9yIHRoZSBwcm9maWxlciBvZiB0aGUgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBlbmdpbmUuDQogICAqIEl0IGVucm9sbHMgYSBzcGVha2VyIGdpdmVuIGEgc2V0IG9mIHV0dGVyYW5jZXMgYW5kIHRoZW4gY29uc3RydWN0cyBhIHByb2ZpbGUgZm9yIHRoZSBlbnJvbGxlZCBzcGVha2VyLg0KICAgKi8KICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfc2FtcGxlUmF0ZSIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX3ZlcnNpb24iLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl93YXNtIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfd2FzbVNpbWQiLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl9lYWdsZU11dGV4IiwgbmV3IE11dGV4KCkpOwogIHZhciBFYWdsZVByb2ZpbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWFnbGVCYXNlKSB7CiAgICBfaW5oZXJpdHMkMShFYWdsZVByb2ZpbGVyLCBfRWFnbGVCYXNlKTsKICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRWFnbGVQcm9maWxlcik7CiAgICBmdW5jdGlvbiBFYWdsZVByb2ZpbGVyKGhhbmRsZVdhc20pIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBFYWdsZVByb2ZpbGVyKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBoYW5kbGVXYXNtKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlckVucm9sbCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfcHZFYWdsZVByb2ZpbGVyRXhwb3J0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJSZXNldCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfb2JqZWN0QWRkcmVzcyIsIHZvaWQgMCk7CiAgICAgIEVhZ2xlUHJvZmlsZXIuX21pbkVucm9sbFNhbXBsZXMgPSBoYW5kbGVXYXNtLm1pbkVucm9sbFNhbXBsZXM7CiAgICAgIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplID0gaGFuZGxlV2FzbS5wcm9maWxlU2l6ZTsKICAgICAgRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcyA9IE1BWF9QQ01fTEVOR1RIX1NFQyAqIEVhZ2xlUHJvZmlsZXIuX3NhbXBsZVJhdGU7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9maWxlckRlbGV0ZTsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlckVucm9sbCA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyRW5yb2xsOwogICAgICBfdGhpcy5fcHZFYWdsZVByb2ZpbGVyRXhwb3J0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJFeHBvcnQ7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJSZXNldCA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyUmVzZXQ7CiAgICAgIF90aGlzLl9vYmplY3RBZGRyZXNzID0gaGFuZGxlV2FzbS5vYmplY3RBZGRyZXNzOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBUaGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGlucHV0IHBjbSByZXF1aXJlZCBieSBgLmVucm9sbCgpYC4NCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlUHJvZmlsZXIsIFt7CiAgICAgIGtleTogIm1pbkVucm9sbFNhbXBsZXMiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5fbWluRW5yb2xsU2FtcGxlczsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgcHJvZmlsZXIgY29tcG9uZW50IG9mIHRoZSBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIEVuZ2luZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0gYWNjZXNzS2V5IEFjY2Vzc0tleSBvYnRhaW5lZCBmcm9tIFBpY292b2ljZSBDb25zb2xlIChodHRwczovL2NvbnNvbGUucGljb3ZvaWNlLmFpLykuDQogICAgICAgKiBAcGFyYW0gbW9kZWwgRWFnbGUgbW9kZWwgb3B0aW9ucy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5iYXNlNjQgVGhlIG1vZGVsIGluIGJhc2U2NCBzdHJpbmcgdG8gaW5pdGlhbGl6ZSBFYWdsZS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5wdWJsaWNQYXRoIFRoZSBtb2RlbCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaWMgZGlyZWN0b3J5Lg0KICAgICAgICogQHBhcmFtIG1vZGVsLmN1c3RvbVdyaXRlUGF0aCBDdXN0b20gcGF0aCB0byBzYXZlIHRoZSBtb2RlbCBpbiBzdG9yYWdlLg0KICAgICAgICogU2V0IHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gdXNlIG11bHRpcGxlIG1vZGVscyBhY3Jvc3MgYGVhZ2xlYCBpbnN0YW5jZXMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuZm9yY2VXcml0ZSBGbGFnIHRvIG92ZXJ3cml0ZSB0aGUgbW9kZWwgaW4gc3RvcmFnZSBldmVuIGlmIGl0IGV4aXN0cy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC52ZXJzaW9uIFZlcnNpb24gb2YgdGhlIG1vZGVsIGZpbGUuIEluY3JlbWVudCB0byB1cGRhdGUgdGhlIG1vZGVsIGZpbGUgaW4gc3RvcmFnZS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBFYWdsZSBQcm9maWxlci4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJlbnJvbGwiLAogICAgICB2YWx1ZToKICAgICAgLyoqDQogICAgICAgKiBFbnJvbGxzIGEgc3BlYWtlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IHV0dGVyYW5jZXMgb2YgdGhlIHNhbWUgc3BlYWtlcg0KICAgICAgICogdW50aWwgYHBlcmNlbnRhZ2VgIHJlYWNoZXMgYDEwMC4wYCwgYXQgd2hpY2ggcG9pbnQgYSBzcGVha2VyIHZvaWNlIHByb2ZpbGUgY2FuIGJlIGV4cG9ydGVkIHVzaW5nIGAuZXhwb3J0KClgLg0KICAgICAgICogQW55IGZ1cnRoZXIgZW5yb2xsbWVudCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSBzcGVha2VyIHByb2ZpbGUuIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgcGNtIHRvDQogICAgICAgKiBgLmVucm9sbCgpYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBgLm1pbkVucm9sbFNhbXBsZXNgLg0KICAgICAgICogVGhlIGF1ZGlvIGRhdGEgdXNlZCBmb3IgZW5yb2xsbWVudCBzaG91bGQgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoNCiAgICAgICAqICAgIC0gb25seSBvbmUgc3BlYWtlciBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgYXVkaW8NCiAgICAgICAqICAgIC0gdGhlIHNwZWFrZXIgc2hvdWxkIGJlIHNwZWFraW5nIGluIGEgbm9ybWFsIHZvaWNlDQogICAgICAgKiAgICAtIHRoZSBhdWRpbyBzaG91bGQgY29udGFpbiBubyBzcGVlY2ggZnJvbSBvdGhlciBzcGVha2VycyBhbmQgbm8gb3RoZXIgc291bmRzIChlLmcuIG11c2ljKQ0KICAgICAgICogICAgLSBpdCBzaG91bGQgYmUgY2FwdHVyZWQgaW4gYSBxdWlldCBlbnZpcm9ubWVudCB3aXRoIG5vIGJhY2tncm91bmQgbm9pc2UNCiAgICAgICAqIEBwYXJhbSBwY20gQXVkaW8gZGF0YSBmb3IgZW5yb2xsbWVudC4gVGhlIGF1ZGlvIG5lZWRzIHRvIGhhdmUgYSBzYW1wbGUgcmF0ZSBlcXVhbCB0byBgLnNhbXBsZVJhdGVgIGFuZCBiZQ0KICAgICAgICogMTYtYml0IGxpbmVhcmx5LWVuY29kZWQuIEVhZ2xlUHJvZmlsZXIgb3BlcmF0ZXMgb24gc2luZ2xlLWNoYW5uZWwgYXVkaW8uDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBUaGUgcGVyY2VudGFnZSBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIHNwZWFrZXIgZW5yb2xsbWVudCBwcm9jZXNzIGFsb25nIHdpdGggdGhlIGZlZWRiYWNrIGNvZGUNCiAgICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgZW5yb2xsbWVudCBhdHRlbXB0Og0KICAgICAgICogICAgLSBgQVVESU9fT0tgOiBUaGUgYXVkaW8gaXMgZ29vZCBmb3IgZW5yb2xsbWVudC4NCiAgICAgICAqICAgIC0gYEFVRElPX1RPT19TSE9SVGA6IEF1ZGlvIGxlbmd0aCBpcyBpbnN1ZmZpY2llbnQgZm9yIGVucm9sbG1lbnQsDQogICAgICAgKiAgICAgICBpLmUuIGl0IGlzIHNob3J0ZXIgdGhhbmAubWluX2Vucm9sbF9zYW1wbGVzYC4NCiAgICAgICAqICAgIC0gYFVOS05PV05fU1BFQUtFUmA6IFRoZXJlIGlzIGFub3RoZXIgc3BlYWtlciBpbiB0aGUgYXVkaW8gdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlYWtlcg0KICAgICAgICogICAgICAgYmVpbmcgZW5yb2xsZWQuIFRvbyBtdWNoIGJhY2tncm91bmQgbm9pc2UgbWF5IGNhdXNlIHRoaXMgZXJyb3IgYXMgd2VsbC4NCiAgICAgICAqICAgIC0gYE5PX1ZPSUNFX0ZPVU5EYDogVGhlIGF1ZGlvIGRvZXMgbm90IGNvbnRhaW4gYW55IHZvaWNlLCBpLmUuIGl0IGlzIHNpbGVudCBvcg0KICAgICAgICogICAgICAgaGFzIGEgbG93IHNpZ25hbC10by1ub2lzZSByYXRpby4NCiAgICAgICAqICAgIC0gYFFVQUxJVFlfSVNTVUVgOiBUaGUgYXVkaW8gcXVhbGl0eSBpcyB0b28gbG93IGZvciBlbnJvbGxtZW50IGR1ZSB0byBhIGJhZCBtaWNyb3Bob25lDQogICAgICAgKiAgICAgICBvciByZWNvcmRpbmcgZW52aXJvbm1lbnQuDQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfZW5yb2xsID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhwY20pIHsKICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAocGNtIGluc3RhbmNlb2YgSW50MTZBcnJheSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYXJndW1lbnQgJ3BjbScgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBJbnQxNkFycmF5Iik7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgaWYgKCEocGNtLmxlbmd0aCA+IEVhZ2xlUHJvZmlsZXIuX21heEVucm9sbFNhbXBsZXMpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIidwY20nIHNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gIi5jb25jYXQoRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcykpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMi5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwY21BZGRyZXNzLCBtZW1vcnlCdWZmZXJJbnQxNiwgZmVlZGJhY2tBZGRyZXNzLCBwZXJjZW50YWdlQWRkcmVzcywgc3RhdHVzLCBmZWVkYmFjaywgcGVyY2VudGFnZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzMi5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5lbnJvbGwoKWAgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwY20ubGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwY21BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczIuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrQWRkcmVzcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZlZWRiYWNrQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZUFkZHJlc3MgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZXJjZW50YWdlQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkVhZ2xlUHJvZmlsZXJFbnJvbGwoX3RoaXMyLl9vYmplY3RBZGRyZXNzLCBwY21BZGRyZXNzLCBwY20ubGVuZ3RoLCBmZWVkYmFja0FkZHJlc3MsIHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwY21BZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShmZWVkYmFja0FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIudDEgPSAiZW5yb2xsIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MyA9IF90aGlzMi5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzMzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ0ID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ1ID0gKDAsIF9jb250ZXh0Mi50MikoX2NvbnRleHQyLnQzLCBfY29udGV4dDIudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50NiA9IF9jb250ZXh0Mi50MS5jb25jYXQuY2FsbChfY29udGV4dDIudDEsIF9jb250ZXh0Mi50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrID0gX3RoaXMyLl9tZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKGZlZWRiYWNrQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0MDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkZyZWUoZmVlZGJhY2tBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gX3RoaXMyLl9tZW1vcnlCdWZmZXJWaWV3LmdldEZsb2F0MzIocGVyY2VudGFnZUFkZHJlc3MsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2s6IGZlZWRiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZTogcGVyY2VudGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gZW5yb2xsKF94MykgewogICAgICAgICAgcmV0dXJuIF9lbnJvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVucm9sbDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogRXhwb3J0cyB0aGUgc3BlYWtlciBwcm9maWxlIG9mIHRoZSBjdXJyZW50IHNlc3Npb24uDQogICAgICAgKiBXaWxsIHRocm93IGVycm9yIGlmIHRoZSBwcm9maWxlIGlzIG5vdCByZWFkeS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEFuIEVhZ2xlUHJvZmlsZSBvYmplY3QuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAiZXhwb3J0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2V4cG9ydDIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KCkgewogICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMy5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9maWxlQWRkcmVzcywgc3RhdHVzLCBwcm9maWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLmV4cG9ydCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBFYWdsZVByb2ZpbGVyLl9wcm9maWxlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQoX3RoaXMzLl9vYmplY3RBZGRyZXNzLCBwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDExOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQxID0gImV4cG9ydCBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDMgPSBfdGhpczMuX21lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NCA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NSA9ICgwLCBfY29udGV4dDQudDIpKF9jb250ZXh0NC50MywgX2NvbnRleHQ0LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDYgPSBfY29udGV4dDQudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ0LnQxLCBfY29udGV4dDQudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDQudDAoX2NvbnRleHQ0LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gX3RoaXMzLl9tZW1vcnlCdWZmZXJVaW50OC5zbGljZShwcm9maWxlQWRkcmVzcyAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHByb2ZpbGVBZGRyZXNzIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTUpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfZXhwb3J0KCkgewogICAgICAgICAgcmV0dXJuIF9leHBvcnQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXhwb3J0OwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZW5yb2xsbWVudCBzZXNzaW9uLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3Jlc2V0ID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNygpIHsKICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczQuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0NikgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXM0Ll93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0KClgIGFmdGVyIHJlbGVhc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9wdkVhZ2xlUHJvZmlsZXJSZXNldChfdGhpczQuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IF90aGlzNC5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQ0ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQ1ID0gKDAsIF9jb250ZXh0Ni50MikoX2NvbnRleHQ2LnQzLCBfY29udGV4dDYudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NiA9IF9jb250ZXh0Ni50MS5jb25jYXQuY2FsbChfY29udGV4dDYudDEsIF9jb250ZXh0Ni50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Ni50MChfY29udGV4dDYudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU2KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU3KTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICByZXR1cm4gX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlIFByb2ZpbGVyDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlOCgpIHsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B2RWFnbGVQcm9maWxlckRlbGV0ZSh0aGlzLl9vYmplY3RBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fd2FzbU1lbW9yeTsKICAgICAgICAgICAgICAgIHRoaXMuX3dhc21NZW1vcnkgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTgsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWxlYXNlKCkgewogICAgICAgICAgcmV0dXJuIF9yZWxlYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWxlYXNlOwogICAgICB9KCkKICAgIH1dLCBbewogICAgICBrZXk6ICJjcmVhdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfY3JlYXRlID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlOShhY2Nlc3NLZXksIG1vZGVsKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU5JChfY29udGV4dDkpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ5LnByZXYgPSBfY29udGV4dDkubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aCA9IG1vZGVsLmN1c3RvbVdyaXRlUGF0aCA/IG1vZGVsLmN1c3RvbVdyaXRlUGF0aCA6ICdlYWdsZV9tb2RlbCc7CiAgICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZE1vZGVsKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW9kZWwpLCB7fSwgewogICAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGg6IGN1c3RvbVdyaXRlUGF0aAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIG1vZGVsUGF0aCA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5hYnJ1cHQoInJldHVybiIsIEVhZ2xlUHJvZmlsZXIuX2luaXQoYWNjZXNzS2V5LCBtb2RlbFBhdGgpKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlOSk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDQsIF94NSkgewogICAgICAgICAgcmV0dXJuIF9jcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTEoYWNjZXNzS2V5LCBtb2RlbFBhdGgpIHsKICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTEkKF9jb250ZXh0MTEpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMS5wcmV2ID0gX2NvbnRleHQxMS5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgaWYgKGlzQWNjZXNzS2V5VmFsaWQoYWNjZXNzS2V5KSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDExLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBY2Nlc3NLZXknKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMS5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGVQcm9maWxlci5fZWFnbGVNdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNTaW1kLCB3YXNtT3V0cHV0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEwJChfY29udGV4dDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEwLnByZXYgPSBfY29udGV4dDEwLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2ltZCA9IF9jb250ZXh0MTAuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFYWdsZVByb2ZpbGVyLl9pbml0UHJvZmlsZXJXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBpc1NpbWQgPyBfdGhpczUuX3dhc21TaW1kIDogX3RoaXM1Ll93YXNtKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21PdXRwdXQgPSBfY29udGV4dDEwLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuYWJydXB0KCJyZXR1cm4iLCBuZXcgRWFnbGVQcm9maWxlcih3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTEwKTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTEpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDYsIF94NykgewogICAgICAgICAgcmV0dXJuIF9pbml0Mi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2luaXQ7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdFByb2ZpbGVyV2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0UHJvZmlsZXJXYXNtMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEyKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwdl9lYWdsZV9wcm9maWxlcl9pbml0LCBwdl9lYWdsZV9wcm9maWxlcl9kZWxldGUsIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCwgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcywgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0LCBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZSwgcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQsIG9iamVjdEFkZHJlc3NBZGRyZXNzLCBhY2Nlc3NLZXlBZGRyZXNzLCBpLCBtb2RlbFBhdGhFbmNvZGVkLCBtb2RlbFBhdGhBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MsIF9tc2csIG1pbkVucm9sbFNhbXBsZXMsIHByb2ZpbGVTaXplQWRkcmVzcywgX21zZzIsIHByb2ZpbGVTaXplOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTIkKF9jb250ZXh0MTIpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMi5wcmV2ID0gX2NvbnRleHQxMi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZiQxKEVhZ2xlUHJvZmlsZXIpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzUwMCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfaW5pdCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfaW5pdDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZSA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9lbnJvbGw7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9leHBvcnQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZSA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemU7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9yZXNldCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0QWRkcmVzc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxODsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKGFjY2Vzc0tleS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICBhY2Nlc3NLZXlBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEoYWNjZXNzS2V5QWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjE7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2Nlc3NLZXkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYWNjZXNzS2V5QWRkcmVzcyArIGldID0gYWNjZXNzS2V5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgYWNjZXNzS2V5Lmxlbmd0aF0gPSAwOwogICAgICAgICAgICAgICAgbW9kZWxQYXRoRW5jb2RlZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtb2RlbFBhdGgpOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChtb2RlbFBhdGhFbmNvZGVkLmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgIG1vZGVsUGF0aEFkZHJlc3MgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShtb2RlbFBhdGhBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAyOTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KG1vZGVsUGF0aEVuY29kZWQsIG1vZGVsUGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbbW9kZWxQYXRoQWRkcmVzcyArIG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAzMzsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9wcm9maWxlcl9pbml0KGFjY2Vzc0tleUFkZHJlc3MsIG1vZGVsUGF0aEFkZHJlc3MsIG9iamVjdEFkZHJlc3NBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKGFjY2Vzc0tleUFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAzODsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUobW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDAgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2luaXQnIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MiA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNDQ7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NCA9ICgwLCBfY29udGV4dDEyLnQxKShfY29udGV4dDEyLnQyLCBfY29udGV4dDEyLnQzKTsKICAgICAgICAgICAgICAgIG1zZyA9IF9jb250ZXh0MTIudDAuY29uY2F0LmNhbGwoX2NvbnRleHQxMi50MCwgX2NvbnRleHQxMi50NCk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG1zZywgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJWaWV3ID0gbmV3IERhdGFWaWV3KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzcyA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0SW50MzIob2JqZWN0QWRkcmVzc0FkZHJlc3MsIHRydWUpOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTI7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKG9iamVjdEFkZHJlc3NBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTQ7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNTQ6CiAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA1NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDU3OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTk7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcyhvYmplY3RBZGRyZXNzLCBtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDcwOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDUgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMnIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNjY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgNjY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQ4ID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50OSA9ICgwLCBfY29udGV4dDEyLnQ2KShfY29udGV4dDEyLnQ3LCBfY29udGV4dDEyLnQ4KTsKICAgICAgICAgICAgICAgIF9tc2cgPSBfY29udGV4dDEyLnQ1LmNvbmNhdC5jYWxsKF9jb250ZXh0MTIudDUsIF9jb250ZXh0MTIudDkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChfbXNnLCAiXG5EZXRhaWxzOiAiKS5jb25jYXQoYmFzZVdhc21PdXRwdXQucHZFcnJvci5nZXRFcnJvclN0cmluZygpKSk7CiAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgIG1pbkVucm9sbFNhbXBsZXMgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDczOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgcHJvZmlsZVNpemVBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZVNpemVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3ODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gODA7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUob2JqZWN0QWRkcmVzcywgcHJvZmlsZVNpemVBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gOTE7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTAgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplJyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDExID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMiA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gODc7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgODc6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDE0ID0gKDAsIF9jb250ZXh0MTIudDExKShfY29udGV4dDEyLnQxMiwgX2NvbnRleHQxMi50MTMpOwogICAgICAgICAgICAgICAgX21zZzIgPSBfY29udGV4dDEyLnQxMC5jb25jYXQuY2FsbChfY29udGV4dDEyLnQxMCwgX2NvbnRleHQxMi50MTQpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChfbXNnMiwgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICBwcm9maWxlU2l6ZSA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0SW50MzIocHJvZmlsZVNpemVBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDk0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShwcm9maWxlU2l6ZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMi5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzOiBtaW5FbnJvbGxTYW1wbGVzLAogICAgICAgICAgICAgICAgICBwcm9maWxlU2l6ZTogcHJvZmlsZVNpemUsCiAgICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3M6IG9iamVjdEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlckRlbGV0ZTogcHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJFbnJvbGw6IHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCwKICAgICAgICAgICAgICAgICAgcHZFYWdsZVByb2ZpbGVyRXhwb3J0OiBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnQsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlclJlc2V0OiBwdl9lYWdsZV9wcm9maWxlcl9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTEyLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXRQcm9maWxlcldhc20oX3g4LCBfeDksIF94MTApIHsKICAgICAgICAgIHJldHVybiBfaW5pdFByb2ZpbGVyV2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0UHJvZmlsZXJXYXNtOwogICAgICB9KCkKICAgIH1dKTsKICAgIHJldHVybiBFYWdsZVByb2ZpbGVyOwogIH0oRWFnbGVCYXNlKTsKICAvKioNCiAgICogSmF2YVNjcmlwdC9XZWJBc3NlbWJseSBiaW5kaW5nIGZvciBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIGVuZ2luZS4NCiAgICogSXQgcHJvY2Vzc2VzIGluY29taW5nIGF1ZGlvIGluIGNvbnNlY3V0aXZlIGZyYW1lcyBhbmQgZW1pdHMgYSBzaW1pbGFyaXR5IHNjb3JlIGZvciBlYWNoIGVucm9sbGVkIHNwZWFrZXIuDQogICAqLwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlUHJvZmlsZXIsICJfbWF4RW5yb2xsU2FtcGxlcyIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVQcm9maWxlciwgIl9taW5FbnJvbGxTYW1wbGVzIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZVByb2ZpbGVyLCAiX3Byb2ZpbGVTaXplIiwgdm9pZCAwKTsKICB2YXIgRWFnbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FYWdsZUJhc2UyKSB7CiAgICBfaW5oZXJpdHMkMShFYWdsZSwgX0VhZ2xlQmFzZTIpOwogICAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoRWFnbGUpOwogICAgZnVuY3Rpb24gRWFnbGUoaGFuZGxlV2FzbSkgewogICAgICB2YXIgX3RoaXM2OwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBFYWdsZSk7CiAgICAgIF90aGlzNiA9IF9zdXBlcjIuY2FsbCh0aGlzLCBoYW5kbGVXYXNtKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfcHZFYWdsZURlbGV0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVQcm9jZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfcHZFYWdsZVJlc2V0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfb2JqZWN0QWRkcmVzcyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3Njb3Jlc0FkZHJlc3MiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9udW1TcGVha2VycyIsIHZvaWQgMCk7CiAgICAgIEVhZ2xlLl9mcmFtZUxlbmd0aCA9IGhhbmRsZVdhc20uZnJhbWVMZW5ndGg7CiAgICAgIF90aGlzNi5fcHZFYWdsZURlbGV0ZSA9IGhhbmRsZVdhc20ucHZFYWdsZURlbGV0ZTsKICAgICAgX3RoaXM2Ll9wdkVhZ2xlUHJvY2VzcyA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2Nlc3M7CiAgICAgIF90aGlzNi5fcHZFYWdsZVJlc2V0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUmVzZXQ7CiAgICAgIF90aGlzNi5fb2JqZWN0QWRkcmVzcyA9IGhhbmRsZVdhc20ub2JqZWN0QWRkcmVzczsKICAgICAgX3RoaXM2Ll9zY29yZXNBZGRyZXNzID0gaGFuZGxlV2FzbS5zY29yZXNBZGRyZXNzOwogICAgICBfdGhpczYuX251bVNwZWFrZXJzID0gaGFuZGxlV2FzbS5udW1TcGVha2VyczsKICAgICAgcmV0dXJuIF90aGlzNjsKICAgIH0KICAgIC8qKg0KICAgICAqIE51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBlciBmcmFtZSBleHBlY3RlZCBieSBFYWdsZSAoaS5lLiBsZW5ndGggb2YgdGhlIGFycmF5IHBhc3NlZCBpbnRvIGAucHJvY2VzcygpYCkNCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlLCBbewogICAgICBrZXk6ICJmcmFtZUxlbmd0aCIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZS5fZnJhbWVMZW5ndGg7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBQaWNvdm9pY2UgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBFbmdpbmUuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIGFjY2Vzc0tleTogQWNjZXNzS2V5IG9idGFpbmVkIGZyb20gUGljb3ZvaWNlIENvbnNvbGUgKGh0dHBzOi8vY29uc29sZS5waWNvdm9pY2UuYWkvKQ0KICAgICAgICogQHBhcmFtIG1vZGVsIEVhZ2xlIG1vZGVsIG9wdGlvbnMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuYmFzZTY0IFRoZSBtb2RlbCBpbiBiYXNlNjQgc3RyaW5nIHRvIGluaXRpYWxpemUgRWFnbGUuDQogICAgICAgKiBAcGFyYW0gbW9kZWwucHVibGljUGF0aCBUaGUgbW9kZWwgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGljIGRpcmVjdG9yeS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggQ3VzdG9tIHBhdGggdG8gc2F2ZSB0aGUgbW9kZWwgaW4gc3RvcmFnZS4NCiAgICAgICAqIFNldCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIHVzZSBtdWx0aXBsZSBtb2RlbHMgYWNyb3NzIGBlYWdsZWAgaW5zdGFuY2VzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmZvcmNlV3JpdGUgRmxhZyB0byBvdmVyd3JpdGUgdGhlIG1vZGVsIGluIHN0b3JhZ2UgZXZlbiBpZiBpdCBleGlzdHMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwudmVyc2lvbiBWZXJzaW9uIG9mIHRoZSBtb2RlbCBmaWxlLiBJbmNyZW1lbnQgdG8gdXBkYXRlIHRoZSBtb2RlbCBmaWxlIGluIHN0b3JhZ2UuDQogICAgICAgKiBAcGFyYW0gc3BlYWtlclByb2ZpbGVzIE9uZSBvciBtb3JlIEVhZ2xlIHNwZWFrZXIgcHJvZmlsZXMuIFRoZXNlIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyBgRWFnbGVQcm9maWxlcmAuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgRWFnbGUgZW5naW5lLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInByb2Nlc3MiLAogICAgICB2YWx1ZToKICAgICAgLyoqDQogICAgICAgKiBQcm9jZXNzZXMgYSBmcmFtZSBvZiBhdWRpbyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygc2ltaWxhcml0eSBzY29yZXMgZm9yIGVhY2ggc3BlYWtlciBwcm9maWxlLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBwY20gQSBmcmFtZSBvZiBhdWRpbyBzYW1wbGVzLiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lIGNhbiBiZSBhdHRhaW5lZCBieSBjYWxsaW5nDQogICAgICAgKiBgLmZyYW1lTGVuZ3RoYC4gVGhlIGluY29taW5nIGF1ZGlvIG5lZWRzIHRvIGhhdmUgYSBzYW1wbGUgcmF0ZSBlcXVhbCB0byBgLnNhbXBsZVJhdGVgIGFuZCBiZSAxNi1iaXQNCiAgICAgICAqIGxpbmVhcmx5LWVuY29kZWQuIEVhZ2xlIG9wZXJhdGVzIG9uIHNpbmdsZS1jaGFubmVsIGF1ZGlvLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIHNpbWlsYXJpdHkgc2NvcmVzIGZvciBlYWNoIHNwZWFrZXIgcHJvZmlsZS4gQSBoaWdoZXIgc2NvcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHZvaWNlDQogICAgICAgKiBiZWxvbmdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNwZWFrZXIuIFRoZSByYW5nZSBpcyBbMCwgMV0gd2l0aCAxLjAgcmVwcmVzZW50aW5nIGEgcGVyZmVjdCBtYXRjaC4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9wcm9jZXNzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTQocGNtKSB7CiAgICAgICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE0JChfY29udGV4dDE0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTQucHJldiA9IF9jb250ZXh0MTQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChwY20gaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYXJndW1lbnQgJ3BjbScgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBJbnQxNkFycmF5Iik7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgaWYgKCEocGNtLmxlbmd0aCAhPT0gRWFnbGUuX2ZyYW1lTGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTGVuZ3RoIG9mIGlucHV0IGZyYW1lICgiLmNvbmNhdChwY20ubGVuZ3RoLCAiKSBkb2VzIG5vdCBtYXRjaCByZXF1aXJlZCBmcmFtZSBsZW5ndGggKCIpLmNvbmNhdChFYWdsZS5fZnJhbWVMZW5ndGgsICIpIikpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczcuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTMoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBjbUFkZHJlc3MsIG1lbW9yeUJ1ZmZlckludDE2LCBzdGF0dXMsIHNjb3JlcywgaTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMyQoX2NvbnRleHQxMykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMy5wcmV2ID0gX2NvbnRleHQxMy5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczcuX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnByb2Nlc3NgIGFmdGVyIHJlbGVhc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNy5fYWxpZ25lZEFsbG9jKEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHBjbS5sZW5ndGggKiBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgIHBjbUFkZHJlc3MgPSBfY29udGV4dDEzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczcuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdkVhZ2xlUHJvY2VzcyhfdGhpczcuX29iamVjdEFkZHJlc3MsIHBjbUFkZHJlc3MsIF90aGlzNy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDEzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNy5fcHZGcmVlKHBjbUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAyMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MSA9ICJwcm9jZXNzIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQzID0gX3RoaXM3Ll9tZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50NCA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQ1ID0gKDAsIF9jb250ZXh0MTMudDIpKF9jb250ZXh0MTMudDMsIF9jb250ZXh0MTMudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDYgPSBfY29udGV4dDEzLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MTMudDEsIF9jb250ZXh0MTMudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDEzLnQwKF9jb250ZXh0MTMudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfdGhpczcuX251bVNwZWFrZXJzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3Jlcy5wdXNoKF90aGlzNy5fbWVtb3J5QnVmZmVyVmlldy5nZXRGbG9hdDMyKF90aGlzNy5fc2NvcmVzQWRkcmVzcyArIGkgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTMuYWJydXB0KCJyZXR1cm4iLCBzY29yZXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTMpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHByb2Nlc3MoX3gxMSkgewogICAgICAgICAgcmV0dXJuIF9wcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9jZXNzOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBlbmdpbmUuDQogICAgICAgKiBJdCBpcyBiZXN0IHRvIGNhbGwgYmVmb3JlIHByb2Nlc3NpbmcgYSBuZXcgc2VxdWVuY2Ugb2YgYXVkaW8gKGUuZy4gYSBuZXcgdm9pY2UgaW50ZXJhY3Rpb24pLg0KICAgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFjY3VyYWN5IG9mIHRoZSBlbmdpbmUgaXMgbm90IGFmZmVjdGVkIGJ5IGEgY2hhbmdlIGluIGF1ZGlvIGNvbnRleHQuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVzZXQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTYoKSB7CiAgICAgICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE2JChfY29udGV4dDE2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTYucHJldiA9IF9jb250ZXh0MTYubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczguX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTUoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1czsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNS5wcmV2ID0gX2NvbnRleHQxNS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczguX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0YCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczguX3B2RWFnbGVSZXNldChfdGhpczguX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxNS5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50MSA9ICJyZXNldCBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50MyA9IF90aGlzOC5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDQgPSBfY29udGV4dDE1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50NSA9ICgwLCBfY29udGV4dDE1LnQyKShfY29udGV4dDE1LnQzLCBfY29udGV4dDE1LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQ2ID0gX2NvbnRleHQxNS50MS5jb25jYXQuY2FsbChfY29udGV4dDE1LnQxLCBfY29udGV4dDE1LnQ1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX2NvbnRleHQxNS50MChfY29udGV4dDE1LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE1KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICAgIHJldHVybiBfcmVzZXQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkZyZWUodGhpcy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlRGVsZXRlKHRoaXMuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93YXNtTWVtb3J5OwogICAgICAgICAgICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE3LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbGVhc2U7CiAgICAgIH0oKQogICAgfV0sIFt7CiAgICAgIGtleTogImNyZWF0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9jcmVhdGUyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTgoYWNjZXNzS2V5LCBtb2RlbCwgc3BlYWtlclByb2ZpbGVzKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMzsKICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kZWwoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb2RlbCksIHt9LCB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aDogY3VzdG9tV3JpdGVQYXRoCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgbW9kZWxQYXRoID0gX2NvbnRleHQxOC5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguYWJydXB0KCJyZXR1cm4iLCBFYWdsZS5faW5pdChhY2Nlc3NLZXksIG1vZGVsUGF0aCwgIUFycmF5LmlzQXJyYXkoc3BlYWtlclByb2ZpbGVzKSA/IFtzcGVha2VyUHJvZmlsZXNdIDogc3BlYWtlclByb2ZpbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxOCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDEyLCBfeDEzLCBfeDE0KSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMjAoYWNjZXNzS2V5LCBtb2RlbFBhdGgsIHNwZWFrZXJQcm9maWxlcykgewogICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMCQoX2NvbnRleHQyMCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIwLnByZXYgPSBfY29udGV4dDIwLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAoaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFjY2Vzc0tleScpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKCFzcGVha2VyUHJvZmlsZXMgfHwgc3BlYWtlclByb2ZpbGVzLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNwZWFrZXIgcHJvZmlsZXMgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGUuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOS5wcmV2ID0gX2NvbnRleHQxOS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE5Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDE5LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOS5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGUuX2luaXRXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBzcGVha2VyUHJvZmlsZXMsIGlzU2ltZCA/IF90aGlzOS5fd2FzbVNpbWQgOiBfdGhpczkuX3dhc20pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU91dHB1dCA9IF9jb250ZXh0MTkuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5hYnJ1cHQoInJldHVybiIsIG5ldyBFYWdsZSh3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE5KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjAuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMjApOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDE1LCBfeDE2LCBfeDE3KSB7CiAgICAgICAgICByZXR1cm4gX2luaXQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdDsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0V2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgc3BlYWtlclByb2ZpbGVzLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZfZWFnbGVfaW5pdCwgcHZfZWFnbGVfZGVsZXRlLCBwdl9lYWdsZV9wcm9jZXNzLCBwdl9lYWdsZV9mcmFtZV9sZW5ndGgsIHB2X2VhZ2xlX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgbnVtU3BlYWtlcnMsIHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MsIHByb2ZpbGVzQWRkcmVzc0xpc3QsIF9pdGVyYXRvciwgX3N0ZXAsIHByb2ZpbGUsIHByb2ZpbGVBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgc2NvcmVzQWRkcmVzcywgZnJhbWVMZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMSQoX2NvbnRleHQyMSkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIxLnByZXYgPSBfY29udGV4dDIxLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mJDEoRWFnbGUpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzE1MCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2Nlc3MgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2Nlc3M7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9mcmFtZV9sZW5ndGggPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2ZyYW1lX2xlbmd0aDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Jlc2V0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9yZXNldDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzc0FkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3RBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAoYWNjZXNzS2V5Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgIGFjY2Vzc0tleUFkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShhY2Nlc3NLZXlBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjY2Vzc0tleS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgaV0gPSBhY2Nlc3NLZXkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBhY2Nlc3NLZXkubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhFbmNvZGVkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1vZGVsUGF0aCk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyNTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgbW9kZWxQYXRoQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1vZGVsUGF0aEFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDI4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQobW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFttb2RlbFBhdGhBZGRyZXNzICsgbW9kZWxQYXRoRW5jb2RlZC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzID0gc3BlYWtlclByb2ZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDMzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBudW1TcGVha2VycyAqIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICBwcm9maWxlc0FkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQyMS5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZXNBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNwZWFrZXJQcm9maWxlcyk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnByZXYgPSAzODsKICAgICAgICAgICAgICAgIF9pdGVyYXRvci5zKCk7CiAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDUxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwcm9maWxlLmJ5dGVzLmxlbmd0aCAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA0NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KHByb2ZpbGUuYnl0ZXMsIHByb2ZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QucHVzaChwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDU2OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDUzOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50MCA9IF9jb250ZXh0MjFbImNhdGNoIl0oMzgpOwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQyMS50MCk7CiAgICAgICAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDU2OwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLmZpbmlzaCg1Nik7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChuZXcgSW50MzJBcnJheShwcm9maWxlc0FkZHJlc3NMaXN0KSwgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjI7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBudW1TcGVha2VycywgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcywgb2JqZWN0QWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA2NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUoYWNjZXNzS2V5QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA3OTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnQxID0gIidwdl9lYWdsZV9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDMgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50NCA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDUgPSAoMCwgX2NvbnRleHQyMS50MikoX2NvbnRleHQyMS50MywgX2NvbnRleHQyMS50NCk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDIxLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MjEudDEsIF9jb250ZXh0MjEudDUpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDgzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG51bVNwZWFrZXJzICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHNjb3Jlc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgODg6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA5MDsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9mcmFtZV9sZW5ndGgoKTsKICAgICAgICAgICAgICBjYXNlIDkwOgogICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMS5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzOiBudW1TcGVha2VycywKICAgICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzczogb2JqZWN0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzczogc2NvcmVzQWRkcmVzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZURlbGV0ZTogcHZfZWFnbGVfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvY2VzczogcHZfZWFnbGVfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZVJlc2V0OiBwdl9lYWdsZV9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIxLCB0aGlzLCBbWzM4LCA1MywgNTYsIDU5XV0pOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdFdhc20oX3gxOCwgX3gxOSwgX3gyMCwgX3gyMSkgewogICAgICAgICAgcmV0dXJuIF9pbml0V2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0V2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGU7CiAgfShFYWdsZUJhc2UpOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlLCAiX2ZyYW1lTGVuZ3RoIiwgdm9pZCAwKTsKCiAgdmFyIHByb2ZpbGVyID0gbnVsbDsKICB2YXIgaW5pdFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVxdWVzdCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEocHJvZmlsZXIgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIHByb2ZpbGVyIGFscmVhZHkgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjsKICAgICAgICAgICAgRWFnbGVQcm9maWxlci5zZXRXYXNtKHJlcXVlc3Qud2FzbSk7CiAgICAgICAgICAgIEVhZ2xlUHJvZmlsZXIuc2V0V2FzbVNpbWQocmVxdWVzdC53YXNtU2ltZCk7CiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3OwogICAgICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5faW5pdChyZXF1ZXN0LmFjY2Vzc0tleSwgcmVxdWVzdC5tb2RlbFBhdGgpOwogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBwcm9maWxlciA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIG1pbkVucm9sbFNhbXBsZXM6IHByb2ZpbGVyLm1pbkVucm9sbFNhbXBsZXMsCiAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogcHJvZmlsZXIuc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICB2ZXJzaW9uOiBwcm9maWxlci52ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDExOwogICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzIsIDExXV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGluaXRSZXF1ZXN0KF94KSB7CiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgZW5yb2xsUmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHJlcXVlc3QpIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShwcm9maWxlciA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdFYWdsZSBwcm9maWxlciBub3QgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVyLmVucm9sbChyZXF1ZXN0LmlucHV0RnJhbWUpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDk7CiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsiY2F0Y2giXSgyKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6IF9jb250ZXh0Mi50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbMiwgOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiBlbnJvbGxSZXF1ZXN0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciBleHBvcnRSZXF1ZXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoKSB7CiAgICAgIHZhciBwcm9maWxlOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKHByb2ZpbGVyID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIHByb2ZpbGVyIG5vdCBpbml0aWFsaXplZCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMjsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA1OwogICAgICAgICAgICByZXR1cm4gcHJvZmlsZXJbImV4cG9ydCJdKCk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHByb2ZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIHByb2ZpbGU6IHByb2ZpbGUKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQzLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMywgbnVsbCwgW1syLCA5XV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIHJlc2V0UmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKHByb2ZpbGVyID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIG5vdCBpbml0aWFsaXplZCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICByZXR1cm4gcHJvZmlsZXIucmVzZXQoKTsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDg7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgyKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6IF9jb250ZXh0NC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgOF1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiByZXNldFJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIHJlbGVhc2VSZXF1ZXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUoKSB7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEocHJvZmlsZXIgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVyLnJlbGVhc2UoKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcHJvZmlsZXIgPSBudWxsOwogICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU1KTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiByZWxlYXNlUmVxdWVzdCgpIHsKICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICAvKioNCiAgICogRWFnbGUgcHJvZmlsZXIgd29ya2VyIGhhbmRsZXIuDQogICAqLwogIHNlbGYub25tZXNzYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYoZXZlbnQpIHsKICAgICAgdmFyIGV4cG9ydE1zZzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDYudDAgPSBldmVudC5kYXRhLmNvbW1hbmQ7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gX2NvbnRleHQ2LnQwID09PSAnaW5pdCcgPyAzIDogX2NvbnRleHQ2LnQwID09PSAnZW5yb2xsJyA/IDkgOiBfY29udGV4dDYudDAgPT09ICdleHBvcnQnID8gMTUgOiBfY29udGV4dDYudDAgPT09ICdyZXNldCcgPyAyMCA6IF9jb250ZXh0Ni50MCA9PT0gJ3JlbGVhc2UnID8gMjYgOiAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIF9jb250ZXh0Ni50MSA9IHNlbGY7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNjsKICAgICAgICAgICAgcmV0dXJuIGluaXRSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICBfY29udGV4dDYudDIgPSBfY29udGV4dDYuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ2LnQxLnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ2LnQxLCBfY29udGV4dDYudDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IHNlbGY7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTI7CiAgICAgICAgICAgIHJldHVybiBlbnJvbGxSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgX2NvbnRleHQ2LnQ0ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0Ni50My5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0Ni50MywgX2NvbnRleHQ2LnQ0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoImJyZWFrIiwgMzMpOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNzsKICAgICAgICAgICAgcmV0dXJuIGV4cG9ydFJlcXVlc3QoKTsKICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgIGV4cG9ydE1zZyA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGV4cG9ydE1zZywgW2V4cG9ydE1zZy5wcm9maWxlLmJ5dGVzLmJ1ZmZlcl0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICBfY29udGV4dDYudDUgPSBzZWxmOwogICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDIzOwogICAgICAgICAgICByZXR1cm4gcmVzZXRSZXF1ZXN0KCk7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDYudDYgPSBfY29udGV4dDYuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ2LnQ1LnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ2LnQ1LCBfY29udGV4dDYudDYpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICBfY29udGV4dDYudDcgPSBzZWxmOwogICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDI5OwogICAgICAgICAgICByZXR1cm4gcmVsZWFzZVJlcXVlc3QoKTsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0Ni50OCA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICBfY29udGV4dDYudDcucG9zdE1lc3NhZ2UuY2FsbChfY29udGV4dDYudDcsIF9jb250ZXh0Ni50OCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCJicmVhayIsIDMzKTsKICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdmYWlsZWQnLAogICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5yZWNvZ25pemVkIGNvbW1hbmQ6ICIuY29uY2F0KGV2ZW50LmRhdGEuY29tbWFuZCkKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNik7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gKF94MykgewogICAgICByZXR1cm4gX3JlZjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwoKfSkoKTsKCg==', null, false);
|
|
4173
|
+
var WorkerFactory$1 = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvciQxKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcCQxKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWVFeHBvcnRzID0ge307CiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0gewogICAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHM7IH0sCiAgICBzZXQgZXhwb3J0cyh2KXsgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzID0ge307CiAgdmFyIF90eXBlb2YkMiA9IHsKICAgIGdldCBleHBvcnRzKCl7IHJldHVybiBfdHlwZW9mRXhwb3J0czsgfSwKICAgIHNldCBleHBvcnRzKHYpeyBfdHlwZW9mRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogIAkgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgCSAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAJICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChfdHlwZW9mJDIpKTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0c1siZGVmYXVsdCJdOwogIAlmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogIAkgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgICByZXR1cm4gZXhwb3J0czsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIAkgIHZhciBleHBvcnRzID0ge30sCiAgCSAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgCSAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwKICAJICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogIAkgICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7CiAgCSAgICB9LAogIAkgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogIAkgICAgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIiwKICAJICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciIsCiAgCSAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAJICAgICAgdmFsdWU6IHZhbHVlLAogIAkgICAgICBlbnVtZXJhYmxlOiAhMCwKICAJICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAJICAgICAgd3JpdGFibGU6ICEwCiAgCSAgICB9KSwgb2JqW2tleV07CiAgCSAgfQogIAkgIHRyeSB7CiAgCSAgICBkZWZpbmUoe30sICIiKTsKICAJICB9IGNhdGNoIChlcnIpIHsKICAJICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CiAgCSAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwKICAJICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogIAkgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwogIAkgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgIl9pbnZva2UiLCB7CiAgCSAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgCSAgICB9KSwgZ2VuZXJhdG9yOwogIAkgIH0KICAJICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKQogIAkgICAgICB9OwogIAkgICAgfSBjYXRjaCAoZXJyKSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogInRocm93IiwKICAJICAgICAgICBhcmc6IGVycgogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBleHBvcnRzLndyYXAgPSB3cmFwOwogIAkgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAJICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQogIAkgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogIAkgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pOwogIAkgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogIAkgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAJICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgewogIAkgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIAkgICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsKICAJICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKICAJICAgICAgfSk7CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgCSAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgCSAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsCiAgCSAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAJICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgCSAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgCSAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogIAkgICAgICAgIH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CiAgCSAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAJICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgfSk7CiAgCSAgICAgIH0KICAJICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogIAkgICAgfQogIAkgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAJICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgc3RhdGUgPSAic3VzcGVuZGVkU3RhcnQiOwogIAkgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgewogIAkgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAJICAgICAgaWYgKCJjb21wbGV0ZWQiID09PSBzdGF0ZSkgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBtZXRob2QpIHRocm93IGFyZzsKICAJICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsKICAJICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogIAkgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogIAkgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgCSAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAJICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogIAkgICAgICAgICAgfQogIAkgICAgICAgIH0KICAJICAgICAgICBpZiAoIm5leHQiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKCJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB7CiAgCSAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogIAkgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CiAgCSAgICAgICAgfSBlbHNlICJyZXR1cm4iID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOwogIAkgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgCSAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOwogIAkgICAgICAgIGlmICgibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUpIHsKICAJICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgCSAgICAgICAgICByZXR1cm4gewogIAkgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAJICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIH0KICAJICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogIAkgICAgICB9CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLAogIAkgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAJICAgIGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yWyJyZXR1cm4iXSAmJiAoY29udGV4dC5tZXRob2QgPSAicmV0dXJuIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCAidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgfHwgInJldHVybiIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciICsgbWV0aG9kTmFtZSArICInIG1ldGhvZCIpKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CiAgCSAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgInJldHVybiIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgCSAgICB2YXIgZW50cnkgPSB7CiAgCSAgICAgIHRyeUxvYzogbG9jc1swXQogIAkgICAgfTsKICAJICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgCSAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAJICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogIAkgIH0KICAJICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogIAkgICAgaWYgKGl0ZXJhYmxlKSB7CiAgCSAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAJICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7CiAgCSAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBpID0gLTEsCiAgCSAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogIAkgICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogIAkgICAgICB9CiAgCSAgICB9CiAgCSAgICByZXR1cm4gewogIAkgICAgICBuZXh0OiBkb25lUmVzdWx0CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAJICAgICAgZG9uZTogITAKICAJICAgIH07CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgdmFyIGN0b3IgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogIAkgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgCSAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOwogIAkgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgCSAgICByZXR1cm4gewogIAkgICAgICBfX2F3YWl0OiBhcmcKICAJICAgIH07CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAJICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7CiAgCSAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7CiAgCSAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogIAkgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKICAJICAgIH0pOwogIAkgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogIAkgIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7CiAgCSAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksCiAgCSAgICAgIGtleXMgPSBbXTsKICAJICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpOwogIAkgICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgewogIAkgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgCSAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgCSAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAJICAgIH0sCiAgCSAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgewogIAkgICAgICB0aGlzLmRvbmUgPSAhMDsKICAJICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAJICAgICAgaWYgKCJ0aHJvdyIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgCSAgICB9LAogIAkgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgewogIAkgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgCSAgICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgCSAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgCSAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogIAkgICAgICAgIGlmICgicm9vdCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCAiY2F0Y2hMb2MiKSwKICAJICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwogIAkgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7CiAgCSAgICAgICAgICBicmVhazsKICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgICAgZmluYWxseUVudHJ5ICYmICgiYnJlYWsiID09PSB0eXBlIHx8ICJjb250aW51ZSIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7CiAgCSAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogIAkgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAJICAgIH0sCiAgCSAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogIAkgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiAiYnJlYWsiID09PSByZWNvcmQudHlwZSB8fCAiY29udGludWUiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiAicmV0dXJuIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0sCiAgCSAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogIAkgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgICByZXR1cm4gdGhyb3duOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAJICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgCSAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksCiAgCSAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAJICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgCSAgICAgIH0sICJuZXh0IiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0KICAJICB9LCBleHBvcnRzOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICAvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLgoKICB2YXIgcnVudGltZSQxID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZiQxKG8pIHsKICAgIF9nZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiQxKG8pOwogIH0KCiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mJDEob2JqZWN0KTsKICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0OwogIH0KCiAgZnVuY3Rpb24gX2dldCgpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsKICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0LmJpbmQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICBpZiAoIWJhc2UpIHJldHVybjsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwoYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiByZWNlaXZlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXNjLnZhbHVlOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICAgIG8uX19wcm90b19fID0gcDsKICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzJDEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZiQxKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKICB9CgogIGZ1bmN0aW9uIF90eXBlb2YkMShvYmopIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2YkMShvYmopOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMShzZWxmLCBjYWxsKSB7CiAgICBpZiAoY2FsbCAmJiAoX3R5cGVvZiQxKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUkMShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YkMShpbnB1dCkgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKF90eXBlb2YkMShyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5JDEoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlJDEoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gX3R5cGVvZiQxKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleSQxKGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSBfdG9Qcm9wZXJ0eUtleSQxKGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGNvbnN0IEVfQ0FOQ0VMRUQgPSBuZXcgRXJyb3IoJ3JlcXVlc3QgZm9yIGxvY2sgY2FuY2VsZWQnKTsKCiAgdmFyIF9fYXdhaXRlciQyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgICB9KTsKICB9OwogIGNsYXNzIFNlbWFwaG9yZSB7CiAgICAgIGNvbnN0cnVjdG9yKF92YWx1ZSwgX2NhbmNlbEVycm9yID0gRV9DQU5DRUxFRCkgewogICAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzID0gW107CiAgICAgICAgICB0aGlzLl93ZWlnaHRlZFdhaXRlcnMgPSBbXTsKICAgICAgfQogICAgICBhY3F1aXJlKHdlaWdodCA9IDEpIHsKICAgICAgICAgIGlmICh3ZWlnaHQgPD0gMCkKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2VpZ2h0ICR7d2VpZ2h0fTogbXVzdCBiZSBwb3NpdGl2ZWApOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdKQogICAgICAgICAgICAgICAgICB0aGlzLl93ZWlnaHRlZFF1ZXVlc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaywgd2VpZ2h0ID0gMSkgewogICAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUod2VpZ2h0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHdhaXRGb3JVbmxvY2sod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLnB1c2gocmVzb2x2ZSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIGlzTG9ja2VkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7CiAgICAgIH0KICAgICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgIH0KICAgICAgc2V0VmFsdWUodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIHJlbGVhc2Uod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICB0aGlzLl92YWx1ZSArPSB3ZWlnaHQ7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzLmZvckVhY2goKHF1ZXVlKSA9PiBxdWV1ZS5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSkpOwogICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRRdWV1ZXMgPSBbXTsKICAgICAgfQogICAgICBfZGlzcGF0Y2goKSB7CiAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBjb25zdCBxdWV1ZUVudHJ5ID0gKF9hID0gdGhpcy5fd2VpZ2h0ZWRRdWV1ZXNbd2VpZ2h0IC0gMV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zaGlmdCgpOwogICAgICAgICAgICAgIGlmICghcXVldWVFbnRyeSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX3ZhbHVlOwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzV2VpZ2h0ID0gd2VpZ2h0OwogICAgICAgICAgICAgIHRoaXMuX3ZhbHVlIC09IHdlaWdodDsKICAgICAgICAgICAgICB3ZWlnaHQgPSB0aGlzLl92YWx1ZSArIDE7CiAgICAgICAgICAgICAgcXVldWVFbnRyeS5yZXNvbHZlKFtwcmV2aW91c1ZhbHVlLCB0aGlzLl9uZXdSZWxlYXNlcihwcmV2aW91c1dlaWdodCldKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2RyYWluVW5sb2NrV2FpdGVycygpOwogICAgICB9CiAgICAgIF9uZXdSZWxlYXNlcih3ZWlnaHQpIHsKICAgICAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNhbGxlZCkKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHdlaWdodCk7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIF9kcmFpblVubG9ja1dhaXRlcnMoKSB7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKCkpOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgfQogICAgICB9CiAgfQoKICB2YXIgX19hd2FpdGVyJDEgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgIH0pOwogIH07CiAgY2xhc3MgTXV0ZXggewogICAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikgewogICAgICAgICAgdGhpcy5fc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxLCBjYW5jZWxFcnJvcik7CiAgICAgIH0KICAgICAgYWNxdWlyZSgpIHsKICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICBjb25zdCBbLCByZWxlYXNlcl0gPSB5aWVsZCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgpOwogICAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5ydW5FeGNsdXNpdmUoKCkgPT4gY2FsbGJhY2soKSk7CiAgICAgIH0KICAgICAgaXNMb2NrZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCk7CiAgICAgIH0KICAgICAgd2FpdEZvclVubG9jaygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUud2FpdEZvclVubG9jaygpOwogICAgICB9CiAgICAgIHJlbGVhc2UoKSB7CiAgICAgICAgICBpZiAodGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCkpCiAgICAgICAgICAgICAgdGhpcy5fc2VtYXBob3JlLnJlbGVhc2UoKTsKICAgICAgfQogICAgICBjYW5jZWwoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmNhbmNlbCgpOwogICAgICB9CiAgfQoKICBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7CiAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogIAlyZXR1cm4gZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwogIH0KCiAgdmFyIF90eXBlb2ZfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG9iaik7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIHZhciBfdHlwZW9mID0gX3R5cGVvZl8xWyJkZWZhdWx0Il07CiAgZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgICAgIHJldHVybiBleHBvcnRzOwogICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICAgIHZhciBleHBvcnRzID0ge30sCiAgICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksCiAgICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogICAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTsKICAgICAgfSwKICAgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogICAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiLAogICAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogICAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogICAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgIH0pLCBvYmpba2V5XTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGRlZmluZSh7fSwgIiIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsKICAgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsCiAgICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7CiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsICJfaW52b2tlIiwgewogICAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgICAgIH0pLCBnZW5lcmF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJ0aHJvdyIsCiAgICAgICAgICBhcmc6IGVycgogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMud3JhcCA9IHdyYXA7CiAgICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwogICAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogICAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLAogICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogICAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7CiAgICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsKICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkLCByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgICAgIH0KICAgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgIl9pbnZva2UiLCB7CiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICAgIHZhciBzdGF0ZSA9ICJzdXNwZW5kZWRTdGFydCI7CiAgICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsKICAgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgICBpZiAoImNvbXBsZXRlZCIgPT09IHN0YXRlKSB7CiAgICAgICAgICBpZiAoInRocm93IiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7CiAgICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7CiAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOwogICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCJuZXh0IiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmICgidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgewogICAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKICAgICAgICAgIH0gZWxzZSAicmV0dXJuIiA9PT0gY29udGV4dC5tZXRob2QgJiYgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CiAgICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCiAgICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKICAgICAgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZCwKICAgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsICJ0aHJvdyIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdICYmIChjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksICJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbWV0aG9kTmFtZSAmJiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBtZXRob2ROYW1lICsgIicgbWV0aG9kIikpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOwogICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKICAgICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsICJyZXR1cm4iICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpOwogICAgfQogICAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsKICAgICAgdmFyIGVudHJ5ID0gewogICAgICAgIHRyeUxvYzogbG9jc1swXQogICAgICB9OwogICAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHsKICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CiAgICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogICAgfQogICAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgewogICAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogICAgICAgIHRyeUxvYzogInJvb3QiCiAgICAgIH1dLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZSkgewogICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlOwogICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogICAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5leHQ6IGRvbmVSZXN1bHQKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICBkb25lOiAhMAogICAgICB9OwogICAgfQogICAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHZhciBjdG9yID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsKICAgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsKICAgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgX19hd2FpdDogYXJnCiAgICAgIH07CiAgICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsKICAgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOwogICAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpOwogICAgICB9KTsKICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBkZWZpbmUoR3AsICJ0b1N0cmluZyIsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogICAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLAogICAgICAgIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7CiAgICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgfTsKICAgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsCiAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7CiAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAgICAgfSwKICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICB0aGlzLmRvbmUgPSAhMDsKICAgICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogICAgICAgIGlmICgidGhyb3ciID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOwogICAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgICAgIH0sCiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKICAgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICBpZiAoInJvb3QiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpLAogICAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKICAgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHlFbnRyeSAmJiAoImJyZWFrIiA9PT0gdHlwZSB8fCAiY29udGludWUiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpOwogICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogICAgICB9LAogICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgICByZXR1cm4gImJyZWFrIiA9PT0gcmVjb3JkLnR5cGUgfHwgImNvbnRpbnVlIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogInJldHVybiIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSAicmV0dXJuIiwgdGhpcy5uZXh0ID0gImVuZCIpIDogIm5vcm1hbCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0sCiAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJjYXRjaCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogICAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAgICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAgICAgICAgIG5leHRMb2M6IG5leHRMb2MKICAgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KICAgIH0sIGV4cG9ydHM7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUgPSByZWdlbmVyYXRvclJ1bnRpbWUkMSgpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgY29uc3QgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIG5ldyBQcm94eSh0LHtnZXQ6KHQscik9PmUodFtyXSl9KX1jbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT12b2lkIDAsdGhpcy5leHBvcnRzPW51bGw7fWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKX1hc3NlcnROb25lU3RhdGUoKXtsZXQgdD10aGlzLmdldFN0YXRlKCk7aWYoMCE9PXQpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIHN0YXRlICR7dH0sIGV4cGVjdGVkIDAuYCl9d3JhcEltcG9ydEZuKHQpe3JldHVybiAoLi4uZSk9PntpZigyPT09dGhpcy5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKSx0aGlzLnZhbHVlO3RoaXMuYXNzZXJ0Tm9uZVN0YXRlKCk7bGV0IHI9dCguLi5lKTtpZighKHM9cil8fCJvYmplY3QiIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnRoZW4pcmV0dXJuIHI7dmFyIHM7dGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZCgxNiksdGhpcy52YWx1ZT1yO319d3JhcE1vZHVsZUltcG9ydHModCl7cmV0dXJuIGUodCx0PT4iZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLndyYXBJbXBvcnRGbih0KTp0KX13cmFwSW1wb3J0cyh0KXtpZih2b2lkIDAhPT10KXJldHVybiBlKHQsKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSk9PnRoaXMud3JhcE1vZHVsZUltcG9ydHModCkpfXdyYXBFeHBvcnRGbihlKXtsZXQgcj10LmdldChlKTtyZXR1cm4gdm9pZCAwIT09cnx8KHI9YXN5bmMoLi4udCk9Pnt0aGlzLmFzc2VydE5vbmVTdGF0ZSgpO2xldCByPWUoLi4udCk7Zm9yKDsxPT09dGhpcy5nZXRTdGF0ZSgpOyl0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKSx0aGlzLnZhbHVlPWF3YWl0IHRoaXMudmFsdWUsdGhpcy5hc3NlcnROb25lU3RhdGUoKSx0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfcmV3aW5kKDE2KSxyPWUoKTtyZXR1cm4gdGhpcy5hc3NlcnROb25lU3RhdGUoKSxyfSx0LnNldChlLHIpKSxyfXdyYXBFeHBvcnRzKGUpe2xldCByPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCB0IGluIGUpe2xldCBzPWVbdF07ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHQuc3RhcnRzV2l0aCgiYXN5bmNpZnlfIil8fChzPXRoaXMud3JhcEV4cG9ydEZuKHMpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocix0LHtlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KTt9cmV0dXJuIHQuc2V0KGUscikscn1pbml0KHQsZSl7Y29uc3R7ZXhwb3J0czpyfT10LG49ci5tZW1vcnl8fGUuZW52JiZlLmVudi5tZW1vcnk7bmV3IEludDMyQXJyYXkobi5idWZmZXIsMTYpLnNldChbMjQsMTAyNF0pLHRoaXMuZXhwb3J0cz10aGlzLndyYXBFeHBvcnRzKHIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LHMucHJvdG90eXBlKTt9fWNsYXNzIHMgZXh0ZW5kcyBXZWJBc3NlbWJseS5JbnN0YW5jZXtjb25zdHJ1Y3Rvcih0LGUpe2xldCBzPW5ldyByO3N1cGVyKHQscy53cmFwSW1wb3J0cyhlKSkscy5pbml0KHRoaXMsZSk7fWdldCBleHBvcnRzKCl7cmV0dXJuIHQuZ2V0KHN1cGVyLmV4cG9ydHMpfX1hc3luYyBmdW5jdGlvbiBuKHQsZSl7bGV0IHM9bmV3IHIsbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LHMud3JhcEltcG9ydHMoZSkpO3JldHVybiBzLmluaXQobiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP246bi5pbnN0YW5jZSxlKSxufWFzeW5jIGZ1bmN0aW9uIGEodCxlKXtsZXQgcz1uZXcgcixuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHQscy53cmFwSW1wb3J0cyhlKSk7cmV0dXJuIHMuaW5pdChuLmluc3RhbmNlLGUpLG59T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLCJleHBvcnRzIix7ZW51bWVyYWJsZTohMH0pOwoKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2Yob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmIChfdHlwZW9mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgewogICAgICByZXR1cm4gY2FsbDsKICAgIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsKICAgIH07CiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOwogIH0KCiAgZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9CiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfcGF0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21ldGEiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RmlsZSwgW3sKICAgICAga2V5OiAibWV0YSIsCiAgICAgIGdldDoKICAgICAgLyoqDQogICAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5fbWV0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCQxKHsKICAgICAgICAgIHZlcnNpb246IDAKICAgICAgICB9LCB0aGlzLl9tZXRhKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZGaWxlLCAiX2ZpbGVQdHJzIiwgbmV3IE1hcCgpKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDEoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQxKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBJbmRleGVkIERCIGNvbmZpZ3VyYXRpb25zDQogICAqLwogIHZhciBEQl9OQU1FID0gJ3B2X2RiJzsKICB2YXIgUFZfRklMRV9TVE9SRSA9ICdwdl9maWxlJzsKICB2YXIgREJfVkVSU0lPTiA9IDM7CiAgLyoqDQogICAqIEhlbHBlciB0byBnZXQgSW5kZXhlZERCLg0KICAgKi8KICBmdW5jdGlvbiBnZXREQigpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTsKICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgfTsKICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7CiAgICAgIH07CiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhQVl9GSUxFX1NUT1JFKSkgewogICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSk7CiAgICAgICAgfQogICAgICB9OwogICAgfSk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgSW5kZXhlZERCLg0KICAgKiBJbmRleGVkREIgaXMgUkVRVUlSRUQuDQogICAqLwogIHZhciBQdkZpbGVJREIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVJREIsIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQxKFB2RmlsZUlEQik7CiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3RvciBvZiBQdkZpbGUgaW5zdGFuY2UuDQogICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgYSBmaWxlLg0KICAgICAqIEBwYXJhbSBtZXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZS4NCiAgICAgKiBAcGFyYW0gZGIgVGhlIGRiIGluc3RhbmNlIGN1cnJlbnRseSByZWxhdGVkIHRvIHRoZSBvcGVuZWQgZmlsZS4NCiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSAtIGVpdGhlciByZWFkb25seSBvciByZWFkd3JpdGUuDQogICAgICovCiAgICBmdW5jdGlvbiBQdkZpbGVJREIocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlSURCKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BhZ2VTaXplIiwgNjU1MzYpOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfZGIiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlUHRyIiwgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlT2Zmc2V0IiwgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fZGIgPSBkYjsKICAgICAgX3RoaXMuX21vZGUgPSBtb2RlOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBPcGVucyBhIGZpbGUgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQdkZpbGUuIEEgZmlsZSBjYW4gYmUgb3BlbmVkIGluIHJlYWRvbmx5IG9yIHJlYWR3cml0ZSBtb2RlDQogICAgICogd2hpY2ggZm9sbG93cyBJbmRleGVkREIgc3RhbmRhcmQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyB2YWx1ZXMgdG8gdGhlIGRiLg0KICAgICAqIFRoZSBmaWxlIGlzIHN0b3JlZCBhcyBhbiBVaW50OEFycmF5IHNlcGFyYXRlZCBieSBwYWdlcy4NCiAgICAgKiBOT1RFOiBUaGUga2V5IGV4YWN0bHkgbWF0Y2hpbmcgdGhlIHBhdGggZXhwZWN0cyBhIHZhbHVlIG9mIHR5cGUgUHZGaWxlTWV0YS4NCiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBvcGVuIHN0b3JlZCBpbiBJbmRleGVkREIuDQogICAgICogQHBhcmFtIG1vZGUgQSBzdHJpbmcsIGlmIGl0IGNvbnRhaW5zICdyJyBpbiB0aGUgc3RyaW5nLCBpdCB3aWxsIG9wZW4gdGhlIGZpbGUgaW4gcmVhZG9ubHkgbW9kZSwgZWxzZSBpdA0KICAgICAqIHdpbGwgb3BlbiBpbiByZWFkd3JpdGUgbW9kZS4NCiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFB2RmlsZT4gQW4gaW5zdGFuY2Ugb2YgUHZGaWxlLg0KICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlSURCLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIENsb3NlcyB0aGUgZGIgY29ubmVjdGlvbi4gQW55IG90aGVyIGluc3RhbmNlIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3Qgd29yayBvbmNlDQogICAgICAgKiB0aGUgZGIgaXMgY2xvc2VkLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2Nsb3NlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgICAgICByZXR1cm4gX2Nsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbG9zZTsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVhZHMgYSB0b3RhbCBvZiAnY291bnQnIGVsZW1lbnRzLCBlYWNoIHdpdGggYSBzaXplIG9mICdzaXplJyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uDQogICAgICAgKiBNb3ZlcyB0aGUgc3RyZWFtIGJ5IHRoZSBhbW91bnQgb2YgZWxlbWVudHMgcmVhZC4NCiAgICAgICAqIElmIHRoZSBsYXN0IGZldyBieXRlcyBpcyBzbWFsbGVyIHRoYW4gJ3NpemUnIGl0IHdpbGwgbm90IHJlYWQgKHNpbWlsYXIgdG8gZnJlYWQpIHRoZSBieXRlcy4NCiAgICAgICAqIEBwYXJhbSBzaXplIFRoZSBlbGVtZW50IHNpemUuDQogICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkLg0KICAgICAgICogQHJldHVybnMgUHJvbWlzZTxVaW50OEFycmF5PiBBIFVpbnQ4QXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgY29waWVkIHRvIGl0Lg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVhZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzaXplLCBjb3VudCkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBpZiAoIV90aGlzMi5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIiciLmNvbmNhdChfdGhpczIuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDsKICAgICAgICAgICAgICAgICAgdmFyIG1heFRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgX3RoaXMyLl9tZXRhLnNpemUpOwogICAgICAgICAgICAgICAgICB2YXIgdG90YWxFbGVtcyA9IG1heFRvQ29weSAtIG1heFRvQ29weSAlIHNpemU7CiAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbEVsZW1zKTsKICAgICAgICAgICAgICAgICAgdmFyIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMi5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMyLl9wYWdlUHRyKSksICIiLmNvbmNhdChfdGhpczIuX3BhdGgsICItIikuY29uY2F0KFB2RmlsZUlEQi5jcmVhdGVQYWdlKF90aGlzMi5fbWV0YS5udW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gX3RoaXMyLl9zdG9yZTsKICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yIHx8IF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHRvdGFsRWxlbXMgLSBjb3BpZWQsIGN1cnNvci52YWx1ZS5sZW5ndGggLSBfdGhpczIuX3BhZ2VPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoY3Vyc29yLnZhbHVlLnNsaWNlKF90aGlzMi5fcGFnZU9mZnNldCwgX3RoaXMyLl9wYWdlT2Zmc2V0ICsgdG9Db3B5KSwgY29waWVkKTsKICAgICAgICAgICAgICAgICAgICBjb3BpZWQgKz0gdG9Db3B5OwogICAgICAgICAgICAgICAgICAgIF90aGlzMi5fcGFnZU9mZnNldCArPSB0b0NvcHk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5fcGFnZU9mZnNldCA9PT0gX3RoaXMyLl9wYWdlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlUHRyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczIuX3BhZ2VPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkIDwgdG90YWxFbGVtcykgewogICAgICAgICAgICAgICAgICAgICAgY3Vyc29yWyJjb250aW51ZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChzdG9yZS50cmFuc2FjdGlvbi5lcnJvcik7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShidWZmZXIuc2xpY2UoMCwgY29waWVkKSk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWFkKF94LCBfeDIpIHsKICAgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogV3JpdGVzIGFuIFVpbnQ4QXJyYXkgdG8gSW5kZXhlZERCIHNlcGVyYXRlZCBieSBwYWdlcy4NCiAgICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBieXRlcyB0byBzYXZlLg0KICAgICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgZmlsZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJ3cml0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF93cml0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjb250ZW50KSB7CiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICAgIHZhciB2ZXJzaW9uLAogICAgICAgICAgICBfYXJnczQgPSBhcmd1bWVudHM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2FyZ3M0Lmxlbmd0aCA+IDEgJiYgX2FyZ3M0WzFdICE9PSB1bmRlZmluZWQgPyBfYXJnczRbMV0gOiAxOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUsIGdldEN1cnJlbnRQYWdlLCBsYXN0LCBuZXdDb250ZW50LCBuZXdTaXplLCBuZXdNZXRhLCBwYWdlcywgaSwga2V5UmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl9tb2RlID09PSAicmVhZG9ubHkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkluc3RhbmNlIGlzIHJlYWRvbmx5IG1vZGUgb25seS4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIHZlcnNpb24gIT09ICJudW1iZXIiICYmIHZlcnNpb24gPD0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJWZXJzaW9uIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzMy5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiBnZXRDdXJyZW50UGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5nZXQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMzLl9wYWdlUHRyKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEucmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhyZXEucmVzdWx0LnNsaWNlKDAsIF90aGlzMy5fcGFnZU9mZnNldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMobmV3IFVpbnQ4QXJyYXkoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG5ldyBVaW50OEFycmF5KGxhc3QubGVuZ3RoICsgY29udGVudC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGxhc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGNvbnRlbnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gX3RoaXMzLl9wYWdlUHRyICogX3RoaXMzLl9wYWdlU2l6ZSArIG5ld0NvbnRlbnQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBuZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM6IE1hdGguY2VpbChuZXdTaXplIC8gX3RoaXMzLl9wYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3TWV0YSwgX3RoaXMzLl9wYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChuZXdDb250ZW50Lmxlbmd0aCAvIF90aGlzMy5fcGFnZVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3Q29udGVudC5zbGljZShpICogX3RoaXMzLl9wYWdlU2l6ZSwgKGkgKyAxKSAqIF90aGlzMy5fcGFnZVNpemUpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX3BhZ2VQdHIgKyBpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMzLmV4aXN0cygpICYmIG5ld01ldGEubnVtUGFnZXMgPCBfdGhpczMuX21ldGEubnVtUGFnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UobmV3TWV0YS5udW1QYWdlcykpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX21ldGEubnVtUGFnZXMpKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVsiZGVsZXRlIl0oa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0b3JlLnRyYW5zYWN0aW9uLmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczMuX21ldGEgPSBuZXdNZXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnNlZWsoMCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQsIF94NSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkpKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHdyaXRlKF94MykgewogICAgICAgICAgcmV0dXJuIF93cml0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGU7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gYnkgJ29mZnNldCcgZWxlbWVudHMgYXQgJ3doZW5jZScgcG9zaXRpb24uDQogICAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZS4NCiAgICAgICAqIEBwYXJhbSB3aGVuY2UgT25lIG9mOg0KICAgICAgICogIC0gMDogbW92ZXMgcG9zaXRpb24gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4NCiAgICAgICAqICAtIDE6IG1vdmVzIHBvc2l0aW9uIGZyb20gY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLg0KICAgICAgICogIC0gMjogbW92ZXMgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBmaWxlLg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDEpIHsKICAgICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fcGFnZVNpemUgKiB0aGlzLl9wYWdlUHRyICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKGN1cnJlbnRPZmZzZXQgKyBvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX21ldGEuc2l6ZSArIG9mZnNldCwgdGhpcy5fbWV0YS5zaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGFnZU9mZnNldCA9IG5ld09mZnNldCAlIHRoaXMuX3BhZ2VTaXplOwogICAgICAgIHRoaXMuX3BhZ2VQdHIgPSBNYXRoLmZsb29yKG5ld09mZnNldCAvIHRoaXMuX3BhZ2VTaXplKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidGVsbCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWxsKCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciAqIHRoaXMuX3BhZ2VTaXplICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJlbW92ZXMgYSBmaWxlIGFuZCBhbnkgcmVsYXRlZCBwYWdlcyBnaXZlbiB0aGUgcGF0aC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVtb3ZlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkgewogICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUGFnZXMsIGtleVJhbmdlLCBzdG9yZSwgcmVxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzID0gX3RoaXM0Ll9tZXRhLm51bVBhZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoX3RoaXM0Ll9wYXRoLCAiIi5jb25jYXQoX3RoaXM0Ll9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShudW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzNC5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID0gc3RvcmVbImRlbGV0ZSJdKGtleVJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fbWV0YSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fcGFnZU9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuX3BhZ2VQdHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94NykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpKSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbGxvd2luZyBwYXRoIGV4aXN0cy4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tZXRhICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc3RyZWFtIGlzIEVPRi4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfaXNFT0YiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciA+PSB0aGlzLl9tZXRhLm51bVBhZ2VzIC0gMSAmJiB0aGlzLl9wYWdlT2Zmc2V0ID49IHRoaXMuX21ldGEuc2l6ZSAlIHRoaXMuX3BhZ2VTaXplOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aGljaCBhcyBhIGtleSB0byBzYXZlIHBhZ2UgZGF0YSB0byBJbmRleGVkREIuDQogICAgICAgKiBUaGlzIGZvcm1hdHMgdGhlIGZpbGUgaW50byAwMDAwLCAwMDAxLCAwMDAyIC4uLg0KICAgICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgbnVtYmVyIHRvIGZvcm1hdC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfc3RvcmUiLAogICAgICBnZXQ6CiAgICAgIC8qKg0KICAgICAgICogR2V0cyBhIG9iamVjdFN0b3JlIGluc3RhbmNlIGZyb20gdGhlIFB2RmlsZSBpbnN0YW5jZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RiLnRyYW5zYWN0aW9uKFBWX0ZJTEVfU1RPUkUsIHRoaXMuX21vZGUpLm9iamVjdFN0b3JlKFBWX0ZJTEVfU1RPUkUpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICBpZiAoIXNlbGYuaW5kZXhlZERCKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICBlcnJvci5uYW1lID0gIkluZGV4ZWREQk5vdFN1cHBvcnRlZCI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZGIsIHJlcSwgX2Vycm9yMjsKICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0NykgewogICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnByZXYgPSAwOwogICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREQigpOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICBkYiA9IF9jb250ZXh0Ny5zZW50OwogICAgICAgICAgICAgICAgICByZXEgPSBkYi50cmFuc2FjdGlvbihQVl9GSUxFX1NUT1JFLCAicmVhZHdyaXRlIikub2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSkuZ2V0KHBhdGgpOwogICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHJlcS5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRiTW9kZSA9IG1vZGUuaW5jbHVkZXMoJ3InKSA/ICJyZWFkb25seSIgOiAicmVhZHdyaXRlIjsKICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PT0gdW5kZWZpbmVkICYmIGRiTW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9lcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgICAgICAgICAgICAgX2Vycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX2Vycm9yKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJREIgPSBuZXcgUHZGaWxlSURCKHBhdGgsIG1ldGEsIGRiLCBkYk1vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgICAgICAgICAgICAgIGZpbGVJREIuc2VlaygwLCAyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlSURCKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gOTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnQwID0gX2NvbnRleHQ3WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ3LnQwLm5hbWUgPT09ICJJbnZhbGlkU3RhdGVFcnJvciIpIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IyID0gbmV3IEVycm9yKCJJbmRleGVkREIgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgICAgICAgIF9lcnJvcjIubmFtZSA9ICJJbmRleGVkREJOb3RTdXBwb3J0ZWQiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChfZXJyb3IyKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NvbnRleHQ3LnQwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgX2NhbGxlZTcsIG51bGwsIFtbMCwgOV1dKTsKICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g4LCBfeDkpIHsKICAgICAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0oKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY3JlYXRlUGFnZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQYWdlKHBhZ2UpIHsKICAgICAgICByZXR1cm4gKCIwMDAiICsgcGFnZSkuc2xpY2UoLTQpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlSURCOwogIH0oUHZGaWxlKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMigpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BvcyIsIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdkZpbGVNZW0sIFt7CiAgICAgIGtleTogImNsb3NlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWFkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQoc2l6ZSwgY291bnQpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFT0YpIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgdGhpcy5fZmlsZS5sZW5ndGggLSB0aGlzLl9wb3MpOwogICAgICAgIHZhciB0b3RhbEVsZW1zID0gdG9Db3B5IC0gdG9Db3B5ICUgc2l6ZTsKICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxFbGVtcyk7CiAgICAgICAgYnVmZmVyLnNldCh0aGlzLl9maWxlLnNsaWNlKHRoaXMuX3BvcywgdGhpcy5fcG9zICsgdG90YWxFbGVtcyksIDApOwogICAgICAgIHRoaXMuX3BvcyArPSB0b3RhbEVsZW1zOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAid3JpdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoY29udGVudCkgewogICAgICAgIHZhciBuZXdGaWxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fcG9zICsgY29udGVudC5sZW5ndGgpOwogICAgICAgIGlmICh0aGlzLl9maWxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KHRoaXMuX2ZpbGUuc2xpY2UoMCwgdGhpcy5fcG9zKSk7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50LCB0aGlzLl9wb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgdGhpcy5fcG9zICs9IGNvbnRlbnQubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wb3M7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3JlbW92ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzWyJkZWxldGUiXSh0aGlzLl9wYXRoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3MgPSAwOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW1vdmU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgX2RlZmluZVByb3BlcnR5KFB2RmlsZU1lbSwgIl9tZW1GaWxlcyIsIG5ldyBNYXAoKSk7CgogIGZ1bmN0aW9uIG93bktleXMkMihvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMkMihPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzJDIoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bIkBAaXRlcmF0b3IiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB9CiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHBocmFzZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZw0KICAgKg0KICAgKiBAcGFyYW0gYXJyYXlCdWZmZXIgaW5wdXQgYXJyYXkgYnVmZmVyDQogICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGhyYXNlIGlzIHN0b3JlZA0KICAgKiBAcmV0dXJuIHJldHJpZXZlZCBzdHJpbmcNCiAgICovCiAgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgoYXJyYXlCdWZmZXIsIGluZGV4U3RhcnQpIHsKICAgIHZhciBpbmRleEVuZCA9IGluZGV4U3RhcnQ7CiAgICB3aGlsZSAoYXJyYXlCdWZmZXJbaW5kZXhFbmRdICE9PSAwKSB7CiAgICAgIGluZGV4RW5kKys7CiAgICB9CiAgICB2YXIgdXRmOGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04Jyk7CiAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKGFycmF5QnVmZmVyLnN1YmFycmF5KGluZGV4U3RhcnQsIGluZGV4RW5kKSk7CiAgfQogIC8qKg0KICAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFuZCBzdG9yZWQgaXQgaW4gYSBVaW50OEFycmF5IGFycmF5DQogICAqDQogICAqIEBwYXJhbSBiYXNlNjRTdHJpbmcgaW5wdXQgYmFzZTY0IHN0cmluZw0KICAgKiBAcmV0dXJuIGRlY29kZWQgYXJyYXkNCiAgICovCiAgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykgewogICAgdmFyIGJhc2U2NFN0cmluZ0RlY29kZWQgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShiYXNlNjRTdHJpbmdEZWNvZGVkLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0cmluZ0RlY29kZWQubGVuZ3RoOyBpKyspIHsKICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiYXNlNjRTdHJpbmdEZWNvZGVkLmNoYXJDb2RlQXQoaSk7CiAgICB9CiAgICByZXR1cm4gYmluYXJ5QXJyYXk7CiAgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgc3RyaW5nIGhlYWRlciB0byBKUyBvYmplY3QNCiAgICoNCiAgICogQHBhcmFtIHN0cmluZ0hlYWRlciBpbnB1dCBzdHJpbmcgaW4ganNvbiBmb3JtYXQNCiAgICogQHJldHVybiByZXRyaWV2ZWQgb2JqZWN0DQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZQogIGZ1bmN0aW9uIHN0cmluZ0hlYWRlclRvT2JqZWN0KHN0cmluZ0hlYWRlcikgewogICAgdmFyIG9iamVjdEhlYWRlciA9IHt9OwogICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEoc3RyaW5nSGVhZGVyLnNwbGl0KCdcclxuJykpLAogICAgICBfc3RlcDsKICAgIHRyeSB7CiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gX3N0ZXAudmFsdWU7CiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IHByb3BlcnR5LnNwbGl0KCc6ICcpOwogICAgICAgIGlmIChrZXlWYWx1ZVBhaXJbMF0gIT09ICcnKSB7CiAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICBvYmplY3RIZWFkZXJba2V5VmFsdWVQYWlyWzBdXSA9IGtleVZhbHVlUGFpclsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgIH0KICAgIHJldHVybiBvYmplY3RIZWFkZXI7CiAgfQogIC8qKg0KICAgKiBBIHdyYXBwZXIgdG8gZmV0Y2ggdGhhdCBhbHNvIHN1cHBvcnRzIHRpbWVvdXQNCiAgICoNCiAgICogQHBhcmFtIHVyaSB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZQ0KICAgKiBAcGFyYW0gb3B0aW9ucyBvdGhlciBvcHRpb25zIHJlbGF0ZWQgdG8gZmV0Y2gNCiAgICogQHBhcmFtIHRpbWUgdGltZW91dCB2YWx1ZQ0KICAgKiBAcmV0dXJuIHJlY2VpdmVkIHJlc3BvbnNlDQogICAqLwogIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoX3gpIHsKICAgIHJldHVybiBfZmV0Y2hXaXRoVGltZW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICAvKioNCiAgICogQ2hlY2tpbmcgd2hldGhlciB0aGUgZ2l2ZW4gQWNjZXNzS2V5IGlzIHZhbGlkDQogICAqDQogICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQWNjZXNzS2V5IGlzIHZhbGlkLCBmYWxzZSBpZiBub3QNCiAgICovCiAgZnVuY3Rpb24gX2ZldGNoV2l0aFRpbWVvdXQoKSB7CiAgICBfZmV0Y2hXaXRoVGltZW91dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKHVyaSkgewogICAgICB2YXIgb3B0aW9ucywKICAgICAgICB0aW1lLAogICAgICAgIGNvbnRyb2xsZXIsCiAgICAgICAgY29uZmlnLAogICAgICAgIHRpbWVvdXQsCiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgb3B0aW9ucyA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDoge307CiAgICAgICAgICAgIHRpbWUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IDUwMDA7CiAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7fSwgewogICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgICAgIH0sIHRpbWUpOwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKICAgICAgICAgICAgcmV0dXJuIGZldGNoKHVyaSwgY29uZmlnKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHJlc3BvbnNlKTsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2ZldGNoV2l0aFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpIHsKICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5ICE9PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgYWNjZXNzS2V5Q2xlYW5lZCA9IGFjY2Vzc0tleS50cmltKCk7CiAgICBpZiAoYWNjZXNzS2V5Q2xlYW5lZCA9PT0gJycpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdHJ5IHsKICAgICAgcmV0dXJuIGJ0b2EoYXRvYihhY2Nlc3NLZXlDbGVhbmVkKSkgPT09IGFjY2Vzc0tleUNsZWFuZWQ7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioNCiAgICogT3BlbnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHBhdGggYW5kIG1vZGUuDQogICAqIEByZXR1cm5zIFB2RmlsZSBpbnN0YW5jZS4NCiAgICovCiAgZnVuY3Rpb24gb3BlbihfeDIsIF94MykgewogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgaGVscGVyLg0KICAgKiBXcml0ZSBtb2RlbEJhc2U2NCB0byBtb2RlbFBhdGggZGVwZW5kaW5nIG9uIG9wdGlvbnMgZm9yY2VXcml0ZSBhbmQgdmVyc2lvbi4NCiAgICovCiAgZnVuY3Rpb24gX29wZW4oKSB7CiAgICBfb3BlbiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwYXRoLCBtb2RlKSB7CiAgICAgIHZhciBlcnJvcjsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAwOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBQdkZpbGVJREIub3BlbihwYXRoLCBtb2RlKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF9jb250ZXh0Mi5zZW50KTsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA2OwogICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbImNhdGNoIl0oMCk7CiAgICAgICAgICAgIGlmIChfY29udGV4dDIudDAubmFtZSA9PT0gJ0luZGV4ZWREQk5vdFN1cHBvcnRlZCcpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybignSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxiYWNrIHRvIGluLW1lbW9yeSBzdG9yYWdlLicpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9jb250ZXh0Mi50MC5uYW1lICE9PSAnRmlsZU5vdEV4aXN0cycpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVW5hYmxlIHRvIGFjY2VzcyBJbmRleGVkREIgKCIuY29uY2F0KF9jb250ZXh0Mi50MC50b1N0cmluZygpLCAiKS4gRmFsbGJhY2sgdG8gaW4tbWVtb3J5IHN0b3JhZ2UuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKAogICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgLy8gQHRzLWlnbm9yZQogICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDAubmFtZSA9PT0gJ0ZpbGVOb3RFeGlzdHMnKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgX2NvbnRleHQyLnQwOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW4tbWVtb3J5IHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgd29ya2VyLicpOwogICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcigiRmFpbGVkIHRvIHN0YXJ0IFB2RmlsZTogIi5jb25jYXQoX2NvbnRleHQyLnQwLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdQdkZpbGVOb3RTdXBwb3J0ZWQnOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBQdkZpbGVNZW0ub3BlbihwYXRoLCBtb2RlKSk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1swLCA2XV0pOwogICAgfSkpOwogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIGZyb21CYXNlNjQoX3g0LCBfeDUsIF94NiwgX3g3KSB7CiAgICByZXR1cm4gX2Zyb21CYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIF9mcm9tQmFzZSgpIHsKICAgIF9mcm9tQmFzZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhtb2RlbFBhdGgsIG1vZGVsQmFzZTY0LCBmb3JjZVdyaXRlLCB2ZXJzaW9uKSB7CiAgICAgIHZhciBwdkZpbGU7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuIG9wZW4obW9kZWxQYXRoLCAndycpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwdkZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgaWYgKCEoZm9yY2VXcml0ZSB8fCBwdkZpbGUubWV0YSA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPiBwdkZpbGUubWV0YS52ZXJzaW9uKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgIHJldHVybiBwdkZpbGUud3JpdGUoYmFzZTY0VG9VaW50OEFycmF5KG1vZGVsQmFzZTY0KSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbUJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgdmFyIEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUyA9IDUwMDA7CiAgdmFyIEJBQ0tPRkZfU1RBUlRfTUlMTElTRUNPTkRTID0gMjsKICAvKioNCiAgICogUHZGaWxlIGhlbHBlci4NCiAgICogV3JpdGUgcHVibGljUGF0aCdzIG1vZGVsIHRvIG1vZGVsUGF0aCBkZXBlbmRpbmcgb24gb3B0aW9ucyBmb3JjZVdyaXRlIGFuZCB2ZXJzaW9uLg0KICAgKi8KICBmdW5jdGlvbiBmcm9tUHVibGljRGlyZWN0b3J5KF94OCwgX3g5LCBfeDEwLCBfeDExLCBfeDEyKSB7CiAgICByZXR1cm4gX2Zyb21QdWJsaWNEaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgLyoqDQogICAqIFRha2VzIGEgUGljb3ZvaWNlIG1vZGVsIGZpbGUgYW5kIGVpdGhlciBkZWNvZGVzIGl0IGZyb20gYmFzZTY0IG9yIGZldGNoZXMNCiAgICogaXQgZnJvbSB0aGUgcHVibGljIGRpcmVjdG9yeS4gU2F2ZXMgdGhlIHJlc3VsdCB0byBzdG9yYWdlIG9uIHZlcnNpb24gaW5jcmVhc2Ugb3INCiAgICogaWYgZm9yY2VXcml0ZSBpcyBlbmFibGVkLg0KICAgKi8KICBmdW5jdGlvbiBfZnJvbVB1YmxpY0RpcmVjdG9yeSgpIHsKICAgIF9mcm9tUHVibGljRGlyZWN0b3J5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KG1vZGVsUGF0aCwgcHVibGljUGF0aCwgZm9yY2VXcml0ZSwgdmVyc2lvbiwgbnVtRmV0Y2hSZXRpZXMpIHsKICAgICAgdmFyIHB2RmlsZSwgd2FpdFRpbWVNaWxsaXNlY29uZHMsIGRlbGF5LCBudW1BdHRlbXB0c0xlZnQsIGVycm9yLCByZXNwb25zZSwgZGF0YSwgcmVzcG9uc2VUZXh0OwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgIHJldHVybiBvcGVuKG1vZGVsUGF0aCwgJ3cnKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHZGaWxlID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGlmICghKGZvcmNlV3JpdGUgfHwgcHZGaWxlLm1ldGEgPT09IHVuZGVmaW5lZCB8fCB2ZXJzaW9uID4gcHZGaWxlLm1ldGEudmVyc2lvbikpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG51bUZldGNoUmV0aWVzIDwgMCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ251bUZldGNoUmV0cmllcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHdhaXRUaW1lTWlsbGlzZWNvbmRzID0gQkFDS09GRl9TVEFSVF9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZGVsYXlNaWxsaXNlY29uZHMpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNaWxsaXNlY29uZHMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBudW1BdHRlbXB0c0xlZnQgPSBudW1GZXRjaFJldGllcyArIDE7CiAgICAgICAgICAgIGVycm9yID0gbnVsbDsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKG51bUF0dGVtcHRzTGVmdCA+IDApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAzODsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IG51bGw7CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMTI7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTU7CiAgICAgICAgICAgIHJldHVybiBmZXRjaChwdWJsaWNQYXRoLCB7CiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE5OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgcmV0dXJuIHB2RmlsZS53cml0ZShuZXcgVWludDhBcnJheShkYXRhKSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI1OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJFcnJvciByZXNwb25zZSByZXR1cm5lZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJzogIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjk7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgxMik7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggbW9kZWwgZnJvbSAnIi5jb25jYXQocHVibGljUGF0aCwgIic6ICIpLmNvbmNhdChfY29udGV4dDQudDAubWVzc2FnZSkpOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgbnVtQXR0ZW1wdHNMZWZ0LS07CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMzU7CiAgICAgICAgICAgIHJldHVybiBkZWxheSh3YWl0VGltZU1pbGxpc2Vjb25kcyk7CiAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICB3YWl0VGltZU1pbGxpc2Vjb25kcyA9IE1hdGgubWluKEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUywgd2FpdFRpbWVNaWxsaXNlY29uZHMgKiBCQUNLT0ZGX1NUQVJUX01JTExJU0VDT05EUyk7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgaWYgKCEoZXJyb3IgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA0MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJyIpKTsKICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzEyLCAyOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbVB1YmxpY0RpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBsb2FkTW9kZWwoX3gxMykgewogICAgcmV0dXJuIF9sb2FkTW9kZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gX2xvYWRNb2RlbCgpIHsKICAgIF9sb2FkTW9kZWwgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUobW9kZWwpIHsKICAgICAgdmFyIGJhc2U2NCwgcHVibGljUGF0aCwgY3VzdG9tV3JpdGVQYXRoLCBfbW9kZWwkZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSwgX21vZGVsJHZlcnNpb24sIHZlcnNpb24sIF9tb2RlbCRudW1GZXRjaFJldHJpZSwgbnVtRmV0Y2hSZXRyaWVzOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShtb2RlbCA9PT0gdW5kZWZpbmVkIHx8IG1vZGVsID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtb2RlbCBpcyB1bmRlZmluZWQgLyBlbXB0eScpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBiYXNlNjQgPSBtb2RlbC5iYXNlNjQsIHB1YmxpY1BhdGggPSBtb2RlbC5wdWJsaWNQYXRoLCBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGgsIF9tb2RlbCRmb3JjZVdyaXRlID0gbW9kZWwuZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSA9IF9tb2RlbCRmb3JjZVdyaXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9tb2RlbCRmb3JjZVdyaXRlLCBfbW9kZWwkdmVyc2lvbiA9IG1vZGVsLnZlcnNpb24sIHZlcnNpb24gPSBfbW9kZWwkdmVyc2lvbiA9PT0gdm9pZCAwID8gMSA6IF9tb2RlbCR2ZXJzaW9uLCBfbW9kZWwkbnVtRmV0Y2hSZXRyaWUgPSBtb2RlbC5udW1GZXRjaFJldHJpZXMsIG51bUZldGNoUmV0cmllcyA9IF9tb2RlbCRudW1GZXRjaFJldHJpZSA9PT0gdm9pZCAwID8gMCA6IF9tb2RlbCRudW1GZXRjaFJldHJpZTsKICAgICAgICAgICAgaWYgKCEoY3VzdG9tV3JpdGVQYXRoID09PSB1bmRlZmluZWQgfHwgY3VzdG9tV3JpdGVQYXRoID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjdXN0b21Xcml0ZVBhdGggb2YgdGhlIHByb3ZpZGVkIG1vZGVsIGlzIHVuZGVmaW5lZCAvIGVtcHR5Jyk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGlmICghKGJhc2U2NCAhPT0gdW5kZWZpbmVkICYmIGJhc2U2NCAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gODsKICAgICAgICAgICAgcmV0dXJuIGZyb21CYXNlNjQoY3VzdG9tV3JpdGVQYXRoLCBiYXNlNjQsIGZvcmNlV3JpdGUsIHZlcnNpb24pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKHB1YmxpY1BhdGggIT09IHVuZGVmaW5lZCAmJiBwdWJsaWNQYXRoICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMzsKICAgICAgICAgICAgcmV0dXJuIGZyb21QdWJsaWNEaXJlY3RvcnkoY3VzdG9tV3JpdGVQYXRoLCBwdWJsaWNQYXRoLCBmb3JjZVdyaXRlLCB2ZXJzaW9uLCBudW1GZXRjaFJldHJpZXMpOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcm92aWRlZCBtb2RlbCBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBwdWJsaWNQYXRoIG9yIGJhc2U2NCB2YWx1ZSIpOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIGN1c3RvbVdyaXRlUGF0aCk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2xvYWRNb2RlbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCwgYXJyb3ctYm9keS1zdHlsZTogMCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOiAwLCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzOiAwICovCiAgdmFyIHdhc2lTbmFwc2hvdFByZXZpZXcxRW11bGF0b3IgPSB7CiAgICBhcmdzX2dldDogZnVuY3Rpb24gYXJnc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IGZ1bmN0aW9uIGFyZ3Nfc2l6ZXNfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fZ2V0OiBmdW5jdGlvbiBlbnZpcm9uX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX3NpemVzX2dldDogZnVuY3Rpb24gZW52aXJvbl9zaXplc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogZnVuY3Rpb24gY2xvY2tfcmVzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja190aW1lX2dldDogZnVuY3Rpb24gY2xvY2tfdGltZV9nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiBmdW5jdGlvbiBmZF9hZHZpc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Nsb3NlOiBmdW5jdGlvbiBmZF9jbG9zZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9kYXRhc3luYzogZnVuY3Rpb24gZmRfZGF0YXN5bmMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogZnVuY3Rpb24gZmRfZmRzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X2ZsYWdzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X2ZsYWdzKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfcmlnaHRzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X3JpZ2h0cyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9nZXQ6IGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfc2l6ZTogZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IGZ1bmN0aW9uIGZkX3ByZWFkKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZ2V0OiBmdW5jdGlvbiBmZF9wcmVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2Rpcl9uYW1lOiBmdW5jdGlvbiBmZF9wcmVzdGF0X2Rpcl9uYW1lKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3B3cml0ZTogZnVuY3Rpb24gZmRfcHdyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlYWQ6IGZ1bmN0aW9uIGZkX3JlYWQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogZnVuY3Rpb24gZmRfcmVhZGRpcihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZW51bWJlcjogZnVuY3Rpb24gZmRfcmVudW1iZXIoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogZnVuY3Rpb24gZmRfc2VlayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zeW5jOiBmdW5jdGlvbiBmZF9zeW5jKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3RlbGw6IGZ1bmN0aW9uIGZkX3RlbGwoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IGZ1bmN0aW9uIGZkX3dyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfY3JlYXRlX2RpcmVjdG9yeTogZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfZ2V0OiBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X3NldF90aW1lczogZnVuY3Rpb24gcGF0aF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiBmdW5jdGlvbiBwYXRoX2xpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiBmdW5jdGlvbiBwYXRoX29wZW4oaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogZnVuY3Rpb24gcGF0aF9yZWFkbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbW92ZV9kaXJlY3Rvcnk6IGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbmFtZTogZnVuY3Rpb24gcGF0aF9yZW5hbWUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiBmdW5jdGlvbiBwYXRoX3N5bWxpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogZnVuY3Rpb24gcGF0aF91bmxpbmtfZmlsZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwb2xsX29uZW9mZjogZnVuY3Rpb24gcG9sbF9vbmVvZmYoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiBmdW5jdGlvbiBwcm9jX2V4aXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogZnVuY3Rpb24gcHJvY19yYWlzZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzY2hlZF95aWVsZDogZnVuY3Rpb24gc2NoZWRfeWllbGQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogZnVuY3Rpb24gcmFuZG9tX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3JlY3Y6IGZ1bmN0aW9uIHNvY2tfcmVjdihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NlbmQ6IGZ1bmN0aW9uIHNvY2tfc2VuZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NodXRkb3duOiBmdW5jdGlvbiBzb2NrX3NodXRkb3duKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH07CgogIC8qKg0KICAgKiBJbXBvcnRzIGFuZCBFeHBvcnRzIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgV0FTTS4NCiAgICoNCiAgICogQHBhcmFtIG1lbW9yeSBJbml0aWFsaXplZCBXZWJBc3NlbWJseSBtZW1vcnkgb2JqZWN0Lg0KICAgKiBAcGFyYW0gd2FzbSBUaGUgd2FzbSBmaWxlIGluIGJhc2U2NCBzdHJpbmcgb3Igc3RyZWFtIHRvIHB1YmxpYyBwYXRoIChpLmUuIGZldGNoKCJmaWxlLndhc20iKSkgdG8gaW5pdGlhbGl6ZS4NCiAgICogQHBhcmFtIHB2RXJyb3IgVGhlIFB2RXJyb3Igb2JqZWN0IHRvIHN0b3JlIGVycm9yIGRldGFpbHMuDQogICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBXQVNNLg0KICAgKi8KICBmdW5jdGlvbiBidWlsZFdhc20oX3gsIF94MiwgX3gzKSB7CiAgICByZXR1cm4gX2J1aWxkV2FzbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBfYnVpbGRXYXNtKCkgewogICAgX2J1aWxkV2FzbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlOShtZW1vcnksIHdhc20sIHB2RXJyb3IpIHsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkh0dHBzUmVxdWVzdFdhc20sIHB2R2V0QnJvd3NlckluZm8sIHB2R2V0T3JpZ2luSW5mbywgcHZGaWxlT3Blbldhc20sIHB2RmlsZUNsb3NlV2FzbSwgcHZGaWxlUmVhZFdhc20sIHB2RmlsZVdyaXRlV2FzbSwgcHZGaWxlU2Vla1dhc20sIHB2RmlsZVRlbGxXYXNtLCBwdkZpbGVSZW1vdmVXYXNtLCBpbXBvcnRPYmplY3QsIGluc3RhbmNlLCByZXNwb25zZSwgZGF0YSwgd2FzbUNvZGVBcnJheSwgYWxpZ25lZF9hbGxvYzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTkkKF9jb250ZXh0OSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgcHZDb25zb2xlTG9nV2FzbSA9IGZ1bmN0aW9uIHB2Q29uc29sZUxvZ1dhc20oaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBpbmRleCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkFzc2VydFdhc20gPSBmdW5jdGlvbiBwdkFzc2VydFdhc20oZXhwciwgbGluZSwgZmlsZU5hbWVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgaWYgKGV4cHIgPT09IDApIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBmaWxlTmFtZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgIi5jb25jYXQobGluZSwgIiBpbiBcIiIpLmNvbmNhdChmaWxlTmFtZSwgIlwiIikpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZUaW1lV2FzbSA9IGZ1bmN0aW9uIHB2VGltZVdhc20oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkh0dHBzUmVxdWVzdFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaHR0cE1ldGhvZEFkZHJlc3MsIHNlcnZlck5hbWVBZGRyZXNzLCBlbmRwb2ludEFkZHJlc3MsIGhlYWRlckFkZHJlc3MsIGJvZHlBZGRyZXNzLCB0aW1lb3V0TXMsIHJlc3BvbnNlQWRkcmVzc0FkZHJlc3MsIHJlc3BvbnNlU2l6ZUFkZHJlc3MsIHJlc3BvbnNlQ29kZUFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBodHRwTWV0aG9kLCBzZXJ2ZXJOYW1lLCBlbmRwb2ludCwgaGVhZGVyLCBib2R5LCBoZWFkZXJPYmplY3QsIHJlc3BvbnNlLCByZXNwb25zZVRleHQsIHN0YXR1c0NvZGUsIHJlc3BvbnNlQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBodHRwTWV0aG9kQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHNlcnZlck5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGVuZHBvaW50QWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaGVhZGVyQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGJvZHlBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck9iamVjdCA9IHN0cmluZ0hlYWRlclRvT2JqZWN0KGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoV2l0aFRpbWVvdXQoJ2h0dHBzOi8vJyArIHNlcnZlck5hbWUgKyBlbmRwb2ludCwgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGh0dHBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keQogICAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dE1zKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbImNhdGNoIl0oNik7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2SHR0cHNSZXF1ZXN0V2FzbScsICJGYWlsZWQgdG8gZmV0Y2g6ICIuY29uY2F0KF9jb250ZXh0LnQwKSk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0WyJjYXRjaCJdKDE3KTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZIdHRwc1JlcXVlc3RXYXNtJywgIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgdGV4dDogIi5jb25jYXQoX2NvbnRleHQudDEpKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChyZXNwb25zZVRleHQubGVuZ3RoICsgMSkgKiBJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzcG9uc2VBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdk1hbGxvY0Vycm9yJywgInB2SHR0cHNSZXF1ZXN0V2FzbTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UiKTsKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3Jlc3BvbnNlQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbcmVzcG9uc2VTaXplQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gcmVzcG9uc2VUZXh0Lmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUFkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSByZXNwb25zZUFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcG9uc2VUZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W3Jlc3BvbnNlQWRkcmVzcyArIGldID0gcmVzcG9uc2VUZXh0LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtyZXNwb25zZUFkZHJlc3MgKyByZXNwb25zZVRleHQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUNvZGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMTNdLCBbMTcsIDIzXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZIdHRwc1JlcXVlc3RXYXNtKF94NCwgX3g1LCBfeDYsIF94NywgX3g4LCBfeDksIF94MTAsIF94MTEsIF94MTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkdldEJyb3dzZXJJbmZvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoYnJvd3NlckluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHVzZXJBZ2VudCwgYnJvd3NlckluZm9BZGRyZXNzLCBpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICd1bmtub3duJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAodXNlckFnZW50Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgYnJvd3NlckluZm9BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShicm93c2VySW5mb0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2TWFsbG9jRXJyb3InLCAicHZHZXRCcm93c2VySW5mbzogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnJvd3NlciBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMlticm93c2VySW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW2Jyb3dzZXJJbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGJyb3dzZXJJbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VyQWdlbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYnJvd3NlckluZm9BZGRyZXNzICsgaV0gPSB1c2VyQWdlbnQuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2Jyb3dzZXJJbmZvQWRkcmVzcyArIHVzZXJBZ2VudC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZHZXRCcm93c2VySW5mbyhfeDEzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2R2V0T3JpZ2luSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKG9yaWdpbkluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIF9zZWxmJG9yaWdpbjsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW4sIGhvc3RuYW1lLCBvcmlnaW5JbmZvQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IChfc2VsZiRvcmlnaW4gPSBzZWxmLm9yaWdpbikgIT09IG51bGwgJiYgX3NlbGYkb3JpZ2luICE9PSB2b2lkIDAgPyBfc2VsZiRvcmlnaW4gOiBzZWxmLmxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChob3N0bmFtZS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkluZm9BZGRyZXNzID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmlnaW5JbmZvQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZNYWxsb2NFcnJvcicsICJwdkdldE9yaWdpbkluZm86IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yaWdpbiBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltvcmlnaW5JbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb3JpZ2luSW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBvcmlnaW5JbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0bmFtZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtvcmlnaW5JbmZvQWRkcmVzcyArIGldID0gaG9zdG5hbWUuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W29yaWdpbkluZm9BZGRyZXNzICsgaG9zdG5hbWUubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2R2V0T3JpZ2luSW5mbyhfeDE0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZU9wZW5XYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZmlsZUFkZHJlc3MsIHBhdGhBZGRyZXNzLCBtb2RlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHBhdGgsIG1vZGUsIGZpbGU7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgbW9kZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAyOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgUHZGaWxlLnNldFB0cihmaWxlQWRkcmVzcywgZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0NC50MC5uYW1lICE9PSAiRmlsZU5vdEV4aXN0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVPcGVuV2FzbScsIF9jb250ZXh0NC50MCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgMTBdXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVPcGVuV2FzbShfeDE1LCBfeDE2LCBfeDE3LCBfeDE4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZUNsb3NlV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGZpbGVBZGRyZXNzLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSA5OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gX2NvbnRleHQ1WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVDbG9zZVdhc20nLCBfY29udGV4dDUudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU1LCBudWxsLCBbWzAsIDldXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oX3gxOSwgX3gyMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5yZWFkKHNpemUsIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnByZXYgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MCA9IF9jb250ZXh0NlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlUmVhZFdhc20nLCBfY29udGV4dDYudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgbnVsbCwgW1swLCAxMV1dKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKF94MjEsIF94MjIsIF94MjMsIF94MjQsIF94MjUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlV3JpdGVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ3LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUud3JpdGUoY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBjb250ZW50Lmxlbmd0aCAvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcudDAgPSBfY29udGV4dDdbImNhdGNoIl0oMCk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVdyaXRlV2FzbScsIF9jb250ZXh0Ny50MCk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1Xcml0ZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU3LCBudWxsLCBbWzAsIDExXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlV3JpdGVXYXNtKF94MjYsIF94MjcsIF94MjgsIF94MjksIF94MzApIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlU2Vla1dhc20gPSBmdW5jdGlvbiBwdkZpbGVTZWVrV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0LCB3aGVuY2UsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlU2Vla1dhc20nLCBlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlVGVsbFdhc20gPSBmdW5jdGlvbiBwdkZpbGVUZWxsV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0QWRkcmVzcykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gZmlsZS50ZWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVUZWxsV2FzbScsIGUpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZW1vdmVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoLCBmaWxlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgucHJldiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlbihwYXRoLCAidyIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBfY29udGV4dDguc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5wcmV2ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgudDAgPSBfY29udGV4dDhbImNhdGNoIl0oMSk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVJlbW92ZVdhc20nLCBfY29udGV4dDgudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU4LCBudWxsLCBbWzEsIDEwXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlUmVtb3ZlV2FzbShfeDMxLCBfeDMyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIGltcG9ydE9iamVjdCA9IHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzaVNuYXBzaG90UHJldmlldzFFbXVsYXRvciwKICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgcHZfY29uc29sZV9sb2dfd2FzbTogcHZDb25zb2xlTG9nV2FzbSwKICAgICAgICAgICAgICAgIHB2X2Fzc2VydF93YXNtOiBwdkFzc2VydFdhc20sCiAgICAgICAgICAgICAgICBwdl90aW1lX3dhc206IHB2VGltZVdhc20sCiAgICAgICAgICAgICAgICBwdl9odHRwc19yZXF1ZXN0X3dhc206IHB2SHR0cHNSZXF1ZXN0V2FzbSwKICAgICAgICAgICAgICAgIHB2X2dldF9icm93c2VyX2luZm86IHB2R2V0QnJvd3NlckluZm8sCiAgICAgICAgICAgICAgICBwdl9nZXRfb3JpZ2luX2luZm86IHB2R2V0T3JpZ2luSW5mbywKICAgICAgICAgICAgICAgIHB2X2ZpbGVfb3Blbl93YXNtOiBwdkZpbGVPcGVuV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfY2xvc2Vfd2FzbTogcHZGaWxlQ2xvc2VXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9yZWFkX3dhc206IHB2RmlsZVJlYWRXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV93cml0ZV93YXNtOiBwdkZpbGVXcml0ZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3NlZWtfd2FzbTogcHZGaWxlU2Vla1dhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3RlbGxfd2FzbTogcHZGaWxlVGVsbFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlbW92ZV93YXNtOiBwdkZpbGVSZW1vdmVXYXNtCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoISh3YXNtIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyMDsKICAgICAgICAgICAgcmV0dXJuIGEod2FzbSwgaW1wb3J0T2JqZWN0KTsKICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgIGluc3RhbmNlID0gX2NvbnRleHQ5LnNlbnQuaW5zdGFuY2U7CiAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyNTsKICAgICAgICAgICAgcmV0dXJuIHdhc207CiAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDI4OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzMTsKICAgICAgICAgICAgcmV0dXJuIG4obmV3IFVpbnQ4QXJyYXkoZGF0YSksIGltcG9ydE9iamVjdCk7CiAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICBpbnN0YW5jZSA9IF9jb250ZXh0OS5zZW50Lmluc3RhbmNlOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICB3YXNtQ29kZUFycmF5ID0gYmFzZTY0VG9VaW50OEFycmF5KHdhc20pOwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM3OwogICAgICAgICAgICByZXR1cm4gbih3YXNtQ29kZUFycmF5LCBpbXBvcnRPYmplY3QpOwogICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dDkuc2VudC5pbnN0YW5jZTsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBpbnN0YW5jZS5leHBvcnRzKTsKICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU5KTsKICAgIH0pKTsKICAgIHJldHVybiBfYnVpbGRXYXNtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQyKGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwogIH0KCiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8sIG1pbkxlbikgewogICAgaWYgKCFvKSByZXR1cm47CiAgICBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQoKICAvKg0KICAgIENvcHlyaWdodCAyMDIzIFBpY292b2ljZSBJbmMuDQoKICAgIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlICJMSUNFTlNFIg0KICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uDQogICAgYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQogICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICB2YXIgUHZFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdkVycm9yKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZFcnJvcik7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21heE51bUVycm9ycyIsIDEwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfZXJyb3JzIiwgW10pOwogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgIl9sYXN0RXJyb3IiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RXJyb3IsIFt7CiAgICAgIGtleTogImFkZEVycm9yIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogU3RvcmUgYW4gZXJyb3Igd2l0aCBhIGtleSBhbmQgbWVzc2FnZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhZGRFcnJvcihrZXksIGVycm9yKSB7CiAgICAgICAgdGhpcy5fbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKTsKICAgICAgICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA+PSB0aGlzLl9tYXhOdW1FcnJvcnMpIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goewogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIG1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KGVycm9yKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IGFsbCByZWNlbnQgZXJyb3IgbWVzc2FnZXMuIENsZWFucyB1cCBlcnJvciBsaXN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9ycyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFcnJvcnMoKSB7CiAgICAgICAgdmFyIGVycm9ycyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLl9lcnJvcnMpOwogICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdOwogICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBHZXQgZXJyb3JzIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9yU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVycm9yU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ycygpLm1hcChmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LAogICAgICAgICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlOwogICAgICAgICAgcmV0dXJuICInIi5jb25jYXQoa2V5LCAiJyBmYWlsZWQgd2l0aDogIikuY29uY2F0KG1lc3NhZ2UsICIuIik7CiAgICAgICAgfSkuam9pbignXG4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhZGRlZCB0byB0aGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldExhc3RFcnJvciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXN0RXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBpdCBjYW4gc3RvcmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0TWF4RXJyb3JOdW0iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWF4RXJyb3JOdW0obnVtKSB7CiAgICAgICAgdGhpcy5fbWF4TnVtRXJyb3JzID0gbnVtOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZFcnJvcjsKICB9KCk7CgogIGNvbnN0IHNpbWQ9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkkMSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZiQxKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YkMSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMSh0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KICB2YXIgUFZfU1RBVFVTX1NVQ0NFU1MgPSAxMDAwMDsKICB2YXIgTUFYX1BDTV9MRU5HVEhfU0VDID0gNjAgKiAxNTsKICB2YXIgRWFnbGVCYXNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEVhZ2xlQmFzZShoYW5kbGVXYXNtKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlQmFzZSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZTdGF0dXNUb1N0cmluZyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfd2FzbU1lbW9yeSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfYWxpZ25lZEFsbG9jIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9wdkZyZWUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2Z1bmN0aW9uTXV0ZXgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2RXJyb3IiLCB2b2lkIDApOwogICAgICBFYWdsZUJhc2UuX3NhbXBsZVJhdGUgPSBoYW5kbGVXYXNtLnNhbXBsZVJhdGU7CiAgICAgIEVhZ2xlQmFzZS5fdmVyc2lvbiA9IGhhbmRsZVdhc20udmVyc2lvbjsKICAgICAgdGhpcy5fcHZTdGF0dXNUb1N0cmluZyA9IGhhbmRsZVdhc20ucHZTdGF0dXNUb1N0cmluZzsKICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IGhhbmRsZVdhc20ubWVtb3J5OwogICAgICB0aGlzLl9hbGlnbmVkQWxsb2MgPSBoYW5kbGVXYXNtLmFsaWduZWRBbGxvYzsKICAgICAgdGhpcy5fcHZGcmVlID0gaGFuZGxlV2FzbS5wdkZyZWU7CiAgICAgIHRoaXMuX3B2RXJyb3IgPSBoYW5kbGVXYXNtLnB2RXJyb3I7CiAgICAgIHRoaXMuX2Z1bmN0aW9uTXV0ZXggPSBuZXcgTXV0ZXgoKTsKICAgIH0KICAgIC8qKg0KICAgICAqIEF1ZGlvIHNhbXBsZSByYXRlIHJlcXVpcmVkIGJ5IEVhZ2xlLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoRWFnbGVCYXNlLCBbewogICAgICBrZXk6ICJzYW1wbGVSYXRlIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIEVhZ2xlQmFzZS5fc2FtcGxlUmF0ZTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFZlcnNpb24gb2YgRWFnbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidmVyc2lvbiIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZUJhc2UuX3ZlcnNpb247CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBTZXQgYmFzZTY0IHdhc20gZmlsZS4NCiAgICAgICAqIEBwYXJhbSB3YXNtIEJhc2U2NCdkIHdhc20gZmlsZSB0byB1c2UgdG8gaW5pdGlhbGl6ZSB3YXNtLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAic2V0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXYXNtKHdhc20pIHsKICAgICAgICBpZiAodGhpcy5fd2FzbSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLl93YXNtID0gd2FzbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBTZXQgYmFzZTY0IHdhc20gZmlsZSB3aXRoIFNJTUQgZmVhdHVyZS4NCiAgICAgICAqIEBwYXJhbSB3YXNtU2ltZCBCYXNlNjQnZCB3YXNtIGZpbGUgdG8gdXNlIHRvIGluaXRpYWxpemUgd2FzbS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJzZXRXYXNtU2ltZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXYXNtU2ltZCh3YXNtU2ltZCkgewogICAgICAgIGlmICh0aGlzLl93YXNtU2ltZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLl93YXNtU2ltZCA9IHdhc21TaW1kOwogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdEJhc2VXYXNtIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXRCYXNlV2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod2FzbUJhc2U2NCwgd2FzbU1lbW9yeVNpemUpIHsKICAgICAgICAgIHZhciBtZW1vcnksIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwdkVycm9yLCBleHBvcnRzLCBhbGlnbmVkX2FsbG9jLCBwdl9mcmVlLCBwdl9lYWdsZV92ZXJzaW9uLCBwdl9zYW1wbGVfcmF0ZSwgcHZfc3RhdHVzX3RvX3N0cmluZywgc2FtcGxlUmF0ZSwgdmVyc2lvbkFkZHJlc3MsIHZlcnNpb247CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgLy8gQSBXZWJBc3NlbWJseSBwYWdlIGhhcyBhIGNvbnN0YW50IHNpemUgb2YgNjRLaUIuIC0+IDFNaUIgfj0gMTYgcGFnZXMKICAgICAgICAgICAgICAgIG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoewogICAgICAgICAgICAgICAgICBpbml0aWFsOiB3YXNtTWVtb3J5U2l6ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgcHZFcnJvciA9IG5ldyBQdkVycm9yKCk7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTsKICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFdhc20obWVtb3J5LCB3YXNtQmFzZTY0LCBwdkVycm9yKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBleHBvcnRzID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgICAgICBwdl9mcmVlID0gZXhwb3J0cy5wdl9mcmVlOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfdmVyc2lvbiA9IGV4cG9ydHMucHZfZWFnbGVfdmVyc2lvbjsKICAgICAgICAgICAgICAgIHB2X3NhbXBsZV9yYXRlID0gZXhwb3J0cy5wdl9zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIHB2X3N0YXR1c190b19zdHJpbmcgPSBleHBvcnRzLnB2X3N0YXR1c190b19zdHJpbmc7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfc2FtcGxlX3JhdGUoKTsKICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfdmVyc2lvbigpOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICB2ZXJzaW9uQWRkcmVzcyA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHZlcnNpb25BZGRyZXNzKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgbWVtb3J5OiBtZW1vcnksCiAgICAgICAgICAgICAgICAgIGFsaWduZWRBbGxvYzogYWxpZ25lZF9hbGxvYywKICAgICAgICAgICAgICAgICAgcHZGcmVlOiBwdl9mcmVlLAogICAgICAgICAgICAgICAgICBwdkVycm9yOiBwdkVycm9yLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICBwdlN0YXR1c1RvU3RyaW5nOiBwdl9zdGF0dXNfdG9fc3RyaW5nLAogICAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXRCYXNlV2FzbShfeCwgX3gyKSB7CiAgICAgICAgICByZXR1cm4gX2luaXRCYXNlV2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0QmFzZVdhc207CiAgICAgIH0oKQogICAgfV0pOwogICAgcmV0dXJuIEVhZ2xlQmFzZTsKICB9KCk7CiAgLyoqDQogICAqIEphdmFTY3JpcHQvV2ViQXNzZW1ibHkgYmluZGluZyBmb3IgdGhlIHByb2ZpbGVyIG9mIHRoZSBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIGVuZ2luZS4NCiAgICogSXQgZW5yb2xscyBhIHNwZWFrZXIgZ2l2ZW4gYSBzZXQgb2YgdXR0ZXJhbmNlcyBhbmQgdGhlbiBjb25zdHJ1Y3RzIGEgcHJvZmlsZSBmb3IgdGhlIGVucm9sbGVkIHNwZWFrZXIuDQogICAqLwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl9zYW1wbGVSYXRlIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfdmVyc2lvbiIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX3dhc20iLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl93YXNtU2ltZCIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX2VhZ2xlTXV0ZXgiLCBuZXcgTXV0ZXgoKSk7CiAgdmFyIEVhZ2xlUHJvZmlsZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FYWdsZUJhc2UpIHsKICAgIF9pbmhlcml0cyQxKEVhZ2xlUHJvZmlsZXIsIF9FYWdsZUJhc2UpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihFYWdsZVByb2ZpbGVyKTsKICAgIGZ1bmN0aW9uIEVhZ2xlUHJvZmlsZXIoaGFuZGxlV2FzbSkgewogICAgICB2YXIgX3RoaXM7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlUHJvZmlsZXIpOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGhhbmRsZVdhc20pOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlckRlbGV0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfcHZFYWdsZVByb2ZpbGVyRW5yb2xsIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlclJlc2V0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9vYmplY3RBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgRWFnbGVQcm9maWxlci5fbWluRW5yb2xsU2FtcGxlcyA9IGhhbmRsZVdhc20ubWluRW5yb2xsU2FtcGxlczsKICAgICAgRWFnbGVQcm9maWxlci5fcHJvZmlsZVNpemUgPSBoYW5kbGVXYXNtLnByb2ZpbGVTaXplOwogICAgICBFYWdsZVByb2ZpbGVyLl9tYXhFbnJvbGxTYW1wbGVzID0gTUFYX1BDTV9MRU5HVEhfU0VDICogRWFnbGVQcm9maWxlci5fc2FtcGxlUmF0ZTsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlckRlbGV0ZSA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyRGVsZXRlOwogICAgICBfdGhpcy5fcHZFYWdsZVByb2ZpbGVyRW5yb2xsID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJFbnJvbGw7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9maWxlckV4cG9ydDsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlclJlc2V0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJSZXNldDsKICAgICAgX3RoaXMuX29iamVjdEFkZHJlc3MgPSBoYW5kbGVXYXNtLm9iamVjdEFkZHJlc3M7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIC8qKg0KICAgICAqIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgcGNtIHJlcXVpcmVkIGJ5IGAuZW5yb2xsKClgLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoRWFnbGVQcm9maWxlciwgW3sKICAgICAga2V5OiAibWluRW5yb2xsU2FtcGxlcyIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZVByb2ZpbGVyLl9taW5FbnJvbGxTYW1wbGVzOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBwcm9maWxlciBjb21wb25lbnQgb2YgdGhlIEVhZ2xlIFNwZWFrZXIgUmVjb2duaXRpb24gRW5naW5lLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBhY2Nlc3NLZXkgQWNjZXNzS2V5IG9idGFpbmVkIGZyb20gUGljb3ZvaWNlIENvbnNvbGUgKGh0dHBzOi8vY29uc29sZS5waWNvdm9pY2UuYWkvKS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbCBFYWdsZSBtb2RlbCBvcHRpb25zLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmJhc2U2NCBUaGUgbW9kZWwgaW4gYmFzZTY0IHN0cmluZyB0byBpbml0aWFsaXplIEVhZ2xlLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnB1YmxpY1BhdGggVGhlIG1vZGVsIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1YmxpYyBkaXJlY3RvcnkuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuY3VzdG9tV3JpdGVQYXRoIEN1c3RvbSBwYXRoIHRvIHNhdmUgdGhlIG1vZGVsIGluIHN0b3JhZ2UuDQogICAgICAgKiBTZXQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byB1c2UgbXVsdGlwbGUgbW9kZWxzIGFjcm9zcyBgZWFnbGVgIGluc3RhbmNlcy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5mb3JjZVdyaXRlIEZsYWcgdG8gb3ZlcndyaXRlIHRoZSBtb2RlbCBpbiBzdG9yYWdlIGV2ZW4gaWYgaXQgZXhpc3RzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnZlcnNpb24gVmVyc2lvbiBvZiB0aGUgbW9kZWwgZmlsZS4gSW5jcmVtZW50IHRvIHVwZGF0ZSB0aGUgbW9kZWwgZmlsZSBpbiBzdG9yYWdlLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImVucm9sbCIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIEVucm9sbHMgYSBzcGVha2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgdXR0ZXJhbmNlcyBvZiB0aGUgc2FtZSBzcGVha2VyDQogICAgICAgKiB1bnRpbCBgcGVyY2VudGFnZWAgcmVhY2hlcyBgMTAwLjBgLCBhdCB3aGljaCBwb2ludCBhIHNwZWFrZXIgdm9pY2UgcHJvZmlsZSBjYW4gYmUgZXhwb3J0ZWQgdXNpbmcgYC5leHBvcnQoKWAuDQogICAgICAgKiBBbnkgZnVydGhlciBlbnJvbGxtZW50IGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHNwZWFrZXIgcHJvZmlsZS4gVGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCBwY20gdG8NCiAgICAgICAqIGAuZW5yb2xsKClgIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIGAubWluRW5yb2xsU2FtcGxlc2AuDQogICAgICAgKiBUaGUgYXVkaW8gZGF0YSB1c2VkIGZvciBlbnJvbGxtZW50IHNob3VsZCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOg0KICAgICAgICogICAgLSBvbmx5IG9uZSBzcGVha2VyIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBhdWRpbw0KICAgICAgICogICAgLSB0aGUgc3BlYWtlciBzaG91bGQgYmUgc3BlYWtpbmcgaW4gYSBub3JtYWwgdm9pY2UNCiAgICAgICAqICAgIC0gdGhlIGF1ZGlvIHNob3VsZCBjb250YWluIG5vIHNwZWVjaCBmcm9tIG90aGVyIHNwZWFrZXJzIGFuZCBubyBvdGhlciBzb3VuZHMgKGUuZy4gbXVzaWMpDQogICAgICAgKiAgICAtIGl0IHNob3VsZCBiZSBjYXB0dXJlZCBpbiBhIHF1aWV0IGVudmlyb25tZW50IHdpdGggbm8gYmFja2dyb3VuZCBub2lzZQ0KICAgICAgICogQHBhcmFtIHBjbSBBdWRpbyBkYXRhIGZvciBlbnJvbGxtZW50LiBUaGUgYXVkaW8gbmVlZHMgdG8gaGF2ZSBhIHNhbXBsZSByYXRlIGVxdWFsIHRvIGAuc2FtcGxlUmF0ZWAgYW5kIGJlDQogICAgICAgKiAxNi1iaXQgbGluZWFybHktZW5jb2RlZC4gRWFnbGVQcm9maWxlciBvcGVyYXRlcyBvbiBzaW5nbGUtY2hhbm5lbCBhdWRpby4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIFRoZSBwZXJjZW50YWdlIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgc3BlYWtlciBlbnJvbGxtZW50IHByb2Nlc3MgYWxvbmcgd2l0aCB0aGUgZmVlZGJhY2sgY29kZQ0KICAgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlbnJvbGxtZW50IGF0dGVtcHQ6DQogICAgICAgKiAgICAtIGBBVURJT19PS2A6IFRoZSBhdWRpbyBpcyBnb29kIGZvciBlbnJvbGxtZW50Lg0KICAgICAgICogICAgLSBgQVVESU9fVE9PX1NIT1JUYDogQXVkaW8gbGVuZ3RoIGlzIGluc3VmZmljaWVudCBmb3IgZW5yb2xsbWVudCwNCiAgICAgICAqICAgICAgIGkuZS4gaXQgaXMgc2hvcnRlciB0aGFuYC5taW5fZW5yb2xsX3NhbXBsZXNgLg0KICAgICAgICogICAgLSBgVU5LTk9XTl9TUEVBS0VSYDogVGhlcmUgaXMgYW5vdGhlciBzcGVha2VyIGluIHRoZSBhdWRpbyB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVha2VyDQogICAgICAgKiAgICAgICBiZWluZyBlbnJvbGxlZC4gVG9vIG11Y2ggYmFja2dyb3VuZCBub2lzZSBtYXkgY2F1c2UgdGhpcyBlcnJvciBhcyB3ZWxsLg0KICAgICAgICogICAgLSBgTk9fVk9JQ0VfRk9VTkRgOiBUaGUgYXVkaW8gZG9lcyBub3QgY29udGFpbiBhbnkgdm9pY2UsIGkuZS4gaXQgaXMgc2lsZW50IG9yDQogICAgICAgKiAgICAgICBoYXMgYSBsb3cgc2lnbmFsLXRvLW5vaXNlIHJhdGlvLg0KICAgICAgICogICAgLSBgUVVBTElUWV9JU1NVRWA6IFRoZSBhdWRpbyBxdWFsaXR5IGlzIHRvbyBsb3cgZm9yIGVucm9sbG1lbnQgZHVlIHRvIGEgYmFkIG1pY3JvcGhvbmUNCiAgICAgICAqICAgICAgIG9yIHJlY29yZGluZyBlbnZpcm9ubWVudC4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9lbnJvbGwgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHBjbSkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChwY20gaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBhcmd1bWVudCAncGNtJyBtdXN0IGJlIHByb3ZpZGVkIGFzIGFuIEludDE2QXJyYXkiKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBpZiAoIShwY20ubGVuZ3RoID4gRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJ3BjbScgc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiAiLmNvbmNhdChFYWdsZVByb2ZpbGVyLl9tYXhFbnJvbGxTYW1wbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMyLl9mdW5jdGlvbk11dGV4LnJ1bkV4Y2x1c2l2ZSggLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBjbUFkZHJlc3MsIGZlZWRiYWNrQWRkcmVzcywgcGVyY2VudGFnZUFkZHJlc3MsIG1lbW9yeUJ1ZmZlckludDE2LCBzdGF0dXMsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJWaWV3LCBmZWVkYmFjaywgcGVyY2VudGFnZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzMi5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5lbnJvbGwoKWAgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwY20ubGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwY21BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrQWRkcmVzcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZlZWRiYWNrQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZUFkZHJlc3MgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZXJjZW50YWdlQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczIuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkVhZ2xlUHJvZmlsZXJFbnJvbGwoX3RoaXMyLl9vYmplY3RBZGRyZXNzLCBwY21BZGRyZXNzLCBwY20ubGVuZ3RoLCBmZWVkYmFja0FkZHJlc3MsIHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwY21BZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShmZWVkYmFja0FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzMi5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IEVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9ICJlbnJvbGwgZmFpbGVkIHdpdGggc3RhdHVzICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQzID0gbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ0ID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ1ID0gKDAsIF9jb250ZXh0Mi50MikoX2NvbnRleHQyLnQzLCBfY29udGV4dDIudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50NiA9IF9jb250ZXh0Mi50MS5jb25jYXQuY2FsbChfY29udGV4dDIudDEsIF9jb250ZXh0Mi50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclZpZXcgPSBuZXcgRGF0YVZpZXcoX3RoaXMyLl93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2sgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKGZlZWRiYWNrQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0RmxvYXQzMihwZXJjZW50YWdlQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0MzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkZyZWUoZmVlZGJhY2tBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwZXJjZW50YWdlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrOiBmZWVkYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IHBlcmNlbnRhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGVucm9sbChfeDMpIHsKICAgICAgICAgIHJldHVybiBfZW5yb2xsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbnJvbGw7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIEV4cG9ydHMgdGhlIHNwZWFrZXIgcHJvZmlsZSBvZiB0aGUgY3VycmVudCBzZXNzaW9uLg0KICAgICAgICogV2lsbCB0aHJvdyBlcnJvciBpZiB0aGUgcHJvZmlsZSBpcyBub3QgcmVhZHkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBBbiBFYWdsZVByb2ZpbGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImV4cG9ydCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9leHBvcnQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNSgpIHsKICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczMuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZmlsZUFkZHJlc3MsIHN0YXR1cywgX21lbW9yeUJ1ZmZlclVpbnQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwcm9maWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLmV4cG9ydCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBFYWdsZVByb2ZpbGVyLl9wcm9maWxlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQoX3RoaXMzLl9vYmplY3RBZGRyZXNzLCBwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDExOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX21lbW9yeUJ1ZmZlclVpbnQgPSBuZXcgVWludDhBcnJheShfdGhpczMuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDEgPSAiZXhwb3J0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MyA9IF9tZW1vcnlCdWZmZXJVaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NCA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NSA9ICgwLCBfY29udGV4dDQudDIpKF9jb250ZXh0NC50MywgX2NvbnRleHQ0LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDYgPSBfY29udGV4dDQudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ0LnQxLCBfY29udGV4dDQudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDQudDAoX2NvbnRleHQ0LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzMy5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBtZW1vcnlCdWZmZXJVaW50OC5zbGljZShwcm9maWxlQWRkcmVzcyAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHByb2ZpbGVBZGRyZXNzIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI2OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTUpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfZXhwb3J0KCkgewogICAgICAgICAgcmV0dXJuIF9leHBvcnQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXhwb3J0OwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZW5yb2xsbWVudCBzZXNzaW9uLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3Jlc2V0ID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNygpIHsKICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczQuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzNC5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5yZXNldCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5fcHZFYWdsZVByb2ZpbGVyUmVzZXQoX3RoaXM0Ll9vYmplY3RBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoX3RoaXM0Ll93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NCA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NSA9ICgwLCBfY29udGV4dDYudDIpKF9jb250ZXh0Ni50MywgX2NvbnRleHQ2LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYudDYgPSBfY29udGV4dDYudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ2LnQxLCBfY29udGV4dDYudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDYudDAoX2NvbnRleHQ2LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNik7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgICAgcmV0dXJuIF9yZXNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzZXQ7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBhY3F1aXJlZCBieSBFYWdsZSBQcm9maWxlcg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlbGVhc2UiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVsZWFzZSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUodGhpcy5fb2JqZWN0QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3dhc21NZW1vcnk7CiAgICAgICAgICAgICAgICB0aGlzLl93YXNtTWVtb3J5ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU4LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVsZWFzZTsKICAgICAgfSgpCiAgICB9XSwgW3sKICAgICAga2V5OiAiY3JlYXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2NyZWF0ZSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTkoYWNjZXNzS2V5LCBtb2RlbCkgewogICAgICAgICAgdmFyIGN1c3RvbVdyaXRlUGF0aCwgbW9kZWxQYXRoOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlOSQoX2NvbnRleHQ5KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzOwogICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRNb2RlbChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1vZGVsKSwge30sIHsKICAgICAgICAgICAgICAgICAgY3VzdG9tV3JpdGVQYXRoOiBjdXN0b21Xcml0ZVBhdGgKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBtb2RlbFBhdGggPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBFYWdsZVByb2ZpbGVyLl9pbml0KGFjY2Vzc0tleSwgbW9kZWxQYXRoKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTkpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBjcmVhdGUoX3g0LCBfeDUpIHsKICAgICAgICAgIHJldHVybiBfY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjcmVhdGU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0MiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTExKGFjY2Vzc0tleSwgbW9kZWxQYXRoKSB7CiAgICAgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTExJChfY29udGV4dDExKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTEucHJldiA9IF9jb250ZXh0MTEubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChpc0FjY2Vzc0tleVZhbGlkKGFjY2Vzc0tleSkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMS5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQWNjZXNzS2V5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIEVhZ2xlUHJvZmlsZXIuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMCQoX2NvbnRleHQxMCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMC5wcmV2ID0gX2NvbnRleHQxMC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDEwLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5faW5pdFByb2ZpbGVyV2FzbShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgaXNTaW1kID8gX3RoaXM1Ll93YXNtU2ltZCA6IF90aGlzNS5fd2FzbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtT3V0cHV0ID0gX2NvbnRleHQxMC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEwLmFicnVwdCgicmV0dXJuIiwgbmV3IEVhZ2xlUHJvZmlsZXIod2FzbU91dHB1dCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMCk7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDExLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTExKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXQoX3g2LCBfeDcpIHsKICAgICAgICAgIHJldHVybiBfaW5pdDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0OwogICAgICB9KCkKICAgIH0sIHsKICAgICAga2V5OiAiX2luaXRQcm9maWxlcldhc20iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfaW5pdFByb2ZpbGVyV2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMihhY2Nlc3NLZXksIG1vZGVsUGF0aCwgd2FzbUJhc2U2NCkgewogICAgICAgICAgdmFyIGJhc2VXYXNtT3V0cHV0LCBtZW1vcnlCdWZmZXJVaW50OCwgcHZfZWFnbGVfcHJvZmlsZXJfaW5pdCwgcHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlLCBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGwsIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMsIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydCwgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUsIHB2X2VhZ2xlX3Byb2ZpbGVyX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgc3RhdHVzLCBtc2csIG1lbW9yeUJ1ZmZlclZpZXcsIG9iamVjdEFkZHJlc3MsIG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzLCBfbXNnLCBtaW5FbnJvbGxTYW1wbGVzLCBwcm9maWxlU2l6ZUFkZHJlc3MsIF9tc2cyLCBwcm9maWxlU2l6ZTsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEyJChfY29udGV4dDEyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTIucHJldiA9IF9jb250ZXh0MTIubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YkMShFYWdsZVByb2ZpbGVyKSwgIl9pbml0QmFzZVdhc20iLCB0aGlzKS5jYWxsKHRoaXMsIHdhc21CYXNlNjQsIDM1MDApOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGJhc2VXYXNtT3V0cHV0ID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcyA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlczsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0OwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX3Jlc2V0OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICBvYmplY3RBZGRyZXNzQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG9iamVjdEFkZHJlc3NBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxNjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChhY2Nlc3NLZXkubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgYWNjZXNzS2V5QWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKGFjY2Vzc0tleUFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDIxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWNjZXNzS2V5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBpXSA9IGFjY2Vzc0tleS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYWNjZXNzS2V5QWRkcmVzcyArIGFjY2Vzc0tleS5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG1vZGVsUGF0aEVuY29kZWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUobW9kZWxQYXRoKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDI2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAobW9kZWxQYXRoRW5jb2RlZC5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEobW9kZWxQYXRoQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LnNldChtb2RlbFBhdGhFbmNvZGVkLCBtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W21vZGVsUGF0aEFkZHJlc3MgKyBtb2RlbFBhdGhFbmNvZGVkLmxlbmd0aF0gPSAwOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzM7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDM2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShhY2Nlc3NLZXlBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzg7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKG1vZGVsUGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA0ODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQwID0gIidwdl9lYWdsZV9wcm9maWxlcl9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDEgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDIgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDQgPSAoMCwgX2NvbnRleHQxMi50MSkoX2NvbnRleHQxMi50MiwgX2NvbnRleHQxMi50Myk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDEyLnQwLmNvbmNhdC5jYWxsKF9jb250ZXh0MTIudDAsIF9jb250ZXh0MTIudDQpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDUyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDU0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICAgICAgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTc7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSA1NzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDU5OwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMob2JqZWN0QWRkcmVzcywgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNTk6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3MDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQ1ID0gIidwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzJyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDYgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDcgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDY2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDY2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50OCA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDkgPSAoMCwgX2NvbnRleHQxMi50NikoX2NvbnRleHQxMi50NywgX2NvbnRleHQxMi50OCk7CiAgICAgICAgICAgICAgICBfbXNnID0gX2NvbnRleHQxMi50NS5jb25jYXQuY2FsbChfY29udGV4dDEyLnQ1LCBfY29udGV4dDEyLnQ5KTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiIi5jb25jYXQoX21zZywgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgNzA6CiAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzID0gbWVtb3J5QnVmZmVyVmlldy5nZXRJbnQzMihtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3MzsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUobWluRW5yb2xsU2FtcGxlc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgIHByb2ZpbGVTaXplQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVTaXplQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNzg7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSA3ODoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDgwOwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplKG9iamVjdEFkZHJlc3MsIHByb2ZpbGVTaXplQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MDoKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDkxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDEwID0gIidwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZScgZmFpbGVkIHdpdGggc3RhdHVzICI7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTIgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDg3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTMgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxNCA9ICgwLCBfY29udGV4dDEyLnQxMSkoX2NvbnRleHQxMi50MTIsIF9jb250ZXh0MTIudDEzKTsKICAgICAgICAgICAgICAgIF9tc2cyID0gX2NvbnRleHQxMi50MTAuY29uY2F0LmNhbGwoX2NvbnRleHQxMi50MTAsIF9jb250ZXh0MTIudDE0KTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiIi5jb25jYXQoX21zZzIsICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgcHJvZmlsZVNpemUgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKHByb2ZpbGVTaXplQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA5NDsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUocHJvZmlsZVNpemVBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDk0OgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTIuYWJydXB0KCJyZXR1cm4iLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhc2VXYXNtT3V0cHV0KSwge30sIHsKICAgICAgICAgICAgICAgICAgbWluRW5yb2xsU2FtcGxlczogbWluRW5yb2xsU2FtcGxlcywKICAgICAgICAgICAgICAgICAgcHJvZmlsZVNpemU6IHByb2ZpbGVTaXplLAogICAgICAgICAgICAgICAgICBvYmplY3RBZGRyZXNzOiBvYmplY3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJEZWxldGU6IHB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZSwKICAgICAgICAgICAgICAgICAgcHZFYWdsZVByb2ZpbGVyRW5yb2xsOiBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGwsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlckV4cG9ydDogcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0LAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJSZXNldDogcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMi5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxMiwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIF9pbml0UHJvZmlsZXJXYXNtKF94OCwgX3g5LCBfeDEwKSB7CiAgICAgICAgICByZXR1cm4gX2luaXRQcm9maWxlcldhc20yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdFByb2ZpbGVyV2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGVQcm9maWxlcjsKICB9KEVhZ2xlQmFzZSk7CiAgLyoqDQogICAqIEphdmFTY3JpcHQvV2ViQXNzZW1ibHkgYmluZGluZyBmb3IgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBlbmdpbmUuDQogICAqIEl0IHByb2Nlc3NlcyBpbmNvbWluZyBhdWRpbyBpbiBjb25zZWN1dGl2ZSBmcmFtZXMgYW5kIGVtaXRzIGEgc2ltaWxhcml0eSBzY29yZSBmb3IgZWFjaCBlbnJvbGxlZCBzcGVha2VyLg0KICAgKi8KICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZVByb2ZpbGVyLCAiX21heEVucm9sbFNhbXBsZXMiLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlUHJvZmlsZXIsICJfbWluRW5yb2xsU2FtcGxlcyIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVQcm9maWxlciwgIl9wcm9maWxlU2l6ZSIsIHZvaWQgMCk7CiAgdmFyIEVhZ2xlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWFnbGVCYXNlMikgewogICAgX2luaGVyaXRzJDEoRWFnbGUsIF9FYWdsZUJhc2UyKTsKICAgIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKEVhZ2xlKTsKICAgIGZ1bmN0aW9uIEVhZ2xlKGhhbmRsZVdhc20pIHsKICAgICAgdmFyIF90aGlzNjsKICAgICAgX2NsYXNzQ2FsbENoZWNrJDEodGhpcywgRWFnbGUpOwogICAgICBfdGhpczYgPSBfc3VwZXIyLmNhbGwodGhpcywgaGFuZGxlV2FzbSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVEZWxldGUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9wdkVhZ2xlUHJvY2VzcyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVSZXNldCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX29iamVjdEFkZHJlc3MiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9zY29yZXNBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfbnVtU3BlYWtlcnMiLCB2b2lkIDApOwogICAgICBFYWdsZS5fZnJhbWVMZW5ndGggPSBoYW5kbGVXYXNtLmZyYW1lTGVuZ3RoOwogICAgICBfdGhpczYuX3B2RWFnbGVEZWxldGUgPSBoYW5kbGVXYXNtLnB2RWFnbGVEZWxldGU7CiAgICAgIF90aGlzNi5fcHZFYWdsZVByb2Nlc3MgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9jZXNzOwogICAgICBfdGhpczYuX3B2RWFnbGVSZXNldCA9IGhhbmRsZVdhc20ucHZFYWdsZVJlc2V0OwogICAgICBfdGhpczYuX29iamVjdEFkZHJlc3MgPSBoYW5kbGVXYXNtLm9iamVjdEFkZHJlc3M7CiAgICAgIF90aGlzNi5fc2NvcmVzQWRkcmVzcyA9IGhhbmRsZVdhc20uc2NvcmVzQWRkcmVzczsKICAgICAgX3RoaXM2Ll9udW1TcGVha2VycyA9IGhhbmRsZVdhc20ubnVtU3BlYWtlcnM7CiAgICAgIHJldHVybiBfdGhpczY7CiAgICB9CiAgICAvKioNCiAgICAgKiBOdW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwZXIgZnJhbWUgZXhwZWN0ZWQgYnkgRWFnbGUgKGkuZS4gbGVuZ3RoIG9mIHRoZSBhcnJheSBwYXNzZWQgaW50byBgLnByb2Nlc3MoKWApDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MkMShFYWdsZSwgW3sKICAgICAga2V5OiAiZnJhbWVMZW5ndGgiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGUuX2ZyYW1lTGVuZ3RoOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGljb3ZvaWNlIEVhZ2xlIFNwZWFrZXIgUmVjb2duaXRpb24gRW5naW5lLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBhY2Nlc3NLZXk6IEFjY2Vzc0tleSBvYnRhaW5lZCBmcm9tIFBpY292b2ljZSBDb25zb2xlIChodHRwczovL2NvbnNvbGUucGljb3ZvaWNlLmFpLykNCiAgICAgICAqIEBwYXJhbSBtb2RlbCBFYWdsZSBtb2RlbCBvcHRpb25zLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmJhc2U2NCBUaGUgbW9kZWwgaW4gYmFzZTY0IHN0cmluZyB0byBpbml0aWFsaXplIEVhZ2xlLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnB1YmxpY1BhdGggVGhlIG1vZGVsIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1YmxpYyBkaXJlY3RvcnkuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuY3VzdG9tV3JpdGVQYXRoIEN1c3RvbSBwYXRoIHRvIHNhdmUgdGhlIG1vZGVsIGluIHN0b3JhZ2UuDQogICAgICAgKiBTZXQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byB1c2UgbXVsdGlwbGUgbW9kZWxzIGFjcm9zcyBgZWFnbGVgIGluc3RhbmNlcy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5mb3JjZVdyaXRlIEZsYWcgdG8gb3ZlcndyaXRlIHRoZSBtb2RlbCBpbiBzdG9yYWdlIGV2ZW4gaWYgaXQgZXhpc3RzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnZlcnNpb24gVmVyc2lvbiBvZiB0aGUgbW9kZWwgZmlsZS4gSW5jcmVtZW50IHRvIHVwZGF0ZSB0aGUgbW9kZWwgZmlsZSBpbiBzdG9yYWdlLg0KICAgICAgICogQHBhcmFtIHNwZWFrZXJQcm9maWxlcyBPbmUgb3IgbW9yZSBFYWdsZSBzcGVha2VyIHByb2ZpbGVzLiBUaGVzZSBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgYEVhZ2xlUHJvZmlsZXJgLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIEVhZ2xlIGVuZ2luZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJwcm9jZXNzIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogUHJvY2Vzc2VzIGEgZnJhbWUgb2YgYXVkaW8gYW5kIHJldHVybnMgYSBsaXN0IG9mIHNpbWlsYXJpdHkgc2NvcmVzIGZvciBlYWNoIHNwZWFrZXIgcHJvZmlsZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0gcGNtIEEgZnJhbWUgb2YgYXVkaW8gc2FtcGxlcy4gVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZSBjYW4gYmUgYXR0YWluZWQgYnkgY2FsbGluZw0KICAgICAgICogYC5mcmFtZUxlbmd0aGAuIFRoZSBpbmNvbWluZyBhdWRpbyBuZWVkcyB0byBoYXZlIGEgc2FtcGxlIHJhdGUgZXF1YWwgdG8gYC5zYW1wbGVSYXRlYCBhbmQgYmUgMTYtYml0DQogICAgICAgKiBsaW5lYXJseS1lbmNvZGVkLiBFYWdsZSBvcGVyYXRlcyBvbiBzaW5nbGUtY2hhbm5lbCBhdWRpby4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBzaW1pbGFyaXR5IHNjb3JlcyBmb3IgZWFjaCBzcGVha2VyIHByb2ZpbGUuIEEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyB0aGF0IHRoZSB2b2ljZQ0KICAgICAgICogYmVsb25ncyB0byB0aGUgY29ycmVzcG9uZGluZyBzcGVha2VyLiBUaGUgcmFuZ2UgaXMgWzAsIDFdIHdpdGggMS4wIHJlcHJlc2VudGluZyBhIHBlcmZlY3QgbWF0Y2guDQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcHJvY2VzcyA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE0KHBjbSkgewogICAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNCQoX2NvbnRleHQxNCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE0LnByZXYgPSBfY29udGV4dDE0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAocGNtIGluc3RhbmNlb2YgSW50MTZBcnJheSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGFyZ3VtZW50ICdwY20nIG11c3QgYmUgcHJvdmlkZWQgYXMgYW4gSW50MTZBcnJheSIpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKHBjbS5sZW5ndGggIT09IEVhZ2xlLl9mcmFtZUxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxlbmd0aCBvZiBpbnB1dCBmcmFtZSAoIi5jb25jYXQocGNtLmxlbmd0aCwgIikgZG9lcyBub3QgbWF0Y2ggcmVxdWlyZWQgZnJhbWUgbGVuZ3RoICgiKS5jb25jYXQoRWFnbGUuX2ZyYW1lTGVuZ3RoLCAiKSIpKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgX3RoaXM3Ll9mdW5jdGlvbk11dGV4LnJ1bkV4Y2x1c2l2ZSggLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEzKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwY21BZGRyZXNzLCBtZW1vcnlCdWZmZXJJbnQxNiwgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50OCwgbWVtb3J5QnVmZmVyVmlldywgc2NvcmVzLCBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEzJChfY29udGV4dDEzKSB7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEzLnByZXYgPSBfY29udGV4dDEzLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzNy5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjYWxsIGAucHJvY2Vzc2AgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9hbGlnbmVkQWxsb2MoSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgcGNtLmxlbmd0aCAqIEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtQWRkcmVzcyA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNiA9IG5ldyBJbnQxNkFycmF5KF90aGlzNy5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDE2LnNldChwY20sIHBjbUFkZHJlc3MgLyBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczcuX3B2RWFnbGVQcm9jZXNzKF90aGlzNy5fb2JqZWN0QWRkcmVzcywgcGNtQWRkcmVzcywgX3RoaXM3Ll9zY29yZXNBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdkZyZWUocGNtQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDI0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoX3RoaXM3Ll93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MCA9IEVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDEgPSAicHJvY2VzcyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczcuX3B2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQ0ID0gX2NvbnRleHQxMy5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDUgPSAoMCwgX2NvbnRleHQxMy50MikoX2NvbnRleHQxMy50MywgX2NvbnRleHQxMy50NCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50NiA9IF9jb250ZXh0MTMudDEuY29uY2F0LmNhbGwoX2NvbnRleHQxMy50MSwgX2NvbnRleHQxMy50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0MTMudDAoX2NvbnRleHQxMy50Nik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhfdGhpczcuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3RoaXM3Ll9udW1TcGVha2VyczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZXMucHVzaChtZW1vcnlCdWZmZXJWaWV3LmdldEZsb2F0MzIoX3RoaXM3Ll9zY29yZXNBZGRyZXNzICsgaSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMy5hYnJ1cHQoInJldHVybiIsIHNjb3Jlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTMuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMyk7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE0KTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhfeDExKSB7CiAgICAgICAgICByZXR1cm4gX3Byb2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByb2Nlc3M7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGVuZ2luZS4NCiAgICAgICAqIEl0IGlzIGJlc3QgdG8gY2FsbCBiZWZvcmUgcHJvY2Vzc2luZyBhIG5ldyBzZXF1ZW5jZSBvZiBhdWRpbyAoZS5nLiBhIG5ldyB2b2ljZSBpbnRlcmFjdGlvbikuDQogICAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYWNjdXJhY3kgb2YgdGhlIGVuZ2luZSBpcyBub3QgYWZmZWN0ZWQgYnkgYSBjaGFuZ2UgaW4gYXVkaW8gY29udGV4dC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZXNldCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZXNldDIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNigpIHsKICAgICAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTYkKF9jb250ZXh0MTYpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNi5wcmV2ID0gX2NvbnRleHQxNi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzOC5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNS5wcmV2ID0gX2NvbnRleHQxNS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczguX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0YCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczguX3B2RWFnbGVSZXNldChfdGhpczguX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxNS5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAxNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzOC5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQzID0gbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDQgPSBfY29udGV4dDE1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50NSA9ICgwLCBfY29udGV4dDE1LnQyKShfY29udGV4dDE1LnQzLCBfY29udGV4dDE1LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQ2ID0gX2NvbnRleHQxNS50MS5jb25jYXQuY2FsbChfY29udGV4dDE1LnQxLCBfY29udGV4dDE1LnQ1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX2NvbnRleHQxNS50MChfY29udGV4dDE1LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE1KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICAgIHJldHVybiBfcmVzZXQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkZyZWUodGhpcy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlRGVsZXRlKHRoaXMuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93YXNtTWVtb3J5OwogICAgICAgICAgICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE3LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbGVhc2U7CiAgICAgIH0oKQogICAgfV0sIFt7CiAgICAgIGtleTogImNyZWF0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9jcmVhdGUyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTgoYWNjZXNzS2V5LCBtb2RlbCwgc3BlYWtlclByb2ZpbGVzKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMzsKICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kZWwoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb2RlbCksIHt9LCB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aDogY3VzdG9tV3JpdGVQYXRoCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgbW9kZWxQYXRoID0gX2NvbnRleHQxOC5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguYWJydXB0KCJyZXR1cm4iLCBFYWdsZS5faW5pdChhY2Nlc3NLZXksIG1vZGVsUGF0aCwgIUFycmF5LmlzQXJyYXkoc3BlYWtlclByb2ZpbGVzKSA/IFtzcGVha2VyUHJvZmlsZXNdIDogc3BlYWtlclByb2ZpbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxOCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDEyLCBfeDEzLCBfeDE0KSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMjAoYWNjZXNzS2V5LCBtb2RlbFBhdGgsIHNwZWFrZXJQcm9maWxlcykgewogICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMCQoX2NvbnRleHQyMCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIwLnByZXYgPSBfY29udGV4dDIwLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAoaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFjY2Vzc0tleScpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKCFzcGVha2VyUHJvZmlsZXMgfHwgc3BlYWtlclByb2ZpbGVzLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNwZWFrZXIgcHJvZmlsZXMgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGUuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOS5wcmV2ID0gX2NvbnRleHQxOS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE5Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDE5LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOS5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGUuX2luaXRXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBzcGVha2VyUHJvZmlsZXMsIGlzU2ltZCA/IF90aGlzOS5fd2FzbVNpbWQgOiBfdGhpczkuX3dhc20pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU91dHB1dCA9IF9jb250ZXh0MTkuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5hYnJ1cHQoInJldHVybiIsIG5ldyBFYWdsZSh3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE5KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjAuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMjApOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDE1LCBfeDE2LCBfeDE3KSB7CiAgICAgICAgICByZXR1cm4gX2luaXQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdDsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0V2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgc3BlYWtlclByb2ZpbGVzLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZfZWFnbGVfaW5pdCwgcHZfZWFnbGVfZGVsZXRlLCBwdl9lYWdsZV9wcm9jZXNzLCBwdl9lYWdsZV9mcmFtZV9sZW5ndGgsIHB2X2VhZ2xlX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgbnVtU3BlYWtlcnMsIHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MsIHByb2ZpbGVzQWRkcmVzc0xpc3QsIF9pdGVyYXRvciwgX3N0ZXAsIHByb2ZpbGUsIHByb2ZpbGVBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgc2NvcmVzQWRkcmVzcywgZnJhbWVMZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMSQoX2NvbnRleHQyMSkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIxLnByZXYgPSBfY29udGV4dDIxLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mJDEoRWFnbGUpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzE1MCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2Nlc3MgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2Nlc3M7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9mcmFtZV9sZW5ndGggPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2ZyYW1lX2xlbmd0aDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Jlc2V0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9yZXNldDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzc0FkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3RBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAoYWNjZXNzS2V5Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgIGFjY2Vzc0tleUFkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShhY2Nlc3NLZXlBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjY2Vzc0tleS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgaV0gPSBhY2Nlc3NLZXkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBhY2Nlc3NLZXkubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhFbmNvZGVkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1vZGVsUGF0aCk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyNTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgbW9kZWxQYXRoQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1vZGVsUGF0aEFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDI4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQobW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFttb2RlbFBhdGhBZGRyZXNzICsgbW9kZWxQYXRoRW5jb2RlZC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzID0gc3BlYWtlclByb2ZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDMzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBudW1TcGVha2VycyAqIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICBwcm9maWxlc0FkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQyMS5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZXNBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNwZWFrZXJQcm9maWxlcyk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnByZXYgPSAzODsKICAgICAgICAgICAgICAgIF9pdGVyYXRvci5zKCk7CiAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDUxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwcm9maWxlLmJ5dGVzLmxlbmd0aCAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA0NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KHByb2ZpbGUuYnl0ZXMsIHByb2ZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QucHVzaChwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDU2OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDUzOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50MCA9IF9jb250ZXh0MjFbImNhdGNoIl0oMzgpOwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQyMS50MCk7CiAgICAgICAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDU2OwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLmZpbmlzaCg1Nik7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChuZXcgSW50MzJBcnJheShwcm9maWxlc0FkZHJlc3NMaXN0KSwgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjI7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBudW1TcGVha2VycywgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcywgb2JqZWN0QWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA2NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUoYWNjZXNzS2V5QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA3OTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnQxID0gIidwdl9lYWdsZV9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDMgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50NCA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDUgPSAoMCwgX2NvbnRleHQyMS50MikoX2NvbnRleHQyMS50MywgX2NvbnRleHQyMS50NCk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDIxLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MjEudDEsIF9jb250ZXh0MjEudDUpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDgzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG51bVNwZWFrZXJzICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHNjb3Jlc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgODg6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA5MDsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9mcmFtZV9sZW5ndGgoKTsKICAgICAgICAgICAgICBjYXNlIDkwOgogICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMS5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzOiBudW1TcGVha2VycywKICAgICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzczogb2JqZWN0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzczogc2NvcmVzQWRkcmVzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZURlbGV0ZTogcHZfZWFnbGVfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvY2VzczogcHZfZWFnbGVfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZVJlc2V0OiBwdl9lYWdsZV9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIxLCB0aGlzLCBbWzM4LCA1MywgNTYsIDU5XV0pOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdFdhc20oX3gxOCwgX3gxOSwgX3gyMCwgX3gyMSkgewogICAgICAgICAgcmV0dXJuIF9pbml0V2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0V2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGU7CiAgfShFYWdsZUJhc2UpOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlLCAiX2ZyYW1lTGVuZ3RoIiwgdm9pZCAwKTsKCiAgdmFyIHByb2ZpbGVyID0gbnVsbDsKICB2YXIgaW5pdFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVxdWVzdCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEocHJvZmlsZXIgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIHByb2ZpbGVyIGFscmVhZHkgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjsKICAgICAgICAgICAgRWFnbGVQcm9maWxlci5zZXRXYXNtKHJlcXVlc3Qud2FzbSk7CiAgICAgICAgICAgIEVhZ2xlUHJvZmlsZXIuc2V0V2FzbVNpbWQocmVxdWVzdC53YXNtU2ltZCk7CiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3OwogICAgICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5faW5pdChyZXF1ZXN0LmFjY2Vzc0tleSwgcmVxdWVzdC5tb2RlbFBhdGgpOwogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBwcm9maWxlciA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIG1pbkVucm9sbFNhbXBsZXM6IHByb2ZpbGVyLm1pbkVucm9sbFNhbXBsZXMsCiAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogcHJvZmlsZXIuc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICB2ZXJzaW9uOiBwcm9maWxlci52ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDExOwogICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzIsIDExXV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGluaXRSZXF1ZXN0KF94KSB7CiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgZW5yb2xsUmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHJlcXVlc3QpIHsKICAgICAgdmFyIHJlc3VsdDsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShwcm9maWxlciA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdFYWdsZSBwcm9maWxlciBub3QgaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVyLmVucm9sbChyZXF1ZXN0LmlucHV0RnJhbWUpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDk7CiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsiY2F0Y2giXSgyKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6IF9jb250ZXh0Mi50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbMiwgOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiBlbnJvbGxSZXF1ZXN0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciBleHBvcnRSZXF1ZXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoKSB7CiAgICAgIHZhciBwcm9maWxlOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKHByb2ZpbGVyID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIHByb2ZpbGVyIG5vdCBpbml0aWFsaXplZCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMjsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA1OwogICAgICAgICAgICByZXR1cm4gcHJvZmlsZXJbImV4cG9ydCJdKCk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHByb2ZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgIHByb2ZpbGU6IHByb2ZpbGUKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQzLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMywgbnVsbCwgW1syLCA5XV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9ydFJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIHJlc2V0UmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKHByb2ZpbGVyID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIG5vdCBpbml0aWFsaXplZCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICByZXR1cm4gcHJvZmlsZXIucmVzZXQoKTsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDg7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgyKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6IF9jb250ZXh0NC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgOF1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiByZXNldFJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIHJlbGVhc2VSZXF1ZXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUoKSB7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEocHJvZmlsZXIgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVyLnJlbGVhc2UoKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcHJvZmlsZXIgPSBudWxsOwogICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU1KTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiByZWxlYXNlUmVxdWVzdCgpIHsKICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICAvKioNCiAgICogRWFnbGUgcHJvZmlsZXIgd29ya2VyIGhhbmRsZXIuDQogICAqLwogIHNlbGYub25tZXNzYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYoZXZlbnQpIHsKICAgICAgdmFyIGV4cG9ydE1zZzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDYudDAgPSBldmVudC5kYXRhLmNvbW1hbmQ7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gX2NvbnRleHQ2LnQwID09PSAnaW5pdCcgPyAzIDogX2NvbnRleHQ2LnQwID09PSAnZW5yb2xsJyA/IDkgOiBfY29udGV4dDYudDAgPT09ICdleHBvcnQnID8gMTUgOiBfY29udGV4dDYudDAgPT09ICdyZXNldCcgPyAyMCA6IF9jb250ZXh0Ni50MCA9PT0gJ3JlbGVhc2UnID8gMjYgOiAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIF9jb250ZXh0Ni50MSA9IHNlbGY7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNjsKICAgICAgICAgICAgcmV0dXJuIGluaXRSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICBfY29udGV4dDYudDIgPSBfY29udGV4dDYuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ2LnQxLnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ2LnQxLCBfY29udGV4dDYudDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IHNlbGY7CiAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTI7CiAgICAgICAgICAgIHJldHVybiBlbnJvbGxSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgX2NvbnRleHQ2LnQ0ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0Ni50My5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0Ni50MywgX2NvbnRleHQ2LnQ0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5hYnJ1cHQoImJyZWFrIiwgMzMpOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxNzsKICAgICAgICAgICAgcmV0dXJuIGV4cG9ydFJlcXVlc3QoKTsKICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgIGV4cG9ydE1zZyA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGV4cG9ydE1zZywgW2V4cG9ydE1zZy5wcm9maWxlLmJ5dGVzLmJ1ZmZlcl0pOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICBfY29udGV4dDYudDUgPSBzZWxmOwogICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDIzOwogICAgICAgICAgICByZXR1cm4gcmVzZXRSZXF1ZXN0KCk7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDYudDYgPSBfY29udGV4dDYuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ2LnQ1LnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ2LnQ1LCBfY29udGV4dDYudDYpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgiYnJlYWsiLCAzMyk7CiAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICBfY29udGV4dDYudDcgPSBzZWxmOwogICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDI5OwogICAgICAgICAgICByZXR1cm4gcmVsZWFzZVJlcXVlc3QoKTsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0Ni50OCA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICBfY29udGV4dDYudDcucG9zdE1lc3NhZ2UuY2FsbChfY29udGV4dDYudDcsIF9jb250ZXh0Ni50OCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuYWJydXB0KCJicmVhayIsIDMzKTsKICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdmYWlsZWQnLAogICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5yZWNvZ25pemVkIGNvbW1hbmQ6ICIuY29uY2F0KGV2ZW50LmRhdGEuY29tbWFuZCkKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNik7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gKF94MykgewogICAgICByZXR1cm4gX3JlZjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwoKfSkoKTsKCg==', null, false);
|
|
4172
4174
|
/* eslint-enable */
|
|
4173
4175
|
|
|
4174
4176
|
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -4483,7 +4485,7 @@ var EagleProfilerWorker = /*#__PURE__*/function () {
|
|
|
4483
4485
|
_defineProperty$1(EagleProfilerWorker, "_wasm", void 0);
|
|
4484
4486
|
_defineProperty$1(EagleProfilerWorker, "_wasmSimd", void 0);
|
|
4485
4487
|
|
|
4486
|
-
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvciQxKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcCQxKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWVFeHBvcnRzID0ge307CiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0gewogICAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHM7IH0sCiAgICBzZXQgZXhwb3J0cyh2KXsgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzID0ge307CiAgdmFyIF90eXBlb2YkMiA9IHsKICAgIGdldCBleHBvcnRzKCl7IHJldHVybiBfdHlwZW9mRXhwb3J0czsgfSwKICAgIHNldCBleHBvcnRzKHYpeyBfdHlwZW9mRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogIAkgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgCSAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAJICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChfdHlwZW9mJDIpKTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0c1siZGVmYXVsdCJdOwogIAlmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogIAkgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgICByZXR1cm4gZXhwb3J0czsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIAkgIHZhciBleHBvcnRzID0ge30sCiAgCSAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgCSAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwKICAJICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogIAkgICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7CiAgCSAgICB9LAogIAkgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogIAkgICAgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIiwKICAJICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciIsCiAgCSAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAJICAgICAgdmFsdWU6IHZhbHVlLAogIAkgICAgICBlbnVtZXJhYmxlOiAhMCwKICAJICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAJICAgICAgd3JpdGFibGU6ICEwCiAgCSAgICB9KSwgb2JqW2tleV07CiAgCSAgfQogIAkgIHRyeSB7CiAgCSAgICBkZWZpbmUoe30sICIiKTsKICAJICB9IGNhdGNoIChlcnIpIHsKICAJICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CiAgCSAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwKICAJICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogIAkgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwogIAkgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgIl9pbnZva2UiLCB7CiAgCSAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgCSAgICB9KSwgZ2VuZXJhdG9yOwogIAkgIH0KICAJICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKQogIAkgICAgICB9OwogIAkgICAgfSBjYXRjaCAoZXJyKSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogInRocm93IiwKICAJICAgICAgICBhcmc6IGVycgogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBleHBvcnRzLndyYXAgPSB3cmFwOwogIAkgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAJICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQogIAkgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogIAkgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pOwogIAkgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogIAkgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAJICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgewogIAkgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIAkgICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsKICAJICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKICAJICAgICAgfSk7CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgCSAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgCSAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsCiAgCSAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAJICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgCSAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgCSAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogIAkgICAgICAgIH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CiAgCSAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAJICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgfSk7CiAgCSAgICAgIH0KICAJICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogIAkgICAgfQogIAkgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAJICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgc3RhdGUgPSAic3VzcGVuZGVkU3RhcnQiOwogIAkgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgewogIAkgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAJICAgICAgaWYgKCJjb21wbGV0ZWQiID09PSBzdGF0ZSkgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBtZXRob2QpIHRocm93IGFyZzsKICAJICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsKICAJICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogIAkgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogIAkgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgCSAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAJICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogIAkgICAgICAgICAgfQogIAkgICAgICAgIH0KICAJICAgICAgICBpZiAoIm5leHQiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKCJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB7CiAgCSAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogIAkgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CiAgCSAgICAgICAgfSBlbHNlICJyZXR1cm4iID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOwogIAkgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgCSAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOwogIAkgICAgICAgIGlmICgibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUpIHsKICAJICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgCSAgICAgICAgICByZXR1cm4gewogIAkgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAJICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIH0KICAJICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogIAkgICAgICB9CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLAogIAkgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAJICAgIGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yWyJyZXR1cm4iXSAmJiAoY29udGV4dC5tZXRob2QgPSAicmV0dXJuIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCAidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgfHwgInJldHVybiIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciICsgbWV0aG9kTmFtZSArICInIG1ldGhvZCIpKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CiAgCSAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgInJldHVybiIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgCSAgICB2YXIgZW50cnkgPSB7CiAgCSAgICAgIHRyeUxvYzogbG9jc1swXQogIAkgICAgfTsKICAJICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgCSAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAJICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogIAkgIH0KICAJICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogIAkgICAgaWYgKGl0ZXJhYmxlKSB7CiAgCSAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAJICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7CiAgCSAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBpID0gLTEsCiAgCSAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogIAkgICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogIAkgICAgICB9CiAgCSAgICB9CiAgCSAgICByZXR1cm4gewogIAkgICAgICBuZXh0OiBkb25lUmVzdWx0CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAJICAgICAgZG9uZTogITAKICAJICAgIH07CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgdmFyIGN0b3IgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogIAkgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgCSAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOwogIAkgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgCSAgICByZXR1cm4gewogIAkgICAgICBfX2F3YWl0OiBhcmcKICAJICAgIH07CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAJICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7CiAgCSAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7CiAgCSAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogIAkgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKICAJICAgIH0pOwogIAkgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogIAkgIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7CiAgCSAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksCiAgCSAgICAgIGtleXMgPSBbXTsKICAJICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpOwogIAkgICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgewogIAkgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgCSAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgCSAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAJICAgIH0sCiAgCSAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgewogIAkgICAgICB0aGlzLmRvbmUgPSAhMDsKICAJICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAJICAgICAgaWYgKCJ0aHJvdyIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgCSAgICB9LAogIAkgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgewogIAkgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgCSAgICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgCSAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgCSAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogIAkgICAgICAgIGlmICgicm9vdCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCAiY2F0Y2hMb2MiKSwKICAJICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwogIAkgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7CiAgCSAgICAgICAgICBicmVhazsKICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgICAgZmluYWxseUVudHJ5ICYmICgiYnJlYWsiID09PSB0eXBlIHx8ICJjb250aW51ZSIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7CiAgCSAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogIAkgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAJICAgIH0sCiAgCSAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogIAkgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiAiYnJlYWsiID09PSByZWNvcmQudHlwZSB8fCAiY29udGludWUiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiAicmV0dXJuIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0sCiAgCSAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogIAkgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgICByZXR1cm4gdGhyb3duOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAJICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgCSAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksCiAgCSAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAJICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgCSAgICAgIH0sICJuZXh0IiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0KICAJICB9LCBleHBvcnRzOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICAvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLgoKICB2YXIgcnVudGltZSQxID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZiQxKG8pIHsKICAgIF9nZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiQxKG8pOwogIH0KCiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mJDEob2JqZWN0KTsKICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0OwogIH0KCiAgZnVuY3Rpb24gX2dldCgpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsKICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0LmJpbmQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICBpZiAoIWJhc2UpIHJldHVybjsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwoYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiByZWNlaXZlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXNjLnZhbHVlOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICAgIG8uX19wcm90b19fID0gcDsKICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzJDEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZiQxKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKICB9CgogIGZ1bmN0aW9uIF90eXBlb2YkMShvYmopIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2YkMShvYmopOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMShzZWxmLCBjYWxsKSB7CiAgICBpZiAoY2FsbCAmJiAoX3R5cGVvZiQxKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUkMShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YkMShpbnB1dCkgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKF90eXBlb2YkMShyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5JDEoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlJDEoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gX3R5cGVvZiQxKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleSQxKGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSBfdG9Qcm9wZXJ0eUtleSQxKGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGNvbnN0IEVfQ0FOQ0VMRUQgPSBuZXcgRXJyb3IoJ3JlcXVlc3QgZm9yIGxvY2sgY2FuY2VsZWQnKTsKCiAgdmFyIF9fYXdhaXRlciQyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgICB9KTsKICB9OwogIGNsYXNzIFNlbWFwaG9yZSB7CiAgICAgIGNvbnN0cnVjdG9yKF92YWx1ZSwgX2NhbmNlbEVycm9yID0gRV9DQU5DRUxFRCkgewogICAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzID0gW107CiAgICAgICAgICB0aGlzLl93ZWlnaHRlZFdhaXRlcnMgPSBbXTsKICAgICAgfQogICAgICBhY3F1aXJlKHdlaWdodCA9IDEpIHsKICAgICAgICAgIGlmICh3ZWlnaHQgPD0gMCkKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2VpZ2h0ICR7d2VpZ2h0fTogbXVzdCBiZSBwb3NpdGl2ZWApOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdKQogICAgICAgICAgICAgICAgICB0aGlzLl93ZWlnaHRlZFF1ZXVlc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaywgd2VpZ2h0ID0gMSkgewogICAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUod2VpZ2h0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHdhaXRGb3JVbmxvY2sod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLnB1c2gocmVzb2x2ZSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIGlzTG9ja2VkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7CiAgICAgIH0KICAgICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgIH0KICAgICAgc2V0VmFsdWUodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIHJlbGVhc2Uod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICB0aGlzLl92YWx1ZSArPSB3ZWlnaHQ7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzLmZvckVhY2goKHF1ZXVlKSA9PiBxdWV1ZS5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSkpOwogICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRRdWV1ZXMgPSBbXTsKICAgICAgfQogICAgICBfZGlzcGF0Y2goKSB7CiAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBjb25zdCBxdWV1ZUVudHJ5ID0gKF9hID0gdGhpcy5fd2VpZ2h0ZWRRdWV1ZXNbd2VpZ2h0IC0gMV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zaGlmdCgpOwogICAgICAgICAgICAgIGlmICghcXVldWVFbnRyeSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX3ZhbHVlOwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzV2VpZ2h0ID0gd2VpZ2h0OwogICAgICAgICAgICAgIHRoaXMuX3ZhbHVlIC09IHdlaWdodDsKICAgICAgICAgICAgICB3ZWlnaHQgPSB0aGlzLl92YWx1ZSArIDE7CiAgICAgICAgICAgICAgcXVldWVFbnRyeS5yZXNvbHZlKFtwcmV2aW91c1ZhbHVlLCB0aGlzLl9uZXdSZWxlYXNlcihwcmV2aW91c1dlaWdodCldKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2RyYWluVW5sb2NrV2FpdGVycygpOwogICAgICB9CiAgICAgIF9uZXdSZWxlYXNlcih3ZWlnaHQpIHsKICAgICAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNhbGxlZCkKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHdlaWdodCk7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIF9kcmFpblVubG9ja1dhaXRlcnMoKSB7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKCkpOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgfQogICAgICB9CiAgfQoKICB2YXIgX19hd2FpdGVyJDEgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgIH0pOwogIH07CiAgY2xhc3MgTXV0ZXggewogICAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikgewogICAgICAgICAgdGhpcy5fc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxLCBjYW5jZWxFcnJvcik7CiAgICAgIH0KICAgICAgYWNxdWlyZSgpIHsKICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICBjb25zdCBbLCByZWxlYXNlcl0gPSB5aWVsZCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgpOwogICAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5ydW5FeGNsdXNpdmUoKCkgPT4gY2FsbGJhY2soKSk7CiAgICAgIH0KICAgICAgaXNMb2NrZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCk7CiAgICAgIH0KICAgICAgd2FpdEZvclVubG9jaygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUud2FpdEZvclVubG9jaygpOwogICAgICB9CiAgICAgIHJlbGVhc2UoKSB7CiAgICAgICAgICBpZiAodGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCkpCiAgICAgICAgICAgICAgdGhpcy5fc2VtYXBob3JlLnJlbGVhc2UoKTsKICAgICAgfQogICAgICBjYW5jZWwoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmNhbmNlbCgpOwogICAgICB9CiAgfQoKICBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7CiAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogIAlyZXR1cm4gZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwogIH0KCiAgdmFyIF90eXBlb2ZfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG9iaik7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIHZhciBfdHlwZW9mID0gX3R5cGVvZl8xWyJkZWZhdWx0Il07CiAgZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgICAgIHJldHVybiBleHBvcnRzOwogICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICAgIHZhciBleHBvcnRzID0ge30sCiAgICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksCiAgICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogICAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTsKICAgICAgfSwKICAgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogICAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiLAogICAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogICAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogICAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgIH0pLCBvYmpba2V5XTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGRlZmluZSh7fSwgIiIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsKICAgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsCiAgICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7CiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsICJfaW52b2tlIiwgewogICAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgICAgIH0pLCBnZW5lcmF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJ0aHJvdyIsCiAgICAgICAgICBhcmc6IGVycgogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMud3JhcCA9IHdyYXA7CiAgICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwogICAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogICAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLAogICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogICAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7CiAgICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsKICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkLCByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgICAgIH0KICAgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgIl9pbnZva2UiLCB7CiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICAgIHZhciBzdGF0ZSA9ICJzdXNwZW5kZWRTdGFydCI7CiAgICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsKICAgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgICBpZiAoImNvbXBsZXRlZCIgPT09IHN0YXRlKSB7CiAgICAgICAgICBpZiAoInRocm93IiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7CiAgICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7CiAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOwogICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCJuZXh0IiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmICgidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgewogICAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKICAgICAgICAgIH0gZWxzZSAicmV0dXJuIiA9PT0gY29udGV4dC5tZXRob2QgJiYgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CiAgICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCiAgICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKICAgICAgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZCwKICAgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsICJ0aHJvdyIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdICYmIChjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksICJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbWV0aG9kTmFtZSAmJiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBtZXRob2ROYW1lICsgIicgbWV0aG9kIikpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOwogICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKICAgICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsICJyZXR1cm4iICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpOwogICAgfQogICAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsKICAgICAgdmFyIGVudHJ5ID0gewogICAgICAgIHRyeUxvYzogbG9jc1swXQogICAgICB9OwogICAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHsKICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CiAgICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogICAgfQogICAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgewogICAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogICAgICAgIHRyeUxvYzogInJvb3QiCiAgICAgIH1dLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZSkgewogICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlOwogICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogICAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5leHQ6IGRvbmVSZXN1bHQKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICBkb25lOiAhMAogICAgICB9OwogICAgfQogICAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHZhciBjdG9yID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsKICAgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsKICAgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgX19hd2FpdDogYXJnCiAgICAgIH07CiAgICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsKICAgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOwogICAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpOwogICAgICB9KTsKICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBkZWZpbmUoR3AsICJ0b1N0cmluZyIsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogICAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLAogICAgICAgIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7CiAgICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgfTsKICAgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsCiAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7CiAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAgICAgfSwKICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICB0aGlzLmRvbmUgPSAhMDsKICAgICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogICAgICAgIGlmICgidGhyb3ciID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOwogICAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgICAgIH0sCiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKICAgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICBpZiAoInJvb3QiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpLAogICAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKICAgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHlFbnRyeSAmJiAoImJyZWFrIiA9PT0gdHlwZSB8fCAiY29udGludWUiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpOwogICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogICAgICB9LAogICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgICByZXR1cm4gImJyZWFrIiA9PT0gcmVjb3JkLnR5cGUgfHwgImNvbnRpbnVlIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogInJldHVybiIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSAicmV0dXJuIiwgdGhpcy5uZXh0ID0gImVuZCIpIDogIm5vcm1hbCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0sCiAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJjYXRjaCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogICAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAgICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAgICAgICAgIG5leHRMb2M6IG5leHRMb2MKICAgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KICAgIH0sIGV4cG9ydHM7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUgPSByZWdlbmVyYXRvclJ1bnRpbWUkMSgpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgY29uc3QgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIG5ldyBQcm94eSh0LHtnZXQ6KHQscik9PmUodFtyXSl9KX1jbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT12b2lkIDAsdGhpcy5leHBvcnRzPW51bGw7fWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKX1hc3NlcnROb25lU3RhdGUoKXtsZXQgdD10aGlzLmdldFN0YXRlKCk7aWYoMCE9PXQpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIHN0YXRlICR7dH0sIGV4cGVjdGVkIDAuYCl9d3JhcEltcG9ydEZuKHQpe3JldHVybiAoLi4uZSk9PntpZigyPT09dGhpcy5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKSx0aGlzLnZhbHVlO3RoaXMuYXNzZXJ0Tm9uZVN0YXRlKCk7bGV0IHI9dCguLi5lKTtpZighKHM9cil8fCJvYmplY3QiIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnRoZW4pcmV0dXJuIHI7dmFyIHM7dGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZCgxNiksdGhpcy52YWx1ZT1yO319d3JhcE1vZHVsZUltcG9ydHModCl7cmV0dXJuIGUodCx0PT4iZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLndyYXBJbXBvcnRGbih0KTp0KX13cmFwSW1wb3J0cyh0KXtpZih2b2lkIDAhPT10KXJldHVybiBlKHQsKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSk9PnRoaXMud3JhcE1vZHVsZUltcG9ydHModCkpfXdyYXBFeHBvcnRGbihlKXtsZXQgcj10LmdldChlKTtyZXR1cm4gdm9pZCAwIT09cnx8KHI9YXN5bmMoLi4udCk9Pnt0aGlzLmFzc2VydE5vbmVTdGF0ZSgpO2xldCByPWUoLi4udCk7Zm9yKDsxPT09dGhpcy5nZXRTdGF0ZSgpOyl0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKSx0aGlzLnZhbHVlPWF3YWl0IHRoaXMudmFsdWUsdGhpcy5hc3NlcnROb25lU3RhdGUoKSx0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfcmV3aW5kKDE2KSxyPWUoKTtyZXR1cm4gdGhpcy5hc3NlcnROb25lU3RhdGUoKSxyfSx0LnNldChlLHIpKSxyfXdyYXBFeHBvcnRzKGUpe2xldCByPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCB0IGluIGUpe2xldCBzPWVbdF07ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHQuc3RhcnRzV2l0aCgiYXN5bmNpZnlfIil8fChzPXRoaXMud3JhcEV4cG9ydEZuKHMpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocix0LHtlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KTt9cmV0dXJuIHQuc2V0KGUscikscn1pbml0KHQsZSl7Y29uc3R7ZXhwb3J0czpyfT10LG49ci5tZW1vcnl8fGUuZW52JiZlLmVudi5tZW1vcnk7bmV3IEludDMyQXJyYXkobi5idWZmZXIsMTYpLnNldChbMjQsMTAyNF0pLHRoaXMuZXhwb3J0cz10aGlzLndyYXBFeHBvcnRzKHIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LHMucHJvdG90eXBlKTt9fWNsYXNzIHMgZXh0ZW5kcyBXZWJBc3NlbWJseS5JbnN0YW5jZXtjb25zdHJ1Y3Rvcih0LGUpe2xldCBzPW5ldyByO3N1cGVyKHQscy53cmFwSW1wb3J0cyhlKSkscy5pbml0KHRoaXMsZSk7fWdldCBleHBvcnRzKCl7cmV0dXJuIHQuZ2V0KHN1cGVyLmV4cG9ydHMpfX1hc3luYyBmdW5jdGlvbiBuKHQsZSl7bGV0IHM9bmV3IHIsbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LHMud3JhcEltcG9ydHMoZSkpO3JldHVybiBzLmluaXQobiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP246bi5pbnN0YW5jZSxlKSxufWFzeW5jIGZ1bmN0aW9uIGEodCxlKXtsZXQgcz1uZXcgcixuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHQscy53cmFwSW1wb3J0cyhlKSk7cmV0dXJuIHMuaW5pdChuLmluc3RhbmNlLGUpLG59T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLCJleHBvcnRzIix7ZW51bWVyYWJsZTohMH0pOwoKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2Yob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmIChfdHlwZW9mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgewogICAgICByZXR1cm4gY2FsbDsKICAgIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsKICAgIH07CiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOwogIH0KCiAgZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9CiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfcGF0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21ldGEiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RmlsZSwgW3sKICAgICAga2V5OiAibWV0YSIsCiAgICAgIGdldDoKICAgICAgLyoqDQogICAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5fbWV0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCQxKHsKICAgICAgICAgIHZlcnNpb246IDAKICAgICAgICB9LCB0aGlzLl9tZXRhKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZGaWxlLCAiX2ZpbGVQdHJzIiwgbmV3IE1hcCgpKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDEoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQxKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBJbmRleGVkIERCIGNvbmZpZ3VyYXRpb25zDQogICAqLwogIHZhciBEQl9OQU1FID0gJ3B2X2RiJzsKICB2YXIgUFZfRklMRV9TVE9SRSA9ICdwdl9maWxlJzsKICB2YXIgREJfVkVSU0lPTiA9IDM7CiAgLyoqDQogICAqIEhlbHBlciB0byBnZXQgSW5kZXhlZERCLg0KICAgKi8KICBmdW5jdGlvbiBnZXREQigpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTsKICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgfTsKICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7CiAgICAgIH07CiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhQVl9GSUxFX1NUT1JFKSkgewogICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSk7CiAgICAgICAgfQogICAgICB9OwogICAgfSk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgSW5kZXhlZERCLg0KICAgKiBJbmRleGVkREIgaXMgUkVRVUlSRUQuDQogICAqLwogIHZhciBQdkZpbGVJREIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVJREIsIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQxKFB2RmlsZUlEQik7CiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3RvciBvZiBQdkZpbGUgaW5zdGFuY2UuDQogICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgYSBmaWxlLg0KICAgICAqIEBwYXJhbSBtZXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZS4NCiAgICAgKiBAcGFyYW0gZGIgVGhlIGRiIGluc3RhbmNlIGN1cnJlbnRseSByZWxhdGVkIHRvIHRoZSBvcGVuZWQgZmlsZS4NCiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSAtIGVpdGhlciByZWFkb25seSBvciByZWFkd3JpdGUuDQogICAgICovCiAgICBmdW5jdGlvbiBQdkZpbGVJREIocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlSURCKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BhZ2VTaXplIiwgNjU1MzYpOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfZGIiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlUHRyIiwgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlT2Zmc2V0IiwgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fZGIgPSBkYjsKICAgICAgX3RoaXMuX21vZGUgPSBtb2RlOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBPcGVucyBhIGZpbGUgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQdkZpbGUuIEEgZmlsZSBjYW4gYmUgb3BlbmVkIGluIHJlYWRvbmx5IG9yIHJlYWR3cml0ZSBtb2RlDQogICAgICogd2hpY2ggZm9sbG93cyBJbmRleGVkREIgc3RhbmRhcmQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyB2YWx1ZXMgdG8gdGhlIGRiLg0KICAgICAqIFRoZSBmaWxlIGlzIHN0b3JlZCBhcyBhbiBVaW50OEFycmF5IHNlcGFyYXRlZCBieSBwYWdlcy4NCiAgICAgKiBOT1RFOiBUaGUga2V5IGV4YWN0bHkgbWF0Y2hpbmcgdGhlIHBhdGggZXhwZWN0cyBhIHZhbHVlIG9mIHR5cGUgUHZGaWxlTWV0YS4NCiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBvcGVuIHN0b3JlZCBpbiBJbmRleGVkREIuDQogICAgICogQHBhcmFtIG1vZGUgQSBzdHJpbmcsIGlmIGl0IGNvbnRhaW5zICdyJyBpbiB0aGUgc3RyaW5nLCBpdCB3aWxsIG9wZW4gdGhlIGZpbGUgaW4gcmVhZG9ubHkgbW9kZSwgZWxzZSBpdA0KICAgICAqIHdpbGwgb3BlbiBpbiByZWFkd3JpdGUgbW9kZS4NCiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFB2RmlsZT4gQW4gaW5zdGFuY2Ugb2YgUHZGaWxlLg0KICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlSURCLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIENsb3NlcyB0aGUgZGIgY29ubmVjdGlvbi4gQW55IG90aGVyIGluc3RhbmNlIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3Qgd29yayBvbmNlDQogICAgICAgKiB0aGUgZGIgaXMgY2xvc2VkLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2Nsb3NlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgICAgICByZXR1cm4gX2Nsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbG9zZTsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVhZHMgYSB0b3RhbCBvZiAnY291bnQnIGVsZW1lbnRzLCBlYWNoIHdpdGggYSBzaXplIG9mICdzaXplJyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uDQogICAgICAgKiBNb3ZlcyB0aGUgc3RyZWFtIGJ5IHRoZSBhbW91bnQgb2YgZWxlbWVudHMgcmVhZC4NCiAgICAgICAqIElmIHRoZSBsYXN0IGZldyBieXRlcyBpcyBzbWFsbGVyIHRoYW4gJ3NpemUnIGl0IHdpbGwgbm90IHJlYWQgKHNpbWlsYXIgdG8gZnJlYWQpIHRoZSBieXRlcy4NCiAgICAgICAqIEBwYXJhbSBzaXplIFRoZSBlbGVtZW50IHNpemUuDQogICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkLg0KICAgICAgICogQHJldHVybnMgUHJvbWlzZTxVaW50OEFycmF5PiBBIFVpbnQ4QXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgY29waWVkIHRvIGl0Lg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVhZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzaXplLCBjb3VudCkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBpZiAoIV90aGlzMi5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIiciLmNvbmNhdChfdGhpczIuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDsKICAgICAgICAgICAgICAgICAgdmFyIG1heFRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgX3RoaXMyLl9tZXRhLnNpemUpOwogICAgICAgICAgICAgICAgICB2YXIgdG90YWxFbGVtcyA9IG1heFRvQ29weSAtIG1heFRvQ29weSAlIHNpemU7CiAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbEVsZW1zKTsKICAgICAgICAgICAgICAgICAgdmFyIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMi5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMyLl9wYWdlUHRyKSksICIiLmNvbmNhdChfdGhpczIuX3BhdGgsICItIikuY29uY2F0KFB2RmlsZUlEQi5jcmVhdGVQYWdlKF90aGlzMi5fbWV0YS5udW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gX3RoaXMyLl9zdG9yZTsKICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yIHx8IF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHRvdGFsRWxlbXMgLSBjb3BpZWQsIGN1cnNvci52YWx1ZS5sZW5ndGggLSBfdGhpczIuX3BhZ2VPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoY3Vyc29yLnZhbHVlLnNsaWNlKF90aGlzMi5fcGFnZU9mZnNldCwgX3RoaXMyLl9wYWdlT2Zmc2V0ICsgdG9Db3B5KSwgY29waWVkKTsKICAgICAgICAgICAgICAgICAgICBjb3BpZWQgKz0gdG9Db3B5OwogICAgICAgICAgICAgICAgICAgIF90aGlzMi5fcGFnZU9mZnNldCArPSB0b0NvcHk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5fcGFnZU9mZnNldCA9PT0gX3RoaXMyLl9wYWdlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlUHRyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczIuX3BhZ2VPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkIDwgdG90YWxFbGVtcykgewogICAgICAgICAgICAgICAgICAgICAgY3Vyc29yWyJjb250aW51ZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChzdG9yZS50cmFuc2FjdGlvbi5lcnJvcik7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShidWZmZXIuc2xpY2UoMCwgY29waWVkKSk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWFkKF94LCBfeDIpIHsKICAgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogV3JpdGVzIGFuIFVpbnQ4QXJyYXkgdG8gSW5kZXhlZERCIHNlcGVyYXRlZCBieSBwYWdlcy4NCiAgICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBieXRlcyB0byBzYXZlLg0KICAgICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgZmlsZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJ3cml0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF93cml0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjb250ZW50KSB7CiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICAgIHZhciB2ZXJzaW9uLAogICAgICAgICAgICBfYXJnczQgPSBhcmd1bWVudHM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2FyZ3M0Lmxlbmd0aCA+IDEgJiYgX2FyZ3M0WzFdICE9PSB1bmRlZmluZWQgPyBfYXJnczRbMV0gOiAxOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUsIGdldEN1cnJlbnRQYWdlLCBsYXN0LCBuZXdDb250ZW50LCBuZXdTaXplLCBuZXdNZXRhLCBwYWdlcywgaSwga2V5UmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl9tb2RlID09PSAicmVhZG9ubHkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkluc3RhbmNlIGlzIHJlYWRvbmx5IG1vZGUgb25seS4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIHZlcnNpb24gIT09ICJudW1iZXIiICYmIHZlcnNpb24gPD0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJWZXJzaW9uIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzMy5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiBnZXRDdXJyZW50UGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5nZXQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMzLl9wYWdlUHRyKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEucmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhyZXEucmVzdWx0LnNsaWNlKDAsIF90aGlzMy5fcGFnZU9mZnNldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMobmV3IFVpbnQ4QXJyYXkoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG5ldyBVaW50OEFycmF5KGxhc3QubGVuZ3RoICsgY29udGVudC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGxhc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGNvbnRlbnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gX3RoaXMzLl9wYWdlUHRyICogX3RoaXMzLl9wYWdlU2l6ZSArIG5ld0NvbnRlbnQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBuZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM6IE1hdGguY2VpbChuZXdTaXplIC8gX3RoaXMzLl9wYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3TWV0YSwgX3RoaXMzLl9wYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChuZXdDb250ZW50Lmxlbmd0aCAvIF90aGlzMy5fcGFnZVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3Q29udGVudC5zbGljZShpICogX3RoaXMzLl9wYWdlU2l6ZSwgKGkgKyAxKSAqIF90aGlzMy5fcGFnZVNpemUpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX3BhZ2VQdHIgKyBpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMzLmV4aXN0cygpICYmIG5ld01ldGEubnVtUGFnZXMgPCBfdGhpczMuX21ldGEubnVtUGFnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UobmV3TWV0YS5udW1QYWdlcykpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX21ldGEubnVtUGFnZXMpKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVsiZGVsZXRlIl0oa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0b3JlLnRyYW5zYWN0aW9uLmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczMuX21ldGEgPSBuZXdNZXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnNlZWsoMCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQsIF94NSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkpKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHdyaXRlKF94MykgewogICAgICAgICAgcmV0dXJuIF93cml0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGU7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gYnkgJ29mZnNldCcgZWxlbWVudHMgYXQgJ3doZW5jZScgcG9zaXRpb24uDQogICAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZS4NCiAgICAgICAqIEBwYXJhbSB3aGVuY2UgT25lIG9mOg0KICAgICAgICogIC0gMDogbW92ZXMgcG9zaXRpb24gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4NCiAgICAgICAqICAtIDE6IG1vdmVzIHBvc2l0aW9uIGZyb20gY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLg0KICAgICAgICogIC0gMjogbW92ZXMgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBmaWxlLg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDEpIHsKICAgICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fcGFnZVNpemUgKiB0aGlzLl9wYWdlUHRyICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKGN1cnJlbnRPZmZzZXQgKyBvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX21ldGEuc2l6ZSArIG9mZnNldCwgdGhpcy5fbWV0YS5zaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGFnZU9mZnNldCA9IG5ld09mZnNldCAlIHRoaXMuX3BhZ2VTaXplOwogICAgICAgIHRoaXMuX3BhZ2VQdHIgPSBNYXRoLmZsb29yKG5ld09mZnNldCAvIHRoaXMuX3BhZ2VTaXplKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidGVsbCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWxsKCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciAqIHRoaXMuX3BhZ2VTaXplICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJlbW92ZXMgYSBmaWxlIGFuZCBhbnkgcmVsYXRlZCBwYWdlcyBnaXZlbiB0aGUgcGF0aC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVtb3ZlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkgewogICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUGFnZXMsIGtleVJhbmdlLCBzdG9yZSwgcmVxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzID0gX3RoaXM0Ll9tZXRhLm51bVBhZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoX3RoaXM0Ll9wYXRoLCAiIi5jb25jYXQoX3RoaXM0Ll9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShudW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzNC5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID0gc3RvcmVbImRlbGV0ZSJdKGtleVJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fbWV0YSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fcGFnZU9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuX3BhZ2VQdHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94NykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpKSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbGxvd2luZyBwYXRoIGV4aXN0cy4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tZXRhICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc3RyZWFtIGlzIEVPRi4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfaXNFT0YiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciA+PSB0aGlzLl9tZXRhLm51bVBhZ2VzIC0gMSAmJiB0aGlzLl9wYWdlT2Zmc2V0ID49IHRoaXMuX21ldGEuc2l6ZSAlIHRoaXMuX3BhZ2VTaXplOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aGljaCBhcyBhIGtleSB0byBzYXZlIHBhZ2UgZGF0YSB0byBJbmRleGVkREIuDQogICAgICAgKiBUaGlzIGZvcm1hdHMgdGhlIGZpbGUgaW50byAwMDAwLCAwMDAxLCAwMDAyIC4uLg0KICAgICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgbnVtYmVyIHRvIGZvcm1hdC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfc3RvcmUiLAogICAgICBnZXQ6CiAgICAgIC8qKg0KICAgICAgICogR2V0cyBhIG9iamVjdFN0b3JlIGluc3RhbmNlIGZyb20gdGhlIFB2RmlsZSBpbnN0YW5jZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RiLnRyYW5zYWN0aW9uKFBWX0ZJTEVfU1RPUkUsIHRoaXMuX21vZGUpLm9iamVjdFN0b3JlKFBWX0ZJTEVfU1RPUkUpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICBpZiAoIXNlbGYuaW5kZXhlZERCKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICBlcnJvci5uYW1lID0gIkluZGV4ZWREQk5vdFN1cHBvcnRlZCI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZGIsIHJlcSwgX2Vycm9yMjsKICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0NykgewogICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnByZXYgPSAwOwogICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREQigpOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICBkYiA9IF9jb250ZXh0Ny5zZW50OwogICAgICAgICAgICAgICAgICByZXEgPSBkYi50cmFuc2FjdGlvbihQVl9GSUxFX1NUT1JFLCAicmVhZHdyaXRlIikub2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSkuZ2V0KHBhdGgpOwogICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHJlcS5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRiTW9kZSA9IG1vZGUuaW5jbHVkZXMoJ3InKSA/ICJyZWFkb25seSIgOiAicmVhZHdyaXRlIjsKICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PT0gdW5kZWZpbmVkICYmIGRiTW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9lcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgICAgICAgICAgICAgX2Vycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX2Vycm9yKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJREIgPSBuZXcgUHZGaWxlSURCKHBhdGgsIG1ldGEsIGRiLCBkYk1vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgICAgICAgICAgICAgIGZpbGVJREIuc2VlaygwLCAyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlSURCKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gOTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnQwID0gX2NvbnRleHQ3WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ3LnQwLm5hbWUgPT09ICJJbnZhbGlkU3RhdGVFcnJvciIpIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IyID0gbmV3IEVycm9yKCJJbmRleGVkREIgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgICAgICAgIF9lcnJvcjIubmFtZSA9ICJJbmRleGVkREJOb3RTdXBwb3J0ZWQiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChfZXJyb3IyKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NvbnRleHQ3LnQwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgX2NhbGxlZTcsIG51bGwsIFtbMCwgOV1dKTsKICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g4LCBfeDkpIHsKICAgICAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0oKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY3JlYXRlUGFnZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQYWdlKHBhZ2UpIHsKICAgICAgICByZXR1cm4gKCIwMDAiICsgcGFnZSkuc2xpY2UoLTQpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlSURCOwogIH0oUHZGaWxlKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMigpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BvcyIsIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdkZpbGVNZW0sIFt7CiAgICAgIGtleTogImNsb3NlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWFkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQoc2l6ZSwgY291bnQpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFT0YpIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgdGhpcy5fZmlsZS5sZW5ndGggLSB0aGlzLl9wb3MpOwogICAgICAgIHZhciB0b3RhbEVsZW1zID0gdG9Db3B5IC0gdG9Db3B5ICUgc2l6ZTsKICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxFbGVtcyk7CiAgICAgICAgYnVmZmVyLnNldCh0aGlzLl9maWxlLnNsaWNlKHRoaXMuX3BvcywgdGhpcy5fcG9zICsgdG90YWxFbGVtcyksIDApOwogICAgICAgIHRoaXMuX3BvcyArPSB0b3RhbEVsZW1zOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAid3JpdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoY29udGVudCkgewogICAgICAgIHZhciBuZXdGaWxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fcG9zICsgY29udGVudC5sZW5ndGgpOwogICAgICAgIGlmICh0aGlzLl9maWxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KHRoaXMuX2ZpbGUuc2xpY2UoMCwgdGhpcy5fcG9zKSk7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50LCB0aGlzLl9wb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgdGhpcy5fcG9zICs9IGNvbnRlbnQubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wb3M7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3JlbW92ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzWyJkZWxldGUiXSh0aGlzLl9wYXRoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3MgPSAwOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW1vdmU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgX2RlZmluZVByb3BlcnR5KFB2RmlsZU1lbSwgIl9tZW1GaWxlcyIsIG5ldyBNYXAoKSk7CgogIGZ1bmN0aW9uIG93bktleXMkMihvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMkMihPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzJDIoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bIkBAaXRlcmF0b3IiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB9CiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHBocmFzZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZw0KICAgKg0KICAgKiBAcGFyYW0gYXJyYXlCdWZmZXIgaW5wdXQgYXJyYXkgYnVmZmVyDQogICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGhyYXNlIGlzIHN0b3JlZA0KICAgKiBAcmV0dXJuIHJldHJpZXZlZCBzdHJpbmcNCiAgICovCiAgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgoYXJyYXlCdWZmZXIsIGluZGV4U3RhcnQpIHsKICAgIHZhciBpbmRleEVuZCA9IGluZGV4U3RhcnQ7CiAgICB3aGlsZSAoYXJyYXlCdWZmZXJbaW5kZXhFbmRdICE9PSAwKSB7CiAgICAgIGluZGV4RW5kKys7CiAgICB9CiAgICB2YXIgdXRmOGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04Jyk7CiAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKGFycmF5QnVmZmVyLnN1YmFycmF5KGluZGV4U3RhcnQsIGluZGV4RW5kKSk7CiAgfQogIC8qKg0KICAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFuZCBzdG9yZWQgaXQgaW4gYSBVaW50OEFycmF5IGFycmF5DQogICAqDQogICAqIEBwYXJhbSBiYXNlNjRTdHJpbmcgaW5wdXQgYmFzZTY0IHN0cmluZw0KICAgKiBAcmV0dXJuIGRlY29kZWQgYXJyYXkNCiAgICovCiAgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykgewogICAgdmFyIGJhc2U2NFN0cmluZ0RlY29kZWQgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShiYXNlNjRTdHJpbmdEZWNvZGVkLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0cmluZ0RlY29kZWQubGVuZ3RoOyBpKyspIHsKICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiYXNlNjRTdHJpbmdEZWNvZGVkLmNoYXJDb2RlQXQoaSk7CiAgICB9CiAgICByZXR1cm4gYmluYXJ5QXJyYXk7CiAgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgc3RyaW5nIGhlYWRlciB0byBKUyBvYmplY3QNCiAgICoNCiAgICogQHBhcmFtIHN0cmluZ0hlYWRlciBpbnB1dCBzdHJpbmcgaW4ganNvbiBmb3JtYXQNCiAgICogQHJldHVybiByZXRyaWV2ZWQgb2JqZWN0DQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZQogIGZ1bmN0aW9uIHN0cmluZ0hlYWRlclRvT2JqZWN0KHN0cmluZ0hlYWRlcikgewogICAgdmFyIG9iamVjdEhlYWRlciA9IHt9OwogICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEoc3RyaW5nSGVhZGVyLnNwbGl0KCdcclxuJykpLAogICAgICBfc3RlcDsKICAgIHRyeSB7CiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gX3N0ZXAudmFsdWU7CiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IHByb3BlcnR5LnNwbGl0KCc6ICcpOwogICAgICAgIGlmIChrZXlWYWx1ZVBhaXJbMF0gIT09ICcnKSB7CiAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICBvYmplY3RIZWFkZXJba2V5VmFsdWVQYWlyWzBdXSA9IGtleVZhbHVlUGFpclsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgIH0KICAgIHJldHVybiBvYmplY3RIZWFkZXI7CiAgfQogIC8qKg0KICAgKiBBIHdyYXBwZXIgdG8gZmV0Y2ggdGhhdCBhbHNvIHN1cHBvcnRzIHRpbWVvdXQNCiAgICoNCiAgICogQHBhcmFtIHVyaSB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZQ0KICAgKiBAcGFyYW0gb3B0aW9ucyBvdGhlciBvcHRpb25zIHJlbGF0ZWQgdG8gZmV0Y2gNCiAgICogQHBhcmFtIHRpbWUgdGltZW91dCB2YWx1ZQ0KICAgKiBAcmV0dXJuIHJlY2VpdmVkIHJlc3BvbnNlDQogICAqLwogIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoX3gpIHsKICAgIHJldHVybiBfZmV0Y2hXaXRoVGltZW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICAvKioNCiAgICogQ2hlY2tpbmcgd2hldGhlciB0aGUgZ2l2ZW4gQWNjZXNzS2V5IGlzIHZhbGlkDQogICAqDQogICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQWNjZXNzS2V5IGlzIHZhbGlkLCBmYWxzZSBpZiBub3QNCiAgICovCiAgZnVuY3Rpb24gX2ZldGNoV2l0aFRpbWVvdXQoKSB7CiAgICBfZmV0Y2hXaXRoVGltZW91dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKHVyaSkgewogICAgICB2YXIgb3B0aW9ucywKICAgICAgICB0aW1lLAogICAgICAgIGNvbnRyb2xsZXIsCiAgICAgICAgY29uZmlnLAogICAgICAgIHRpbWVvdXQsCiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgb3B0aW9ucyA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDoge307CiAgICAgICAgICAgIHRpbWUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IDUwMDA7CiAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7fSwgewogICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgICAgIH0sIHRpbWUpOwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKICAgICAgICAgICAgcmV0dXJuIGZldGNoKHVyaSwgY29uZmlnKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHJlc3BvbnNlKTsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2ZldGNoV2l0aFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpIHsKICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5ICE9PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgYWNjZXNzS2V5Q2xlYW5lZCA9IGFjY2Vzc0tleS50cmltKCk7CiAgICBpZiAoYWNjZXNzS2V5Q2xlYW5lZCA9PT0gJycpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdHJ5IHsKICAgICAgcmV0dXJuIGJ0b2EoYXRvYihhY2Nlc3NLZXlDbGVhbmVkKSkgPT09IGFjY2Vzc0tleUNsZWFuZWQ7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioNCiAgICogT3BlbnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHBhdGggYW5kIG1vZGUuDQogICAqIEByZXR1cm5zIFB2RmlsZSBpbnN0YW5jZS4NCiAgICovCiAgZnVuY3Rpb24gb3BlbihfeDIsIF94MykgewogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgaGVscGVyLg0KICAgKiBXcml0ZSBtb2RlbEJhc2U2NCB0byBtb2RlbFBhdGggZGVwZW5kaW5nIG9uIG9wdGlvbnMgZm9yY2VXcml0ZSBhbmQgdmVyc2lvbi4NCiAgICovCiAgZnVuY3Rpb24gX29wZW4oKSB7CiAgICBfb3BlbiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwYXRoLCBtb2RlKSB7CiAgICAgIHZhciBlcnJvcjsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAwOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBQdkZpbGVJREIub3BlbihwYXRoLCBtb2RlKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF9jb250ZXh0Mi5zZW50KTsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA2OwogICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbImNhdGNoIl0oMCk7CiAgICAgICAgICAgIGlmIChfY29udGV4dDIudDAubmFtZSA9PT0gJ0luZGV4ZWREQk5vdFN1cHBvcnRlZCcpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybignSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxiYWNrIHRvIGluLW1lbW9yeSBzdG9yYWdlLicpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9jb250ZXh0Mi50MC5uYW1lICE9PSAnRmlsZU5vdEV4aXN0cycpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVW5hYmxlIHRvIGFjY2VzcyBJbmRleGVkREIgKCIuY29uY2F0KF9jb250ZXh0Mi50MC50b1N0cmluZygpLCAiKS4gRmFsbGJhY2sgdG8gaW4tbWVtb3J5IHN0b3JhZ2UuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKAogICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgLy8gQHRzLWlnbm9yZQogICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDAubmFtZSA9PT0gJ0ZpbGVOb3RFeGlzdHMnKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgX2NvbnRleHQyLnQwOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW4tbWVtb3J5IHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgd29ya2VyLicpOwogICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcigiRmFpbGVkIHRvIHN0YXJ0IFB2RmlsZTogIi5jb25jYXQoX2NvbnRleHQyLnQwLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdQdkZpbGVOb3RTdXBwb3J0ZWQnOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBQdkZpbGVNZW0ub3BlbihwYXRoLCBtb2RlKSk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1swLCA2XV0pOwogICAgfSkpOwogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIGZyb21CYXNlNjQoX3g0LCBfeDUsIF94NiwgX3g3KSB7CiAgICByZXR1cm4gX2Zyb21CYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIF9mcm9tQmFzZSgpIHsKICAgIF9mcm9tQmFzZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhtb2RlbFBhdGgsIG1vZGVsQmFzZTY0LCBmb3JjZVdyaXRlLCB2ZXJzaW9uKSB7CiAgICAgIHZhciBwdkZpbGU7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuIG9wZW4obW9kZWxQYXRoLCAndycpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwdkZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgaWYgKCEoZm9yY2VXcml0ZSB8fCBwdkZpbGUubWV0YSA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPiBwdkZpbGUubWV0YS52ZXJzaW9uKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgIHJldHVybiBwdkZpbGUud3JpdGUoYmFzZTY0VG9VaW50OEFycmF5KG1vZGVsQmFzZTY0KSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbUJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgdmFyIEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUyA9IDUwMDA7CiAgdmFyIEJBQ0tPRkZfU1RBUlRfTUlMTElTRUNPTkRTID0gMjsKICAvKioNCiAgICogUHZGaWxlIGhlbHBlci4NCiAgICogV3JpdGUgcHVibGljUGF0aCdzIG1vZGVsIHRvIG1vZGVsUGF0aCBkZXBlbmRpbmcgb24gb3B0aW9ucyBmb3JjZVdyaXRlIGFuZCB2ZXJzaW9uLg0KICAgKi8KICBmdW5jdGlvbiBmcm9tUHVibGljRGlyZWN0b3J5KF94OCwgX3g5LCBfeDEwLCBfeDExLCBfeDEyKSB7CiAgICByZXR1cm4gX2Zyb21QdWJsaWNEaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgLyoqDQogICAqIFRha2VzIGEgUGljb3ZvaWNlIG1vZGVsIGZpbGUgYW5kIGVpdGhlciBkZWNvZGVzIGl0IGZyb20gYmFzZTY0IG9yIGZldGNoZXMNCiAgICogaXQgZnJvbSB0aGUgcHVibGljIGRpcmVjdG9yeS4gU2F2ZXMgdGhlIHJlc3VsdCB0byBzdG9yYWdlIG9uIHZlcnNpb24gaW5jcmVhc2Ugb3INCiAgICogaWYgZm9yY2VXcml0ZSBpcyBlbmFibGVkLg0KICAgKi8KICBmdW5jdGlvbiBfZnJvbVB1YmxpY0RpcmVjdG9yeSgpIHsKICAgIF9mcm9tUHVibGljRGlyZWN0b3J5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KG1vZGVsUGF0aCwgcHVibGljUGF0aCwgZm9yY2VXcml0ZSwgdmVyc2lvbiwgbnVtRmV0Y2hSZXRpZXMpIHsKICAgICAgdmFyIHB2RmlsZSwgd2FpdFRpbWVNaWxsaXNlY29uZHMsIGRlbGF5LCBudW1BdHRlbXB0c0xlZnQsIGVycm9yLCByZXNwb25zZSwgZGF0YSwgcmVzcG9uc2VUZXh0OwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgIHJldHVybiBvcGVuKG1vZGVsUGF0aCwgJ3cnKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHZGaWxlID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGlmICghKGZvcmNlV3JpdGUgfHwgcHZGaWxlLm1ldGEgPT09IHVuZGVmaW5lZCB8fCB2ZXJzaW9uID4gcHZGaWxlLm1ldGEudmVyc2lvbikpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG51bUZldGNoUmV0aWVzIDwgMCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ251bUZldGNoUmV0cmllcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHdhaXRUaW1lTWlsbGlzZWNvbmRzID0gQkFDS09GRl9TVEFSVF9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZGVsYXlNaWxsaXNlY29uZHMpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNaWxsaXNlY29uZHMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBudW1BdHRlbXB0c0xlZnQgPSBudW1GZXRjaFJldGllcyArIDE7CiAgICAgICAgICAgIGVycm9yID0gbnVsbDsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKG51bUF0dGVtcHRzTGVmdCA+IDApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAzODsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IG51bGw7CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMTI7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTU7CiAgICAgICAgICAgIHJldHVybiBmZXRjaChwdWJsaWNQYXRoLCB7CiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE5OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgcmV0dXJuIHB2RmlsZS53cml0ZShuZXcgVWludDhBcnJheShkYXRhKSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI1OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJFcnJvciByZXNwb25zZSByZXR1cm5lZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJzogIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjk7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgxMik7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggbW9kZWwgZnJvbSAnIi5jb25jYXQocHVibGljUGF0aCwgIic6ICIpLmNvbmNhdChfY29udGV4dDQudDAubWVzc2FnZSkpOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgbnVtQXR0ZW1wdHNMZWZ0LS07CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMzU7CiAgICAgICAgICAgIHJldHVybiBkZWxheSh3YWl0VGltZU1pbGxpc2Vjb25kcyk7CiAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICB3YWl0VGltZU1pbGxpc2Vjb25kcyA9IE1hdGgubWluKEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUywgd2FpdFRpbWVNaWxsaXNlY29uZHMgKiBCQUNLT0ZGX1NUQVJUX01JTExJU0VDT05EUyk7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgaWYgKCEoZXJyb3IgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA0MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJyIpKTsKICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzEyLCAyOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbVB1YmxpY0RpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBsb2FkTW9kZWwoX3gxMykgewogICAgcmV0dXJuIF9sb2FkTW9kZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gX2xvYWRNb2RlbCgpIHsKICAgIF9sb2FkTW9kZWwgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUobW9kZWwpIHsKICAgICAgdmFyIGJhc2U2NCwgcHVibGljUGF0aCwgY3VzdG9tV3JpdGVQYXRoLCBfbW9kZWwkZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSwgX21vZGVsJHZlcnNpb24sIHZlcnNpb24sIF9tb2RlbCRudW1GZXRjaFJldHJpZSwgbnVtRmV0Y2hSZXRyaWVzOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShtb2RlbCA9PT0gdW5kZWZpbmVkIHx8IG1vZGVsID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtb2RlbCBpcyB1bmRlZmluZWQgLyBlbXB0eScpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBiYXNlNjQgPSBtb2RlbC5iYXNlNjQsIHB1YmxpY1BhdGggPSBtb2RlbC5wdWJsaWNQYXRoLCBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGgsIF9tb2RlbCRmb3JjZVdyaXRlID0gbW9kZWwuZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSA9IF9tb2RlbCRmb3JjZVdyaXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9tb2RlbCRmb3JjZVdyaXRlLCBfbW9kZWwkdmVyc2lvbiA9IG1vZGVsLnZlcnNpb24sIHZlcnNpb24gPSBfbW9kZWwkdmVyc2lvbiA9PT0gdm9pZCAwID8gMSA6IF9tb2RlbCR2ZXJzaW9uLCBfbW9kZWwkbnVtRmV0Y2hSZXRyaWUgPSBtb2RlbC5udW1GZXRjaFJldHJpZXMsIG51bUZldGNoUmV0cmllcyA9IF9tb2RlbCRudW1GZXRjaFJldHJpZSA9PT0gdm9pZCAwID8gMCA6IF9tb2RlbCRudW1GZXRjaFJldHJpZTsKICAgICAgICAgICAgaWYgKCEoY3VzdG9tV3JpdGVQYXRoID09PSB1bmRlZmluZWQgfHwgY3VzdG9tV3JpdGVQYXRoID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjdXN0b21Xcml0ZVBhdGggb2YgdGhlIHByb3ZpZGVkIG1vZGVsIGlzIHVuZGVmaW5lZCAvIGVtcHR5Jyk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGlmICghKGJhc2U2NCAhPT0gdW5kZWZpbmVkICYmIGJhc2U2NCAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gODsKICAgICAgICAgICAgcmV0dXJuIGZyb21CYXNlNjQoY3VzdG9tV3JpdGVQYXRoLCBiYXNlNjQsIGZvcmNlV3JpdGUsIHZlcnNpb24pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKHB1YmxpY1BhdGggIT09IHVuZGVmaW5lZCAmJiBwdWJsaWNQYXRoICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMzsKICAgICAgICAgICAgcmV0dXJuIGZyb21QdWJsaWNEaXJlY3RvcnkoY3VzdG9tV3JpdGVQYXRoLCBwdWJsaWNQYXRoLCBmb3JjZVdyaXRlLCB2ZXJzaW9uLCBudW1GZXRjaFJldHJpZXMpOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcm92aWRlZCBtb2RlbCBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBwdWJsaWNQYXRoIG9yIGJhc2U2NCB2YWx1ZSIpOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIGN1c3RvbVdyaXRlUGF0aCk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2xvYWRNb2RlbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCwgYXJyb3ctYm9keS1zdHlsZTogMCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOiAwLCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzOiAwICovCiAgdmFyIHdhc2lTbmFwc2hvdFByZXZpZXcxRW11bGF0b3IgPSB7CiAgICBhcmdzX2dldDogZnVuY3Rpb24gYXJnc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IGZ1bmN0aW9uIGFyZ3Nfc2l6ZXNfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fZ2V0OiBmdW5jdGlvbiBlbnZpcm9uX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX3NpemVzX2dldDogZnVuY3Rpb24gZW52aXJvbl9zaXplc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogZnVuY3Rpb24gY2xvY2tfcmVzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja190aW1lX2dldDogZnVuY3Rpb24gY2xvY2tfdGltZV9nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiBmdW5jdGlvbiBmZF9hZHZpc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Nsb3NlOiBmdW5jdGlvbiBmZF9jbG9zZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9kYXRhc3luYzogZnVuY3Rpb24gZmRfZGF0YXN5bmMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogZnVuY3Rpb24gZmRfZmRzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X2ZsYWdzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X2ZsYWdzKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfcmlnaHRzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X3JpZ2h0cyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9nZXQ6IGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfc2l6ZTogZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IGZ1bmN0aW9uIGZkX3ByZWFkKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZ2V0OiBmdW5jdGlvbiBmZF9wcmVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2Rpcl9uYW1lOiBmdW5jdGlvbiBmZF9wcmVzdGF0X2Rpcl9uYW1lKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3B3cml0ZTogZnVuY3Rpb24gZmRfcHdyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlYWQ6IGZ1bmN0aW9uIGZkX3JlYWQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogZnVuY3Rpb24gZmRfcmVhZGRpcihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZW51bWJlcjogZnVuY3Rpb24gZmRfcmVudW1iZXIoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogZnVuY3Rpb24gZmRfc2VlayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zeW5jOiBmdW5jdGlvbiBmZF9zeW5jKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3RlbGw6IGZ1bmN0aW9uIGZkX3RlbGwoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IGZ1bmN0aW9uIGZkX3dyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfY3JlYXRlX2RpcmVjdG9yeTogZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfZ2V0OiBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X3NldF90aW1lczogZnVuY3Rpb24gcGF0aF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiBmdW5jdGlvbiBwYXRoX2xpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiBmdW5jdGlvbiBwYXRoX29wZW4oaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogZnVuY3Rpb24gcGF0aF9yZWFkbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbW92ZV9kaXJlY3Rvcnk6IGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbmFtZTogZnVuY3Rpb24gcGF0aF9yZW5hbWUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiBmdW5jdGlvbiBwYXRoX3N5bWxpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogZnVuY3Rpb24gcGF0aF91bmxpbmtfZmlsZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwb2xsX29uZW9mZjogZnVuY3Rpb24gcG9sbF9vbmVvZmYoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiBmdW5jdGlvbiBwcm9jX2V4aXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogZnVuY3Rpb24gcHJvY19yYWlzZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzY2hlZF95aWVsZDogZnVuY3Rpb24gc2NoZWRfeWllbGQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogZnVuY3Rpb24gcmFuZG9tX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3JlY3Y6IGZ1bmN0aW9uIHNvY2tfcmVjdihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NlbmQ6IGZ1bmN0aW9uIHNvY2tfc2VuZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NodXRkb3duOiBmdW5jdGlvbiBzb2NrX3NodXRkb3duKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH07CgogIC8qKg0KICAgKiBJbXBvcnRzIGFuZCBFeHBvcnRzIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgV0FTTS4NCiAgICoNCiAgICogQHBhcmFtIG1lbW9yeSBJbml0aWFsaXplZCBXZWJBc3NlbWJseSBtZW1vcnkgb2JqZWN0Lg0KICAgKiBAcGFyYW0gd2FzbSBUaGUgd2FzbSBmaWxlIGluIGJhc2U2NCBzdHJpbmcgb3Igc3RyZWFtIHRvIHB1YmxpYyBwYXRoIChpLmUuIGZldGNoKCJmaWxlLndhc20iKSkgdG8gaW5pdGlhbGl6ZS4NCiAgICogQHBhcmFtIHB2RXJyb3IgVGhlIFB2RXJyb3Igb2JqZWN0IHRvIHN0b3JlIGVycm9yIGRldGFpbHMuDQogICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBXQVNNLg0KICAgKi8KICBmdW5jdGlvbiBidWlsZFdhc20oX3gsIF94MiwgX3gzKSB7CiAgICByZXR1cm4gX2J1aWxkV2FzbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBfYnVpbGRXYXNtKCkgewogICAgX2J1aWxkV2FzbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlOShtZW1vcnksIHdhc20sIHB2RXJyb3IpIHsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkh0dHBzUmVxdWVzdFdhc20sIHB2R2V0QnJvd3NlckluZm8sIHB2R2V0T3JpZ2luSW5mbywgcHZGaWxlT3Blbldhc20sIHB2RmlsZUNsb3NlV2FzbSwgcHZGaWxlUmVhZFdhc20sIHB2RmlsZVdyaXRlV2FzbSwgcHZGaWxlU2Vla1dhc20sIHB2RmlsZVRlbGxXYXNtLCBwdkZpbGVSZW1vdmVXYXNtLCBpbXBvcnRPYmplY3QsIGluc3RhbmNlLCByZXNwb25zZSwgZGF0YSwgd2FzbUNvZGVBcnJheSwgYWxpZ25lZF9hbGxvYzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTkkKF9jb250ZXh0OSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgcHZDb25zb2xlTG9nV2FzbSA9IGZ1bmN0aW9uIHB2Q29uc29sZUxvZ1dhc20oaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBpbmRleCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkFzc2VydFdhc20gPSBmdW5jdGlvbiBwdkFzc2VydFdhc20oZXhwciwgbGluZSwgZmlsZU5hbWVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgaWYgKGV4cHIgPT09IDApIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBmaWxlTmFtZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgIi5jb25jYXQobGluZSwgIiBpbiBcIiIpLmNvbmNhdChmaWxlTmFtZSwgIlwiIikpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZUaW1lV2FzbSA9IGZ1bmN0aW9uIHB2VGltZVdhc20oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkh0dHBzUmVxdWVzdFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaHR0cE1ldGhvZEFkZHJlc3MsIHNlcnZlck5hbWVBZGRyZXNzLCBlbmRwb2ludEFkZHJlc3MsIGhlYWRlckFkZHJlc3MsIGJvZHlBZGRyZXNzLCB0aW1lb3V0TXMsIHJlc3BvbnNlQWRkcmVzc0FkZHJlc3MsIHJlc3BvbnNlU2l6ZUFkZHJlc3MsIHJlc3BvbnNlQ29kZUFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBodHRwTWV0aG9kLCBzZXJ2ZXJOYW1lLCBlbmRwb2ludCwgaGVhZGVyLCBib2R5LCBoZWFkZXJPYmplY3QsIHJlc3BvbnNlLCByZXNwb25zZVRleHQsIHN0YXR1c0NvZGUsIHJlc3BvbnNlQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBodHRwTWV0aG9kQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHNlcnZlck5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGVuZHBvaW50QWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaGVhZGVyQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGJvZHlBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck9iamVjdCA9IHN0cmluZ0hlYWRlclRvT2JqZWN0KGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoV2l0aFRpbWVvdXQoJ2h0dHBzOi8vJyArIHNlcnZlck5hbWUgKyBlbmRwb2ludCwgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGh0dHBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keQogICAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dE1zKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbImNhdGNoIl0oNik7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2SHR0cHNSZXF1ZXN0V2FzbScsICJGYWlsZWQgdG8gZmV0Y2g6ICIuY29uY2F0KF9jb250ZXh0LnQwKSk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0WyJjYXRjaCJdKDE3KTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZIdHRwc1JlcXVlc3RXYXNtJywgIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgdGV4dDogIi5jb25jYXQoX2NvbnRleHQudDEpKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChyZXNwb25zZVRleHQubGVuZ3RoICsgMSkgKiBJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzcG9uc2VBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdk1hbGxvY0Vycm9yJywgInB2SHR0cHNSZXF1ZXN0V2FzbTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UiKTsKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3Jlc3BvbnNlQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbcmVzcG9uc2VTaXplQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gcmVzcG9uc2VUZXh0Lmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUFkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSByZXNwb25zZUFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcG9uc2VUZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W3Jlc3BvbnNlQWRkcmVzcyArIGldID0gcmVzcG9uc2VUZXh0LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtyZXNwb25zZUFkZHJlc3MgKyByZXNwb25zZVRleHQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUNvZGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMTNdLCBbMTcsIDIzXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZIdHRwc1JlcXVlc3RXYXNtKF94NCwgX3g1LCBfeDYsIF94NywgX3g4LCBfeDksIF94MTAsIF94MTEsIF94MTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkdldEJyb3dzZXJJbmZvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoYnJvd3NlckluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHVzZXJBZ2VudCwgYnJvd3NlckluZm9BZGRyZXNzLCBpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICd1bmtub3duJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAodXNlckFnZW50Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgYnJvd3NlckluZm9BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShicm93c2VySW5mb0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2TWFsbG9jRXJyb3InLCAicHZHZXRCcm93c2VySW5mbzogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnJvd3NlciBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMlticm93c2VySW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW2Jyb3dzZXJJbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGJyb3dzZXJJbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VyQWdlbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYnJvd3NlckluZm9BZGRyZXNzICsgaV0gPSB1c2VyQWdlbnQuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2Jyb3dzZXJJbmZvQWRkcmVzcyArIHVzZXJBZ2VudC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZHZXRCcm93c2VySW5mbyhfeDEzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2R2V0T3JpZ2luSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKG9yaWdpbkluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIF9zZWxmJG9yaWdpbjsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW4sIGhvc3RuYW1lLCBvcmlnaW5JbmZvQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IChfc2VsZiRvcmlnaW4gPSBzZWxmLm9yaWdpbikgIT09IG51bGwgJiYgX3NlbGYkb3JpZ2luICE9PSB2b2lkIDAgPyBfc2VsZiRvcmlnaW4gOiBzZWxmLmxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChob3N0bmFtZS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkluZm9BZGRyZXNzID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmlnaW5JbmZvQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZNYWxsb2NFcnJvcicsICJwdkdldE9yaWdpbkluZm86IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yaWdpbiBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltvcmlnaW5JbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb3JpZ2luSW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBvcmlnaW5JbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0bmFtZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtvcmlnaW5JbmZvQWRkcmVzcyArIGldID0gaG9zdG5hbWUuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W29yaWdpbkluZm9BZGRyZXNzICsgaG9zdG5hbWUubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2R2V0T3JpZ2luSW5mbyhfeDE0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZU9wZW5XYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZmlsZUFkZHJlc3MsIHBhdGhBZGRyZXNzLCBtb2RlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHBhdGgsIG1vZGUsIGZpbGU7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgbW9kZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAyOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgUHZGaWxlLnNldFB0cihmaWxlQWRkcmVzcywgZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0NC50MC5uYW1lICE9PSAiRmlsZU5vdEV4aXN0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVPcGVuV2FzbScsIF9jb250ZXh0NC50MCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgMTBdXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVPcGVuV2FzbShfeDE1LCBfeDE2LCBfeDE3LCBfeDE4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZUNsb3NlV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGZpbGVBZGRyZXNzLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSA5OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gX2NvbnRleHQ1WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVDbG9zZVdhc20nLCBfY29udGV4dDUudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU1LCBudWxsLCBbWzAsIDldXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oX3gxOSwgX3gyMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5yZWFkKHNpemUsIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnByZXYgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MCA9IF9jb250ZXh0NlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlUmVhZFdhc20nLCBfY29udGV4dDYudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgbnVsbCwgW1swLCAxMV1dKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKF94MjEsIF94MjIsIF94MjMsIF94MjQsIF94MjUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlV3JpdGVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ3LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUud3JpdGUoY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBjb250ZW50Lmxlbmd0aCAvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcudDAgPSBfY29udGV4dDdbImNhdGNoIl0oMCk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVdyaXRlV2FzbScsIF9jb250ZXh0Ny50MCk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1Xcml0ZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU3LCBudWxsLCBbWzAsIDExXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlV3JpdGVXYXNtKF94MjYsIF94MjcsIF94MjgsIF94MjksIF94MzApIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlU2Vla1dhc20gPSBmdW5jdGlvbiBwdkZpbGVTZWVrV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0LCB3aGVuY2UsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlU2Vla1dhc20nLCBlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlVGVsbFdhc20gPSBmdW5jdGlvbiBwdkZpbGVUZWxsV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0QWRkcmVzcykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gZmlsZS50ZWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVUZWxsV2FzbScsIGUpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZW1vdmVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoLCBmaWxlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgucHJldiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlbihwYXRoLCAidyIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBfY29udGV4dDguc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5wcmV2ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgudDAgPSBfY29udGV4dDhbImNhdGNoIl0oMSk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVJlbW92ZVdhc20nLCBfY29udGV4dDgudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU4LCBudWxsLCBbWzEsIDEwXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlUmVtb3ZlV2FzbShfeDMxLCBfeDMyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIGltcG9ydE9iamVjdCA9IHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzaVNuYXBzaG90UHJldmlldzFFbXVsYXRvciwKICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgcHZfY29uc29sZV9sb2dfd2FzbTogcHZDb25zb2xlTG9nV2FzbSwKICAgICAgICAgICAgICAgIHB2X2Fzc2VydF93YXNtOiBwdkFzc2VydFdhc20sCiAgICAgICAgICAgICAgICBwdl90aW1lX3dhc206IHB2VGltZVdhc20sCiAgICAgICAgICAgICAgICBwdl9odHRwc19yZXF1ZXN0X3dhc206IHB2SHR0cHNSZXF1ZXN0V2FzbSwKICAgICAgICAgICAgICAgIHB2X2dldF9icm93c2VyX2luZm86IHB2R2V0QnJvd3NlckluZm8sCiAgICAgICAgICAgICAgICBwdl9nZXRfb3JpZ2luX2luZm86IHB2R2V0T3JpZ2luSW5mbywKICAgICAgICAgICAgICAgIHB2X2ZpbGVfb3Blbl93YXNtOiBwdkZpbGVPcGVuV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfY2xvc2Vfd2FzbTogcHZGaWxlQ2xvc2VXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9yZWFkX3dhc206IHB2RmlsZVJlYWRXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV93cml0ZV93YXNtOiBwdkZpbGVXcml0ZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3NlZWtfd2FzbTogcHZGaWxlU2Vla1dhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3RlbGxfd2FzbTogcHZGaWxlVGVsbFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlbW92ZV93YXNtOiBwdkZpbGVSZW1vdmVXYXNtCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoISh3YXNtIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyMDsKICAgICAgICAgICAgcmV0dXJuIGEod2FzbSwgaW1wb3J0T2JqZWN0KTsKICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgIGluc3RhbmNlID0gX2NvbnRleHQ5LnNlbnQuaW5zdGFuY2U7CiAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyNTsKICAgICAgICAgICAgcmV0dXJuIHdhc207CiAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDI4OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzMTsKICAgICAgICAgICAgcmV0dXJuIG4obmV3IFVpbnQ4QXJyYXkoZGF0YSksIGltcG9ydE9iamVjdCk7CiAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICBpbnN0YW5jZSA9IF9jb250ZXh0OS5zZW50Lmluc3RhbmNlOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICB3YXNtQ29kZUFycmF5ID0gYmFzZTY0VG9VaW50OEFycmF5KHdhc20pOwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM3OwogICAgICAgICAgICByZXR1cm4gbih3YXNtQ29kZUFycmF5LCBpbXBvcnRPYmplY3QpOwogICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dDkuc2VudC5pbnN0YW5jZTsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBpbnN0YW5jZS5leHBvcnRzKTsKICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU5KTsKICAgIH0pKTsKICAgIHJldHVybiBfYnVpbGRXYXNtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQyKGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwogIH0KCiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8sIG1pbkxlbikgewogICAgaWYgKCFvKSByZXR1cm47CiAgICBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQoKICAvKg0KICAgIENvcHlyaWdodCAyMDIzIFBpY292b2ljZSBJbmMuDQoKICAgIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlICJMSUNFTlNFIg0KICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uDQogICAgYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQogICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICB2YXIgUHZFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdkVycm9yKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZFcnJvcik7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21heE51bUVycm9ycyIsIDEwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfZXJyb3JzIiwgW10pOwogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgIl9sYXN0RXJyb3IiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RXJyb3IsIFt7CiAgICAgIGtleTogImFkZEVycm9yIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogU3RvcmUgYW4gZXJyb3Igd2l0aCBhIGtleSBhbmQgbWVzc2FnZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhZGRFcnJvcihrZXksIGVycm9yKSB7CiAgICAgICAgdGhpcy5fbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKTsKICAgICAgICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA+PSB0aGlzLl9tYXhOdW1FcnJvcnMpIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goewogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIG1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KGVycm9yKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IGFsbCByZWNlbnQgZXJyb3IgbWVzc2FnZXMuIENsZWFucyB1cCBlcnJvciBsaXN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9ycyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFcnJvcnMoKSB7CiAgICAgICAgdmFyIGVycm9ycyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLl9lcnJvcnMpOwogICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdOwogICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBHZXQgZXJyb3JzIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9yU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVycm9yU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ycygpLm1hcChmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LAogICAgICAgICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlOwogICAgICAgICAgcmV0dXJuICInIi5jb25jYXQoa2V5LCAiJyBmYWlsZWQgd2l0aDogIikuY29uY2F0KG1lc3NhZ2UsICIuIik7CiAgICAgICAgfSkuam9pbignXG4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhZGRlZCB0byB0aGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldExhc3RFcnJvciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXN0RXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBpdCBjYW4gc3RvcmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0TWF4RXJyb3JOdW0iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWF4RXJyb3JOdW0obnVtKSB7CiAgICAgICAgdGhpcy5fbWF4TnVtRXJyb3JzID0gbnVtOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZFcnJvcjsKICB9KCk7CgogIGNvbnN0IHNpbWQ9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkkMSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZiQxKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YkMSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMSh0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KICB2YXIgUFZfU1RBVFVTX1NVQ0NFU1MgPSAxMDAwMDsKICB2YXIgTUFYX1BDTV9MRU5HVEhfU0VDID0gNjAgKiAxNTsKICB2YXIgRWFnbGVCYXNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEVhZ2xlQmFzZShoYW5kbGVXYXNtKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlQmFzZSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZTdGF0dXNUb1N0cmluZyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfd2FzbU1lbW9yeSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfYWxpZ25lZEFsbG9jIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9wdkZyZWUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX21lbW9yeUJ1ZmZlciIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfbWVtb3J5QnVmZmVyVWludDgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX21lbW9yeUJ1ZmZlclZpZXciLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2Z1bmN0aW9uTXV0ZXgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2RXJyb3IiLCB2b2lkIDApOwogICAgICBFYWdsZUJhc2UuX3NhbXBsZVJhdGUgPSBoYW5kbGVXYXNtLnNhbXBsZVJhdGU7CiAgICAgIEVhZ2xlQmFzZS5fdmVyc2lvbiA9IGhhbmRsZVdhc20udmVyc2lvbjsKICAgICAgdGhpcy5fcHZTdGF0dXNUb1N0cmluZyA9IGhhbmRsZVdhc20ucHZTdGF0dXNUb1N0cmluZzsKICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IGhhbmRsZVdhc20ubWVtb3J5OwogICAgICB0aGlzLl9hbGlnbmVkQWxsb2MgPSBoYW5kbGVXYXNtLmFsaWduZWRBbGxvYzsKICAgICAgdGhpcy5fcHZGcmVlID0gaGFuZGxlV2FzbS5wdkZyZWU7CiAgICAgIHRoaXMuX3B2RXJyb3IgPSBoYW5kbGVXYXNtLnB2RXJyb3I7CiAgICAgIHRoaXMuX21lbW9yeUJ1ZmZlciA9IG5ldyBJbnQxNkFycmF5KGhhbmRsZVdhc20ubWVtb3J5LmJ1ZmZlcik7CiAgICAgIHRoaXMuX21lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoaGFuZGxlV2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgICAgdGhpcy5fbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhoYW5kbGVXYXNtLm1lbW9yeS5idWZmZXIpOwogICAgICB0aGlzLl9mdW5jdGlvbk11dGV4ID0gbmV3IE11dGV4KCk7CiAgICB9CiAgICAvKioNCiAgICAgKiBBdWRpbyBzYW1wbGUgcmF0ZSByZXF1aXJlZCBieSBFYWdsZS4NCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlQmFzZSwgW3sKICAgICAga2V5OiAic2FtcGxlUmF0ZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZUJhc2UuX3NhbXBsZVJhdGU7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBWZXJzaW9uIG9mIEVhZ2xlLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInZlcnNpb24iLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGVCYXNlLl92ZXJzaW9uOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogU2V0IGJhc2U2NCB3YXNtIGZpbGUuDQogICAgICAgKiBAcGFyYW0gd2FzbSBCYXNlNjQnZCB3YXNtIGZpbGUgdG8gdXNlIHRvIGluaXRpYWxpemUgd2FzbS4NCiAgICAgICAqLwogICAgfV0sIFt7CiAgICAgIGtleTogInNldFdhc20iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2FzbSh3YXNtKSB7CiAgICAgICAgaWYgKHRoaXMuX3dhc20gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fd2FzbSA9IHdhc207CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogU2V0IGJhc2U2NCB3YXNtIGZpbGUgd2l0aCBTSU1EIGZlYXR1cmUuDQogICAgICAgKiBAcGFyYW0gd2FzbVNpbWQgQmFzZTY0J2Qgd2FzbSBmaWxlIHRvIHVzZSB0byBpbml0aWFsaXplIHdhc20uDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0V2FzbVNpbWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V2FzbVNpbWQod2FzbVNpbWQpIHsKICAgICAgICBpZiAodGhpcy5fd2FzbVNpbWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fd2FzbVNpbWQgPSB3YXNtU2ltZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2luaXRCYXNlV2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0QmFzZVdhc20yID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlKHdhc21CYXNlNjQsIHdhc21NZW1vcnlTaXplKSB7CiAgICAgICAgICB2YXIgbWVtb3J5LCBtZW1vcnlCdWZmZXJVaW50OCwgcHZFcnJvciwgZXhwb3J0cywgYWxpZ25lZF9hbGxvYywgcHZfZnJlZSwgcHZfZWFnbGVfdmVyc2lvbiwgcHZfc2FtcGxlX3JhdGUsIHB2X3N0YXR1c190b19zdHJpbmcsIHNhbXBsZVJhdGUsIHZlcnNpb25BZGRyZXNzLCB2ZXJzaW9uOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIC8vIEEgV2ViQXNzZW1ibHkgcGFnZSBoYXMgYSBjb25zdGFudCBzaXplIG9mIDY0S2lCLiAtPiAxTWlCIH49IDE2IHBhZ2VzCiAgICAgICAgICAgICAgICBtZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsKICAgICAgICAgICAgICAgICAgaW5pdGlhbDogd2FzbU1lbW9yeVNpemUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPSBuZXcgUHZFcnJvcigpOwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7CiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRXYXNtKG1lbW9yeSwgd2FzbUJhc2U2NCwgcHZFcnJvcik7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgZXhwb3J0cyA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICAgICAgICAgICAgcHZfZnJlZSA9IGV4cG9ydHMucHZfZnJlZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3ZlcnNpb24gPSBleHBvcnRzLnB2X2VhZ2xlX3ZlcnNpb247CiAgICAgICAgICAgICAgICBwdl9zYW1wbGVfcmF0ZSA9IGV4cG9ydHMucHZfc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICBwdl9zdGF0dXNfdG9fc3RyaW5nID0gZXhwb3J0cy5wdl9zdGF0dXNfdG9fc3RyaW5nOwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X3NhbXBsZV9yYXRlKCk7CiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3ZlcnNpb24oKTsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgdmVyc2lvbkFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgdmVyc2lvbiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCB2ZXJzaW9uQWRkcmVzcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgICBhbGlnbmVkQWxsb2M6IGFsaWduZWRfYWxsb2MsCiAgICAgICAgICAgICAgICAgIHB2RnJlZTogcHZfZnJlZSwKICAgICAgICAgICAgICAgICAgcHZFcnJvcjogcHZFcnJvciwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgcHZTdGF0dXNUb1N0cmluZzogcHZfc3RhdHVzX3RvX3N0cmluZywKICAgICAgICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIF9pbml0QmFzZVdhc20oX3gsIF94MikgewogICAgICAgICAgcmV0dXJuIF9pbml0QmFzZVdhc20yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdEJhc2VXYXNtOwogICAgICB9KCkKICAgIH1dKTsKICAgIHJldHVybiBFYWdsZUJhc2U7CiAgfSgpOwogIC8qKg0KICAgKiBKYXZhU2NyaXB0L1dlYkFzc2VtYmx5IGJpbmRpbmcgZm9yIHRoZSBwcm9maWxlciBvZiB0aGUgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBlbmdpbmUuDQogICAqIEl0IGVucm9sbHMgYSBzcGVha2VyIGdpdmVuIGEgc2V0IG9mIHV0dGVyYW5jZXMgYW5kIHRoZW4gY29uc3RydWN0cyBhIHByb2ZpbGUgZm9yIHRoZSBlbnJvbGxlZCBzcGVha2VyLg0KICAgKi8KICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfc2FtcGxlUmF0ZSIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX3ZlcnNpb24iLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl93YXNtIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfd2FzbVNpbWQiLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl9lYWdsZU11dGV4IiwgbmV3IE11dGV4KCkpOwogIHZhciBFYWdsZVByb2ZpbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWFnbGVCYXNlKSB7CiAgICBfaW5oZXJpdHMkMShFYWdsZVByb2ZpbGVyLCBfRWFnbGVCYXNlKTsKICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRWFnbGVQcm9maWxlcik7CiAgICBmdW5jdGlvbiBFYWdsZVByb2ZpbGVyKGhhbmRsZVdhc20pIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBFYWdsZVByb2ZpbGVyKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBoYW5kbGVXYXNtKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlckVucm9sbCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfcHZFYWdsZVByb2ZpbGVyRXhwb3J0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJSZXNldCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfb2JqZWN0QWRkcmVzcyIsIHZvaWQgMCk7CiAgICAgIEVhZ2xlUHJvZmlsZXIuX21pbkVucm9sbFNhbXBsZXMgPSBoYW5kbGVXYXNtLm1pbkVucm9sbFNhbXBsZXM7CiAgICAgIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplID0gaGFuZGxlV2FzbS5wcm9maWxlU2l6ZTsKICAgICAgRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcyA9IE1BWF9QQ01fTEVOR1RIX1NFQyAqIEVhZ2xlUHJvZmlsZXIuX3NhbXBsZVJhdGU7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9maWxlckRlbGV0ZTsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlckVucm9sbCA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyRW5yb2xsOwogICAgICBfdGhpcy5fcHZFYWdsZVByb2ZpbGVyRXhwb3J0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJFeHBvcnQ7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJSZXNldCA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyUmVzZXQ7CiAgICAgIF90aGlzLl9vYmplY3RBZGRyZXNzID0gaGFuZGxlV2FzbS5vYmplY3RBZGRyZXNzOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBUaGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGlucHV0IHBjbSByZXF1aXJlZCBieSBgLmVucm9sbCgpYC4NCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlUHJvZmlsZXIsIFt7CiAgICAgIGtleTogIm1pbkVucm9sbFNhbXBsZXMiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5fbWluRW5yb2xsU2FtcGxlczsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgcHJvZmlsZXIgY29tcG9uZW50IG9mIHRoZSBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIEVuZ2luZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0gYWNjZXNzS2V5IEFjY2Vzc0tleSBvYnRhaW5lZCBmcm9tIFBpY292b2ljZSBDb25zb2xlIChodHRwczovL2NvbnNvbGUucGljb3ZvaWNlLmFpLykuDQogICAgICAgKiBAcGFyYW0gbW9kZWwgRWFnbGUgbW9kZWwgb3B0aW9ucy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5iYXNlNjQgVGhlIG1vZGVsIGluIGJhc2U2NCBzdHJpbmcgdG8gaW5pdGlhbGl6ZSBFYWdsZS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5wdWJsaWNQYXRoIFRoZSBtb2RlbCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaWMgZGlyZWN0b3J5Lg0KICAgICAgICogQHBhcmFtIG1vZGVsLmN1c3RvbVdyaXRlUGF0aCBDdXN0b20gcGF0aCB0byBzYXZlIHRoZSBtb2RlbCBpbiBzdG9yYWdlLg0KICAgICAgICogU2V0IHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gdXNlIG11bHRpcGxlIG1vZGVscyBhY3Jvc3MgYGVhZ2xlYCBpbnN0YW5jZXMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuZm9yY2VXcml0ZSBGbGFnIHRvIG92ZXJ3cml0ZSB0aGUgbW9kZWwgaW4gc3RvcmFnZSBldmVuIGlmIGl0IGV4aXN0cy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC52ZXJzaW9uIFZlcnNpb24gb2YgdGhlIG1vZGVsIGZpbGUuIEluY3JlbWVudCB0byB1cGRhdGUgdGhlIG1vZGVsIGZpbGUgaW4gc3RvcmFnZS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBFYWdsZSBQcm9maWxlci4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJlbnJvbGwiLAogICAgICB2YWx1ZToKICAgICAgLyoqDQogICAgICAgKiBFbnJvbGxzIGEgc3BlYWtlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IHV0dGVyYW5jZXMgb2YgdGhlIHNhbWUgc3BlYWtlcg0KICAgICAgICogdW50aWwgYHBlcmNlbnRhZ2VgIHJlYWNoZXMgYDEwMC4wYCwgYXQgd2hpY2ggcG9pbnQgYSBzcGVha2VyIHZvaWNlIHByb2ZpbGUgY2FuIGJlIGV4cG9ydGVkIHVzaW5nIGAuZXhwb3J0KClgLg0KICAgICAgICogQW55IGZ1cnRoZXIgZW5yb2xsbWVudCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSBzcGVha2VyIHByb2ZpbGUuIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgcGNtIHRvDQogICAgICAgKiBgLmVucm9sbCgpYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBgLm1pbkVucm9sbFNhbXBsZXNgLg0KICAgICAgICogVGhlIGF1ZGlvIGRhdGEgdXNlZCBmb3IgZW5yb2xsbWVudCBzaG91bGQgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoNCiAgICAgICAqICAgIC0gb25seSBvbmUgc3BlYWtlciBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgYXVkaW8NCiAgICAgICAqICAgIC0gdGhlIHNwZWFrZXIgc2hvdWxkIGJlIHNwZWFraW5nIGluIGEgbm9ybWFsIHZvaWNlDQogICAgICAgKiAgICAtIHRoZSBhdWRpbyBzaG91bGQgY29udGFpbiBubyBzcGVlY2ggZnJvbSBvdGhlciBzcGVha2VycyBhbmQgbm8gb3RoZXIgc291bmRzIChlLmcuIG11c2ljKQ0KICAgICAgICogICAgLSBpdCBzaG91bGQgYmUgY2FwdHVyZWQgaW4gYSBxdWlldCBlbnZpcm9ubWVudCB3aXRoIG5vIGJhY2tncm91bmQgbm9pc2UNCiAgICAgICAqIEBwYXJhbSBwY20gQXVkaW8gZGF0YSBmb3IgZW5yb2xsbWVudC4gVGhlIGF1ZGlvIG5lZWRzIHRvIGhhdmUgYSBzYW1wbGUgcmF0ZSBlcXVhbCB0byBgLnNhbXBsZVJhdGVgIGFuZCBiZQ0KICAgICAgICogMTYtYml0IGxpbmVhcmx5LWVuY29kZWQuIEVhZ2xlUHJvZmlsZXIgb3BlcmF0ZXMgb24gc2luZ2xlLWNoYW5uZWwgYXVkaW8uDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBUaGUgcGVyY2VudGFnZSBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIHNwZWFrZXIgZW5yb2xsbWVudCBwcm9jZXNzIGFsb25nIHdpdGggdGhlIGZlZWRiYWNrIGNvZGUNCiAgICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgZW5yb2xsbWVudCBhdHRlbXB0Og0KICAgICAgICogICAgLSBgQVVESU9fT0tgOiBUaGUgYXVkaW8gaXMgZ29vZCBmb3IgZW5yb2xsbWVudC4NCiAgICAgICAqICAgIC0gYEFVRElPX1RPT19TSE9SVGA6IEF1ZGlvIGxlbmd0aCBpcyBpbnN1ZmZpY2llbnQgZm9yIGVucm9sbG1lbnQsDQogICAgICAgKiAgICAgICBpLmUuIGl0IGlzIHNob3J0ZXIgdGhhbmAubWluX2Vucm9sbF9zYW1wbGVzYC4NCiAgICAgICAqICAgIC0gYFVOS05PV05fU1BFQUtFUmA6IFRoZXJlIGlzIGFub3RoZXIgc3BlYWtlciBpbiB0aGUgYXVkaW8gdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlYWtlcg0KICAgICAgICogICAgICAgYmVpbmcgZW5yb2xsZWQuIFRvbyBtdWNoIGJhY2tncm91bmQgbm9pc2UgbWF5IGNhdXNlIHRoaXMgZXJyb3IgYXMgd2VsbC4NCiAgICAgICAqICAgIC0gYE5PX1ZPSUNFX0ZPVU5EYDogVGhlIGF1ZGlvIGRvZXMgbm90IGNvbnRhaW4gYW55IHZvaWNlLCBpLmUuIGl0IGlzIHNpbGVudCBvcg0KICAgICAgICogICAgICAgaGFzIGEgbG93IHNpZ25hbC10by1ub2lzZSByYXRpby4NCiAgICAgICAqICAgIC0gYFFVQUxJVFlfSVNTVUVgOiBUaGUgYXVkaW8gcXVhbGl0eSBpcyB0b28gbG93IGZvciBlbnJvbGxtZW50IGR1ZSB0byBhIGJhZCBtaWNyb3Bob25lDQogICAgICAgKiAgICAgICBvciByZWNvcmRpbmcgZW52aXJvbm1lbnQuDQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfZW5yb2xsID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhwY20pIHsKICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAocGNtIGluc3RhbmNlb2YgSW50MTZBcnJheSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYXJndW1lbnQgJ3BjbScgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBJbnQxNkFycmF5Iik7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgaWYgKCEocGNtLmxlbmd0aCA+IEVhZ2xlUHJvZmlsZXIuX21heEVucm9sbFNhbXBsZXMpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIidwY20nIHNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gIi5jb25jYXQoRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcykpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMi5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwY21BZGRyZXNzLCBtZW1vcnlCdWZmZXJJbnQxNiwgZmVlZGJhY2tBZGRyZXNzLCBwZXJjZW50YWdlQWRkcmVzcywgc3RhdHVzLCBmZWVkYmFjaywgcGVyY2VudGFnZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzMi5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5lbnJvbGwoKWAgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwY20ubGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwY21BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczIuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrQWRkcmVzcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZlZWRiYWNrQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZUFkZHJlc3MgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZXJjZW50YWdlQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkVhZ2xlUHJvZmlsZXJFbnJvbGwoX3RoaXMyLl9vYmplY3RBZGRyZXNzLCBwY21BZGRyZXNzLCBwY20ubGVuZ3RoLCBmZWVkYmFja0FkZHJlc3MsIHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwY21BZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShmZWVkYmFja0FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIudDEgPSAiZW5yb2xsIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MyA9IF90aGlzMi5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzMzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ0ID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ1ID0gKDAsIF9jb250ZXh0Mi50MikoX2NvbnRleHQyLnQzLCBfY29udGV4dDIudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50NiA9IF9jb250ZXh0Mi50MS5jb25jYXQuY2FsbChfY29udGV4dDIudDEsIF9jb250ZXh0Mi50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrID0gX3RoaXMyLl9tZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKGZlZWRiYWNrQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0MDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkZyZWUoZmVlZGJhY2tBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gX3RoaXMyLl9tZW1vcnlCdWZmZXJWaWV3LmdldEZsb2F0MzIocGVyY2VudGFnZUFkZHJlc3MsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2s6IGZlZWRiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZTogcGVyY2VudGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gZW5yb2xsKF94MykgewogICAgICAgICAgcmV0dXJuIF9lbnJvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVucm9sbDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogRXhwb3J0cyB0aGUgc3BlYWtlciBwcm9maWxlIG9mIHRoZSBjdXJyZW50IHNlc3Npb24uDQogICAgICAgKiBXaWxsIHRocm93IGVycm9yIGlmIHRoZSBwcm9maWxlIGlzIG5vdCByZWFkeS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEFuIEVhZ2xlUHJvZmlsZSBvYmplY3QuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAiZXhwb3J0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2V4cG9ydDIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KCkgewogICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMy5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9maWxlQWRkcmVzcywgc3RhdHVzLCBwcm9maWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLmV4cG9ydCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBFYWdsZVByb2ZpbGVyLl9wcm9maWxlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQoX3RoaXMzLl9vYmplY3RBZGRyZXNzLCBwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDExOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQxID0gImV4cG9ydCBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDMgPSBfdGhpczMuX21lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NCA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NSA9ICgwLCBfY29udGV4dDQudDIpKF9jb250ZXh0NC50MywgX2NvbnRleHQ0LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDYgPSBfY29udGV4dDQudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ0LnQxLCBfY29udGV4dDQudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDQudDAoX2NvbnRleHQ0LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gX3RoaXMzLl9tZW1vcnlCdWZmZXJVaW50OC5zbGljZShwcm9maWxlQWRkcmVzcyAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHByb2ZpbGVBZGRyZXNzIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTUpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfZXhwb3J0KCkgewogICAgICAgICAgcmV0dXJuIF9leHBvcnQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXhwb3J0OwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZW5yb2xsbWVudCBzZXNzaW9uLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3Jlc2V0ID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNygpIHsKICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczQuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTYkKF9jb250ZXh0NikgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXM0Ll93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0KClgIGFmdGVyIHJlbGVhc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9wdkVhZ2xlUHJvZmlsZXJSZXNldChfdGhpczQuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IF90aGlzNC5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM0Ll9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQ0ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQ1ID0gKDAsIF9jb250ZXh0Ni50MikoX2NvbnRleHQ2LnQzLCBfY29udGV4dDYudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NiA9IF9jb250ZXh0Ni50MS5jb25jYXQuY2FsbChfY29udGV4dDYudDEsIF9jb250ZXh0Ni50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Ni50MChfY29udGV4dDYudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU2KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU3KTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICByZXR1cm4gX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlIFByb2ZpbGVyDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlOCgpIHsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B2RWFnbGVQcm9maWxlckRlbGV0ZSh0aGlzLl9vYmplY3RBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fd2FzbU1lbW9yeTsKICAgICAgICAgICAgICAgIHRoaXMuX3dhc21NZW1vcnkgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTgsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWxlYXNlKCkgewogICAgICAgICAgcmV0dXJuIF9yZWxlYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWxlYXNlOwogICAgICB9KCkKICAgIH1dLCBbewogICAgICBrZXk6ICJjcmVhdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfY3JlYXRlID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlOShhY2Nlc3NLZXksIG1vZGVsKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU5JChfY29udGV4dDkpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ5LnByZXYgPSBfY29udGV4dDkubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aCA9IG1vZGVsLmN1c3RvbVdyaXRlUGF0aCA/IG1vZGVsLmN1c3RvbVdyaXRlUGF0aCA6ICdlYWdsZV9tb2RlbCc7CiAgICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZE1vZGVsKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW9kZWwpLCB7fSwgewogICAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGg6IGN1c3RvbVdyaXRlUGF0aAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIG1vZGVsUGF0aCA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5hYnJ1cHQoInJldHVybiIsIEVhZ2xlUHJvZmlsZXIuX2luaXQoYWNjZXNzS2V5LCBtb2RlbFBhdGgpKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlOSk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDQsIF94NSkgewogICAgICAgICAgcmV0dXJuIF9jcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTEoYWNjZXNzS2V5LCBtb2RlbFBhdGgpIHsKICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTEkKF9jb250ZXh0MTEpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMS5wcmV2ID0gX2NvbnRleHQxMS5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgaWYgKGlzQWNjZXNzS2V5VmFsaWQoYWNjZXNzS2V5KSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDExLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBY2Nlc3NLZXknKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMS5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGVQcm9maWxlci5fZWFnbGVNdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNTaW1kLCB3YXNtT3V0cHV0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEwJChfY29udGV4dDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEwLnByZXYgPSBfY29udGV4dDEwLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2ltZCA9IF9jb250ZXh0MTAuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFYWdsZVByb2ZpbGVyLl9pbml0UHJvZmlsZXJXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBpc1NpbWQgPyBfdGhpczUuX3dhc21TaW1kIDogX3RoaXM1Ll93YXNtKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21PdXRwdXQgPSBfY29udGV4dDEwLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuYWJydXB0KCJyZXR1cm4iLCBuZXcgRWFnbGVQcm9maWxlcih3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTEwKTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTEpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDYsIF94NykgewogICAgICAgICAgcmV0dXJuIF9pbml0Mi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2luaXQ7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdFByb2ZpbGVyV2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0UHJvZmlsZXJXYXNtMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEyKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwdl9lYWdsZV9wcm9maWxlcl9pbml0LCBwdl9lYWdsZV9wcm9maWxlcl9kZWxldGUsIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCwgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcywgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0LCBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZSwgcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQsIG9iamVjdEFkZHJlc3NBZGRyZXNzLCBhY2Nlc3NLZXlBZGRyZXNzLCBpLCBtb2RlbFBhdGhFbmNvZGVkLCBtb2RlbFBhdGhBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MsIF9tc2csIG1pbkVucm9sbFNhbXBsZXMsIHByb2ZpbGVTaXplQWRkcmVzcywgX21zZzIsIHByb2ZpbGVTaXplOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTIkKF9jb250ZXh0MTIpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMi5wcmV2ID0gX2NvbnRleHQxMi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZiQxKEVhZ2xlUHJvZmlsZXIpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzUwMCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfaW5pdCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfaW5pdDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZSA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9lbnJvbGw7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9wcm9maWxlcl9leHBvcnQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZSA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemU7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9yZXNldCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0QWRkcmVzc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxODsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKGFjY2Vzc0tleS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICBhY2Nlc3NLZXlBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEoYWNjZXNzS2V5QWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjE7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2Nlc3NLZXkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYWNjZXNzS2V5QWRkcmVzcyArIGldID0gYWNjZXNzS2V5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgYWNjZXNzS2V5Lmxlbmd0aF0gPSAwOwogICAgICAgICAgICAgICAgbW9kZWxQYXRoRW5jb2RlZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtb2RlbFBhdGgpOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChtb2RlbFBhdGhFbmNvZGVkLmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgIG1vZGVsUGF0aEFkZHJlc3MgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShtb2RlbFBhdGhBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAyOTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KG1vZGVsUGF0aEVuY29kZWQsIG1vZGVsUGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbbW9kZWxQYXRoQWRkcmVzcyArIG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAzMzsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9wcm9maWxlcl9pbml0KGFjY2Vzc0tleUFkZHJlc3MsIG1vZGVsUGF0aEFkZHJlc3MsIG9iamVjdEFkZHJlc3NBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKGFjY2Vzc0tleUFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAzODsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUobW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDAgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2luaXQnIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MiA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNDQ7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NCA9ICgwLCBfY29udGV4dDEyLnQxKShfY29udGV4dDEyLnQyLCBfY29udGV4dDEyLnQzKTsKICAgICAgICAgICAgICAgIG1zZyA9IF9jb250ZXh0MTIudDAuY29uY2F0LmNhbGwoX2NvbnRleHQxMi50MCwgX2NvbnRleHQxMi50NCk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG1zZywgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJWaWV3ID0gbmV3IERhdGFWaWV3KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzcyA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0SW50MzIob2JqZWN0QWRkcmVzc0FkZHJlc3MsIHRydWUpOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTI7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKG9iamVjdEFkZHJlc3NBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTQ7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNTQ6CiAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA1NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDU3OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTk7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcyhvYmplY3RBZGRyZXNzLCBtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDcwOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDUgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMnIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50NyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNjY7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgNjY6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQ4ID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50OSA9ICgwLCBfY29udGV4dDEyLnQ2KShfY29udGV4dDEyLnQ3LCBfY29udGV4dDEyLnQ4KTsKICAgICAgICAgICAgICAgIF9tc2cgPSBfY29udGV4dDEyLnQ1LmNvbmNhdC5jYWxsKF9jb250ZXh0MTIudDUsIF9jb250ZXh0MTIudDkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChfbXNnLCAiXG5EZXRhaWxzOiAiKS5jb25jYXQoYmFzZVdhc21PdXRwdXQucHZFcnJvci5nZXRFcnJvclN0cmluZygpKSk7CiAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgIG1pbkVucm9sbFNhbXBsZXMgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDczOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgcHJvZmlsZVNpemVBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZVNpemVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3ODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gODA7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUob2JqZWN0QWRkcmVzcywgcHJvZmlsZVNpemVBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gOTE7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTAgPSAiJ3B2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplJyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDExID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMiA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gODc7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgIGNhc2UgODc6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDE0ID0gKDAsIF9jb250ZXh0MTIudDExKShfY29udGV4dDEyLnQxMiwgX2NvbnRleHQxMi50MTMpOwogICAgICAgICAgICAgICAgX21zZzIgPSBfY29udGV4dDEyLnQxMC5jb25jYXQuY2FsbChfY29udGV4dDEyLnQxMCwgX2NvbnRleHQxMi50MTQpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChfbXNnMiwgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICBwcm9maWxlU2l6ZSA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0SW50MzIocHJvZmlsZVNpemVBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDk0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShwcm9maWxlU2l6ZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMi5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzOiBtaW5FbnJvbGxTYW1wbGVzLAogICAgICAgICAgICAgICAgICBwcm9maWxlU2l6ZTogcHJvZmlsZVNpemUsCiAgICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3M6IG9iamVjdEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlckRlbGV0ZTogcHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJFbnJvbGw6IHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCwKICAgICAgICAgICAgICAgICAgcHZFYWdsZVByb2ZpbGVyRXhwb3J0OiBwdl9lYWdsZV9wcm9maWxlcl9leHBvcnQsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlclJlc2V0OiBwdl9lYWdsZV9wcm9maWxlcl9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTEyLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXRQcm9maWxlcldhc20oX3g4LCBfeDksIF94MTApIHsKICAgICAgICAgIHJldHVybiBfaW5pdFByb2ZpbGVyV2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0UHJvZmlsZXJXYXNtOwogICAgICB9KCkKICAgIH1dKTsKICAgIHJldHVybiBFYWdsZVByb2ZpbGVyOwogIH0oRWFnbGVCYXNlKTsKICAvKioNCiAgICogSmF2YVNjcmlwdC9XZWJBc3NlbWJseSBiaW5kaW5nIGZvciBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIGVuZ2luZS4NCiAgICogSXQgcHJvY2Vzc2VzIGluY29taW5nIGF1ZGlvIGluIGNvbnNlY3V0aXZlIGZyYW1lcyBhbmQgZW1pdHMgYSBzaW1pbGFyaXR5IHNjb3JlIGZvciBlYWNoIGVucm9sbGVkIHNwZWFrZXIuDQogICAqLwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlUHJvZmlsZXIsICJfbWF4RW5yb2xsU2FtcGxlcyIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVQcm9maWxlciwgIl9taW5FbnJvbGxTYW1wbGVzIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZVByb2ZpbGVyLCAiX3Byb2ZpbGVTaXplIiwgdm9pZCAwKTsKICB2YXIgRWFnbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FYWdsZUJhc2UyKSB7CiAgICBfaW5oZXJpdHMkMShFYWdsZSwgX0VhZ2xlQmFzZTIpOwogICAgdmFyIF9zdXBlcjIgPSBfY3JlYXRlU3VwZXIoRWFnbGUpOwogICAgZnVuY3Rpb24gRWFnbGUoaGFuZGxlV2FzbSkgewogICAgICB2YXIgX3RoaXM2OwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBFYWdsZSk7CiAgICAgIF90aGlzNiA9IF9zdXBlcjIuY2FsbCh0aGlzLCBoYW5kbGVXYXNtKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfcHZFYWdsZURlbGV0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVQcm9jZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfcHZFYWdsZVJlc2V0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfb2JqZWN0QWRkcmVzcyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3Njb3Jlc0FkZHJlc3MiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9udW1TcGVha2VycyIsIHZvaWQgMCk7CiAgICAgIEVhZ2xlLl9mcmFtZUxlbmd0aCA9IGhhbmRsZVdhc20uZnJhbWVMZW5ndGg7CiAgICAgIF90aGlzNi5fcHZFYWdsZURlbGV0ZSA9IGhhbmRsZVdhc20ucHZFYWdsZURlbGV0ZTsKICAgICAgX3RoaXM2Ll9wdkVhZ2xlUHJvY2VzcyA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2Nlc3M7CiAgICAgIF90aGlzNi5fcHZFYWdsZVJlc2V0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUmVzZXQ7CiAgICAgIF90aGlzNi5fb2JqZWN0QWRkcmVzcyA9IGhhbmRsZVdhc20ub2JqZWN0QWRkcmVzczsKICAgICAgX3RoaXM2Ll9zY29yZXNBZGRyZXNzID0gaGFuZGxlV2FzbS5zY29yZXNBZGRyZXNzOwogICAgICBfdGhpczYuX251bVNwZWFrZXJzID0gaGFuZGxlV2FzbS5udW1TcGVha2VyczsKICAgICAgcmV0dXJuIF90aGlzNjsKICAgIH0KICAgIC8qKg0KICAgICAqIE51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBlciBmcmFtZSBleHBlY3RlZCBieSBFYWdsZSAoaS5lLiBsZW5ndGggb2YgdGhlIGFycmF5IHBhc3NlZCBpbnRvIGAucHJvY2VzcygpYCkNCiAgICAgKi8KICAgIF9jcmVhdGVDbGFzcyQxKEVhZ2xlLCBbewogICAgICBrZXk6ICJmcmFtZUxlbmd0aCIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZS5fZnJhbWVMZW5ndGg7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBQaWNvdm9pY2UgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBFbmdpbmUuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIGFjY2Vzc0tleTogQWNjZXNzS2V5IG9idGFpbmVkIGZyb20gUGljb3ZvaWNlIENvbnNvbGUgKGh0dHBzOi8vY29uc29sZS5waWNvdm9pY2UuYWkvKQ0KICAgICAgICogQHBhcmFtIG1vZGVsIEVhZ2xlIG1vZGVsIG9wdGlvbnMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuYmFzZTY0IFRoZSBtb2RlbCBpbiBiYXNlNjQgc3RyaW5nIHRvIGluaXRpYWxpemUgRWFnbGUuDQogICAgICAgKiBAcGFyYW0gbW9kZWwucHVibGljUGF0aCBUaGUgbW9kZWwgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGljIGRpcmVjdG9yeS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggQ3VzdG9tIHBhdGggdG8gc2F2ZSB0aGUgbW9kZWwgaW4gc3RvcmFnZS4NCiAgICAgICAqIFNldCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIHVzZSBtdWx0aXBsZSBtb2RlbHMgYWNyb3NzIGBlYWdsZWAgaW5zdGFuY2VzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmZvcmNlV3JpdGUgRmxhZyB0byBvdmVyd3JpdGUgdGhlIG1vZGVsIGluIHN0b3JhZ2UgZXZlbiBpZiBpdCBleGlzdHMuDQogICAgICAgKiBAcGFyYW0gbW9kZWwudmVyc2lvbiBWZXJzaW9uIG9mIHRoZSBtb2RlbCBmaWxlLiBJbmNyZW1lbnQgdG8gdXBkYXRlIHRoZSBtb2RlbCBmaWxlIGluIHN0b3JhZ2UuDQogICAgICAgKiBAcGFyYW0gc3BlYWtlclByb2ZpbGVzIE9uZSBvciBtb3JlIEVhZ2xlIHNwZWFrZXIgcHJvZmlsZXMuIFRoZXNlIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyBgRWFnbGVQcm9maWxlcmAuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgRWFnbGUgZW5naW5lLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInByb2Nlc3MiLAogICAgICB2YWx1ZToKICAgICAgLyoqDQogICAgICAgKiBQcm9jZXNzZXMgYSBmcmFtZSBvZiBhdWRpbyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygc2ltaWxhcml0eSBzY29yZXMgZm9yIGVhY2ggc3BlYWtlciBwcm9maWxlLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBwY20gQSBmcmFtZSBvZiBhdWRpbyBzYW1wbGVzLiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lIGNhbiBiZSBhdHRhaW5lZCBieSBjYWxsaW5nDQogICAgICAgKiBgLmZyYW1lTGVuZ3RoYC4gVGhlIGluY29taW5nIGF1ZGlvIG5lZWRzIHRvIGhhdmUgYSBzYW1wbGUgcmF0ZSBlcXVhbCB0byBgLnNhbXBsZVJhdGVgIGFuZCBiZSAxNi1iaXQNCiAgICAgICAqIGxpbmVhcmx5LWVuY29kZWQuIEVhZ2xlIG9wZXJhdGVzIG9uIHNpbmdsZS1jaGFubmVsIGF1ZGlvLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIHNpbWlsYXJpdHkgc2NvcmVzIGZvciBlYWNoIHNwZWFrZXIgcHJvZmlsZS4gQSBoaWdoZXIgc2NvcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHZvaWNlDQogICAgICAgKiBiZWxvbmdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNwZWFrZXIuIFRoZSByYW5nZSBpcyBbMCwgMV0gd2l0aCAxLjAgcmVwcmVzZW50aW5nIGEgcGVyZmVjdCBtYXRjaC4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9wcm9jZXNzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTQocGNtKSB7CiAgICAgICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE0JChfY29udGV4dDE0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTQucHJldiA9IF9jb250ZXh0MTQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChwY20gaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYXJndW1lbnQgJ3BjbScgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBJbnQxNkFycmF5Iik7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgaWYgKCEocGNtLmxlbmd0aCAhPT0gRWFnbGUuX2ZyYW1lTGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTGVuZ3RoIG9mIGlucHV0IGZyYW1lICgiLmNvbmNhdChwY20ubGVuZ3RoLCAiKSBkb2VzIG5vdCBtYXRjaCByZXF1aXJlZCBmcmFtZSBsZW5ndGggKCIpLmNvbmNhdChFYWdsZS5fZnJhbWVMZW5ndGgsICIpIikpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczcuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTMoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBjbUFkZHJlc3MsIG1lbW9yeUJ1ZmZlckludDE2LCBzdGF0dXMsIHNjb3JlcywgaTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMyQoX2NvbnRleHQxMykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMy5wcmV2ID0gX2NvbnRleHQxMy5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczcuX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnByb2Nlc3NgIGFmdGVyIHJlbGVhc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNy5fYWxpZ25lZEFsbG9jKEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHBjbS5sZW5ndGggKiBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgIHBjbUFkZHJlc3MgPSBfY29udGV4dDEzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczcuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdkVhZ2xlUHJvY2VzcyhfdGhpczcuX29iamVjdEFkZHJlc3MsIHBjbUFkZHJlc3MsIF90aGlzNy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDEzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNy5fcHZGcmVlKHBjbUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAyMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MSA9ICJwcm9jZXNzIGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQzID0gX3RoaXM3Ll9tZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50NCA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQ1ID0gKDAsIF9jb250ZXh0MTMudDIpKF9jb250ZXh0MTMudDMsIF9jb250ZXh0MTMudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDYgPSBfY29udGV4dDEzLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MTMudDEsIF9jb250ZXh0MTMudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDEzLnQwKF9jb250ZXh0MTMudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfdGhpczcuX251bVNwZWFrZXJzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3Jlcy5wdXNoKF90aGlzNy5fbWVtb3J5QnVmZmVyVmlldy5nZXRGbG9hdDMyKF90aGlzNy5fc2NvcmVzQWRkcmVzcyArIGkgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTMuYWJydXB0KCJyZXR1cm4iLCBzY29yZXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMTMpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHByb2Nlc3MoX3gxMSkgewogICAgICAgICAgcmV0dXJuIF9wcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9jZXNzOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBlbmdpbmUuDQogICAgICAgKiBJdCBpcyBiZXN0IHRvIGNhbGwgYmVmb3JlIHByb2Nlc3NpbmcgYSBuZXcgc2VxdWVuY2Ugb2YgYXVkaW8gKGUuZy4gYSBuZXcgdm9pY2UgaW50ZXJhY3Rpb24pLg0KICAgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFjY3VyYWN5IG9mIHRoZSBlbmdpbmUgaXMgbm90IGFmZmVjdGVkIGJ5IGEgY2hhbmdlIGluIGF1ZGlvIGNvbnRleHQuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVzZXQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTYoKSB7CiAgICAgICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE2JChfY29udGV4dDE2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTYucHJldiA9IF9jb250ZXh0MTYubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczguX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTUoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1czsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNS5wcmV2ID0gX2NvbnRleHQxNS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczguX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0YCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczguX3B2RWFnbGVSZXNldChfdGhpczguX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxNS5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50MSA9ICJyZXNldCBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50MyA9IF90aGlzOC5fbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDQgPSBfY29udGV4dDE1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50NSA9ICgwLCBfY29udGV4dDE1LnQyKShfY29udGV4dDE1LnQzLCBfY29udGV4dDE1LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQ2ID0gX2NvbnRleHQxNS50MS5jb25jYXQuY2FsbChfY29udGV4dDE1LnQxLCBfY29udGV4dDE1LnQ1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX2NvbnRleHQxNS50MChfY29udGV4dDE1LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE1KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICAgIHJldHVybiBfcmVzZXQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkZyZWUodGhpcy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlRGVsZXRlKHRoaXMuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93YXNtTWVtb3J5OwogICAgICAgICAgICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE3LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbGVhc2U7CiAgICAgIH0oKQogICAgfV0sIFt7CiAgICAgIGtleTogImNyZWF0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9jcmVhdGUyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTgoYWNjZXNzS2V5LCBtb2RlbCwgc3BlYWtlclByb2ZpbGVzKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMzsKICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kZWwoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb2RlbCksIHt9LCB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aDogY3VzdG9tV3JpdGVQYXRoCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgbW9kZWxQYXRoID0gX2NvbnRleHQxOC5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguYWJydXB0KCJyZXR1cm4iLCBFYWdsZS5faW5pdChhY2Nlc3NLZXksIG1vZGVsUGF0aCwgIUFycmF5LmlzQXJyYXkoc3BlYWtlclByb2ZpbGVzKSA/IFtzcGVha2VyUHJvZmlsZXNdIDogc3BlYWtlclByb2ZpbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxOCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDEyLCBfeDEzLCBfeDE0KSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMjAoYWNjZXNzS2V5LCBtb2RlbFBhdGgsIHNwZWFrZXJQcm9maWxlcykgewogICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMCQoX2NvbnRleHQyMCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIwLnByZXYgPSBfY29udGV4dDIwLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAoaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFjY2Vzc0tleScpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKCFzcGVha2VyUHJvZmlsZXMgfHwgc3BlYWtlclByb2ZpbGVzLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNwZWFrZXIgcHJvZmlsZXMgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGUuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOS5wcmV2ID0gX2NvbnRleHQxOS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE5Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDE5LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOS5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGUuX2luaXRXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBzcGVha2VyUHJvZmlsZXMsIGlzU2ltZCA/IF90aGlzOS5fd2FzbVNpbWQgOiBfdGhpczkuX3dhc20pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU91dHB1dCA9IF9jb250ZXh0MTkuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5hYnJ1cHQoInJldHVybiIsIG5ldyBFYWdsZSh3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE5KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjAuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMjApOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDE1LCBfeDE2LCBfeDE3KSB7CiAgICAgICAgICByZXR1cm4gX2luaXQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdDsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0V2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgc3BlYWtlclByb2ZpbGVzLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZfZWFnbGVfaW5pdCwgcHZfZWFnbGVfZGVsZXRlLCBwdl9lYWdsZV9wcm9jZXNzLCBwdl9lYWdsZV9mcmFtZV9sZW5ndGgsIHB2X2VhZ2xlX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgbnVtU3BlYWtlcnMsIHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MsIHByb2ZpbGVzQWRkcmVzc0xpc3QsIF9pdGVyYXRvciwgX3N0ZXAsIHByb2ZpbGUsIHByb2ZpbGVBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgc2NvcmVzQWRkcmVzcywgZnJhbWVMZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMSQoX2NvbnRleHQyMSkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIxLnByZXYgPSBfY29udGV4dDIxLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mJDEoRWFnbGUpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzE1MCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2Nlc3MgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2Nlc3M7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9mcmFtZV9sZW5ndGggPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2ZyYW1lX2xlbmd0aDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Jlc2V0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9yZXNldDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzc0FkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3RBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAoYWNjZXNzS2V5Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgIGFjY2Vzc0tleUFkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShhY2Nlc3NLZXlBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjY2Vzc0tleS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgaV0gPSBhY2Nlc3NLZXkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBhY2Nlc3NLZXkubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhFbmNvZGVkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1vZGVsUGF0aCk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyNTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgbW9kZWxQYXRoQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1vZGVsUGF0aEFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDI4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQobW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFttb2RlbFBhdGhBZGRyZXNzICsgbW9kZWxQYXRoRW5jb2RlZC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzID0gc3BlYWtlclByb2ZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDMzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBudW1TcGVha2VycyAqIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICBwcm9maWxlc0FkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQyMS5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZXNBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNwZWFrZXJQcm9maWxlcyk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnByZXYgPSAzODsKICAgICAgICAgICAgICAgIF9pdGVyYXRvci5zKCk7CiAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDUxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwcm9maWxlLmJ5dGVzLmxlbmd0aCAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA0NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KHByb2ZpbGUuYnl0ZXMsIHByb2ZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QucHVzaChwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDU2OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDUzOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50MCA9IF9jb250ZXh0MjFbImNhdGNoIl0oMzgpOwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQyMS50MCk7CiAgICAgICAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDU2OwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLmZpbmlzaCg1Nik7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChuZXcgSW50MzJBcnJheShwcm9maWxlc0FkZHJlc3NMaXN0KSwgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjI7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBudW1TcGVha2VycywgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcywgb2JqZWN0QWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA2NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUoYWNjZXNzS2V5QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA3OTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnQxID0gIidwdl9lYWdsZV9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDMgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50NCA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDUgPSAoMCwgX2NvbnRleHQyMS50MikoX2NvbnRleHQyMS50MywgX2NvbnRleHQyMS50NCk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDIxLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MjEudDEsIF9jb250ZXh0MjEudDUpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDgzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG51bVNwZWFrZXJzICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHNjb3Jlc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgODg6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA5MDsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9mcmFtZV9sZW5ndGgoKTsKICAgICAgICAgICAgICBjYXNlIDkwOgogICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMS5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzOiBudW1TcGVha2VycywKICAgICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzczogb2JqZWN0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzczogc2NvcmVzQWRkcmVzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZURlbGV0ZTogcHZfZWFnbGVfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvY2VzczogcHZfZWFnbGVfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZVJlc2V0OiBwdl9lYWdsZV9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIxLCB0aGlzLCBbWzM4LCA1MywgNTYsIDU5XV0pOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdFdhc20oX3gxOCwgX3gxOSwgX3gyMCwgX3gyMSkgewogICAgICAgICAgcmV0dXJuIF9pbml0V2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0V2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGU7CiAgfShFYWdsZUJhc2UpOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlLCAiX2ZyYW1lTGVuZ3RoIiwgdm9pZCAwKTsKCiAgdmFyIGVhZ2xlID0gbnVsbDsKICB2YXIgaW5pdFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVxdWVzdCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEoZWFnbGUgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjsKICAgICAgICAgICAgRWFnbGUuc2V0V2FzbShyZXF1ZXN0Lndhc20pOwogICAgICAgICAgICBFYWdsZS5zZXRXYXNtU2ltZChyZXF1ZXN0Lndhc21TaW1kKTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7CiAgICAgICAgICAgIHJldHVybiBFYWdsZS5faW5pdChyZXF1ZXN0LmFjY2Vzc0tleSwgcmVxdWVzdC5tb2RlbFBhdGgsIHJlcXVlc3Quc3BlYWtlclByb2ZpbGVzKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgZWFnbGUgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJywKICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZWFnbGUuZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogZWFnbGUuc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICB2ZXJzaW9uOiBlYWdsZS52ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDExOwogICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzIsIDExXV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGluaXRSZXF1ZXN0KF94KSB7CiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgcHJvY2Vzc1JlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXF1ZXN0KSB7CiAgICAgIHZhciBzY29yZXM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEoZWFnbGUgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiAnRWFnbGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJwogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDU7CiAgICAgICAgICAgIHJldHVybiBlYWdsZS5wcm9jZXNzKHJlcXVlc3QuaW5wdXRGcmFtZSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHNjb3JlcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICAgICAgc2NvcmVzOiBzY29yZXMKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyWyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQyLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1syLCA5XV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHByb2Nlc3NSZXF1ZXN0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciByZXNldFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShlYWdsZSA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdFYWdsZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIGVhZ2xlLnJlc2V0KCk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSA4OwogICAgICAgICAgICBfY29udGV4dDMudDAgPSBfY29udGV4dDNbImNhdGNoIl0oMik7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dDMudDAubWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzLCBudWxsLCBbWzIsIDhdXSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVzZXRSZXF1ZXN0KCkgewogICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciByZWxlYXNlUmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKGVhZ2xlICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBlYWdsZS5yZWxlYXNlKCk7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGVhZ2xlID0gbnVsbDsKICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNCk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVsZWFzZVJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgLyoqDQogICAqIEVhZ2xlIHdvcmtlciBoYW5kbGVyLg0KICAgKi8KICBzZWxmLm9ubWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGV2ZW50KSB7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gZXZlbnQuZGF0YS5jb21tYW5kOwogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IF9jb250ZXh0NS50MCA9PT0gJ2luaXQnID8gMyA6IF9jb250ZXh0NS50MCA9PT0gJ3Byb2Nlc3MnID8gOSA6IF9jb250ZXh0NS50MCA9PT0gJ3Jlc2V0JyA/IDE1IDogX2NvbnRleHQ1LnQwID09PSAncmVsZWFzZScgPyAyMSA6IDI3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgX2NvbnRleHQ1LnQxID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA2OwogICAgICAgICAgICByZXR1cm4gaW5pdFJlcXVlc3QoZXZlbnQuZGF0YSk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIF9jb250ZXh0NS50MiA9IF9jb250ZXh0NS5zZW50OwogICAgICAgICAgICBfY29udGV4dDUudDEucG9zdE1lc3NhZ2UuY2FsbChfY29udGV4dDUudDEsIF9jb250ZXh0NS50Mik7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCJicmVhayIsIDI4KTsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgX2NvbnRleHQ1LnQzID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMjsKICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgX2NvbnRleHQ1LnQ0ID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0NS50My5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0NS50MywgX2NvbnRleHQ1LnQ0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoImJyZWFrIiwgMjgpOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgX2NvbnRleHQ1LnQ1ID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxODsKICAgICAgICAgICAgcmV0dXJuIHJlc2V0UmVxdWVzdCgpOwogICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgX2NvbnRleHQ1LnQ2ID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0NS50NS5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0NS50NSwgX2NvbnRleHQ1LnQ2KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoImJyZWFrIiwgMjgpOwogICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgX2NvbnRleHQ1LnQ3ID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyNDsKICAgICAgICAgICAgcmV0dXJuIHJlbGVhc2VSZXF1ZXN0KCk7CiAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICBfY29udGV4dDUudDggPSBfY29udGV4dDUuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ1LnQ3LnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ1LnQ3LCBfY29udGV4dDUudDgpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgiYnJlYWsiLCAyOCk7CiAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZmFpbGVkJywKICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgICAgbWVzc2FnZTogIlVucmVjb2duaXplZCBjb21tYW5kOiAiLmNvbmNhdChldmVudC5kYXRhLmNvbW1hbmQpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyODoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTUpOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHsKICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKCn0pKCk7Cgo=', null, false);
|
|
4488
|
+
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvciQxKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcCQxKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwJDEoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWVFeHBvcnRzID0ge307CiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0gewogICAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHM7IH0sCiAgICBzZXQgZXhwb3J0cyh2KXsgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzID0ge307CiAgdmFyIF90eXBlb2YkMiA9IHsKICAgIGdldCBleHBvcnRzKCl7IHJldHVybiBfdHlwZW9mRXhwb3J0czsgfSwKICAgIHNldCBleHBvcnRzKHYpeyBfdHlwZW9mRXhwb3J0cyA9IHY7IH0sCiAgfTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogIAkgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgCSAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAJICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChfdHlwZW9mJDIpKTsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0c1siZGVmYXVsdCJdOwogIAlmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogIAkgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgICByZXR1cm4gZXhwb3J0czsKICAJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwogIAkgIHZhciBleHBvcnRzID0ge30sCiAgCSAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgCSAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwKICAJICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogIAkgICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7CiAgCSAgICB9LAogIAkgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogIAkgICAgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIiwKICAJICAgIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciIsCiAgCSAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAJICAgICAgdmFsdWU6IHZhbHVlLAogIAkgICAgICBlbnVtZXJhYmxlOiAhMCwKICAJICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAJICAgICAgd3JpdGFibGU6ICEwCiAgCSAgICB9KSwgb2JqW2tleV07CiAgCSAgfQogIAkgIHRyeSB7CiAgCSAgICBkZWZpbmUoe30sICIiKTsKICAJICB9IGNhdGNoIChlcnIpIHsKICAJICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAJICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CiAgCSAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwKICAJICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogIAkgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwogIAkgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgIl9pbnZva2UiLCB7CiAgCSAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgCSAgICB9KSwgZ2VuZXJhdG9yOwogIAkgIH0KICAJICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKQogIAkgICAgICB9OwogIAkgICAgfSBjYXRjaCAoZXJyKSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogInRocm93IiwKICAJICAgICAgICBhcmc6IGVycgogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBleHBvcnRzLndyYXAgPSB3cmFwOwogIAkgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAJICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQogIAkgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogIAkgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pOwogIAkgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogIAkgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAJICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgewogIAkgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIAkgICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsKICAJICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsKICAJICAgICAgfSk7CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgCSAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgCSAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsCiAgCSAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAJICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgCSAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgCSAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogIAkgICAgICAgIH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CiAgCSAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAJICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgfSk7CiAgCSAgICAgIH0KICAJICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogIAkgICAgfQogIAkgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAJICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogIAkgICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgc3RhdGUgPSAic3VzcGVuZGVkU3RhcnQiOwogIAkgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgewogIAkgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAJICAgICAgaWYgKCJjb21wbGV0ZWQiID09PSBzdGF0ZSkgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBtZXRob2QpIHRocm93IGFyZzsKICAJICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsKICAJICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogIAkgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogIAkgICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgCSAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAJICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogIAkgICAgICAgICAgfQogIAkgICAgICAgIH0KICAJICAgICAgICBpZiAoIm5leHQiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKCJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB7CiAgCSAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogIAkgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CiAgCSAgICAgICAgfSBlbHNlICJyZXR1cm4iID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdCgicmV0dXJuIiwgY29udGV4dC5hcmcpOwogIAkgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgCSAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOwogIAkgICAgICAgIGlmICgibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUpIHsKICAJICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgCSAgICAgICAgICByZXR1cm4gewogIAkgICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAJICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIH0KICAJICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogIAkgICAgICB9CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgCSAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLAogIAkgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAJICAgIGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yWyJyZXR1cm4iXSAmJiAoY29udGV4dC5tZXRob2QgPSAicmV0dXJuIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCAidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgfHwgInJldHVybiIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciICsgbWV0aG9kTmFtZSArICInIG1ldGhvZCIpKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CiAgCSAgICByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgInJldHVybiIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgCSAgICB2YXIgZW50cnkgPSB7CiAgCSAgICAgIHRyeUxvYzogbG9jc1swXQogIAkgICAgfTsKICAJICAgIDEgaW4gbG9jcyAmJiAoZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdKSwgMiBpbiBsb2NzICYmIChlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXSwgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgCSAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAJICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogIAkgIH0KICAJICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogIAkgICAgaWYgKGl0ZXJhYmxlKSB7CiAgCSAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAJICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7CiAgCSAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBpID0gLTEsCiAgCSAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogIAkgICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICAgICAgICB9OwogIAkgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogIAkgICAgICB9CiAgCSAgICB9CiAgCSAgICByZXR1cm4gewogIAkgICAgICBuZXh0OiBkb25lUmVzdWx0CiAgCSAgICB9OwogIAkgIH0KICAJICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAJICAgICAgZG9uZTogITAKICAJICAgIH07CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgdmFyIGN0b3IgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogIAkgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgCSAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6IChnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOwogIAkgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgCSAgICByZXR1cm4gewogIAkgICAgICBfX2F3YWl0OiBhcmcKICAJICAgIH07CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAJICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7CiAgCSAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7CiAgCSAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogIAkgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKICAJICAgIH0pOwogIAkgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogIAkgIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7CiAgCSAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksCiAgCSAgICAgIGtleXMgPSBbXTsKICAJICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpOwogIAkgICAgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgewogIAkgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgCSAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgCSAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAJICAgIH0sCiAgCSAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgewogIAkgICAgICB0aGlzLmRvbmUgPSAhMDsKICAJICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAJICAgICAgaWYgKCJ0aHJvdyIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgCSAgICB9LAogIAkgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgewogIAkgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgCSAgICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgCSAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgCSAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogIAkgICAgICAgIGlmICgicm9vdCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCAiY2F0Y2hMb2MiKSwKICAJICAgICAgICAgICAgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwogIAkgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAJICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogIAkgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAJICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7CiAgCSAgICAgICAgICBicmVhazsKICAJICAgICAgICB9CiAgCSAgICAgIH0KICAJICAgICAgZmluYWxseUVudHJ5ICYmICgiYnJlYWsiID09PSB0eXBlIHx8ICJjb250aW51ZSIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7CiAgCSAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogIAkgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAJICAgIH0sCiAgCSAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogIAkgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7CiAgCSAgICAgIHJldHVybiAiYnJlYWsiID09PSByZWNvcmQudHlwZSB8fCAiY29udGludWUiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiAicmV0dXJuIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0sCiAgCSAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CiAgCSAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAJICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgCSAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgCSAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogIAkgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgICByZXR1cm4gdGhyb3duOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAJICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgCSAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksCiAgCSAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAJICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgCSAgICAgIH0sICJuZXh0IiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsKICAJICAgIH0KICAJICB9LCBleHBvcnRzOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICAvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLgoKICB2YXIgcnVudGltZSQxID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZiQxKG8pIHsKICAgIF9nZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiQxKG8pOwogIH0KCiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mJDEob2JqZWN0KTsKICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0OwogIH0KCiAgZnVuY3Rpb24gX2dldCgpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsKICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0LmJpbmQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICBpZiAoIWJhc2UpIHJldHVybjsKICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwoYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiByZWNlaXZlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXNjLnZhbHVlOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiQxID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICAgIG8uX19wcm90b19fID0gcDsKICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiQxKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzJDEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZiQxKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKICB9CgogIGZ1bmN0aW9uIF90eXBlb2YkMShvYmopIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2YkMShvYmopOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMShzZWxmLCBjYWxsKSB7CiAgICBpZiAoY2FsbCAmJiAoX3R5cGVvZiQxKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUkMShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YkMShpbnB1dCkgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKF90eXBlb2YkMShyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5JDEoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlJDEoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gX3R5cGVvZiQxKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleSQxKGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSBfdG9Qcm9wZXJ0eUtleSQxKGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGNvbnN0IEVfQ0FOQ0VMRUQgPSBuZXcgRXJyb3IoJ3JlcXVlc3QgZm9yIGxvY2sgY2FuY2VsZWQnKTsKCiAgdmFyIF9fYXdhaXRlciQyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgICB9KTsKICB9OwogIGNsYXNzIFNlbWFwaG9yZSB7CiAgICAgIGNvbnN0cnVjdG9yKF92YWx1ZSwgX2NhbmNlbEVycm9yID0gRV9DQU5DRUxFRCkgewogICAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzID0gW107CiAgICAgICAgICB0aGlzLl93ZWlnaHRlZFdhaXRlcnMgPSBbXTsKICAgICAgfQogICAgICBhY3F1aXJlKHdlaWdodCA9IDEpIHsKICAgICAgICAgIGlmICh3ZWlnaHQgPD0gMCkKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2VpZ2h0ICR7d2VpZ2h0fTogbXVzdCBiZSBwb3NpdGl2ZWApOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdKQogICAgICAgICAgICAgICAgICB0aGlzLl93ZWlnaHRlZFF1ZXVlc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzW3dlaWdodCAtIDFdLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaywgd2VpZ2h0ID0gMSkgewogICAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUod2VpZ2h0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHdhaXRGb3JVbmxvY2sod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLnB1c2gocmVzb2x2ZSk7CiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2goKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIGlzTG9ja2VkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7CiAgICAgIH0KICAgICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgIH0KICAgICAgc2V0VmFsdWUodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIHJlbGVhc2Uod2VpZ2h0ID0gMSkgewogICAgICAgICAgaWYgKHdlaWdodCA8PSAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7CiAgICAgICAgICB0aGlzLl92YWx1ZSArPSB3ZWlnaHQ7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpOwogICAgICB9CiAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgIHRoaXMuX3dlaWdodGVkUXVldWVzLmZvckVhY2goKHF1ZXVlKSA9PiBxdWV1ZS5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSkpOwogICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRRdWV1ZXMgPSBbXTsKICAgICAgfQogICAgICBfZGlzcGF0Y2goKSB7CiAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBjb25zdCBxdWV1ZUVudHJ5ID0gKF9hID0gdGhpcy5fd2VpZ2h0ZWRRdWV1ZXNbd2VpZ2h0IC0gMV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zaGlmdCgpOwogICAgICAgICAgICAgIGlmICghcXVldWVFbnRyeSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX3ZhbHVlOwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzV2VpZ2h0ID0gd2VpZ2h0OwogICAgICAgICAgICAgIHRoaXMuX3ZhbHVlIC09IHdlaWdodDsKICAgICAgICAgICAgICB3ZWlnaHQgPSB0aGlzLl92YWx1ZSArIDE7CiAgICAgICAgICAgICAgcXVldWVFbnRyeS5yZXNvbHZlKFtwcmV2aW91c1ZhbHVlLCB0aGlzLl9uZXdSZWxlYXNlcihwcmV2aW91c1dlaWdodCldKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2RyYWluVW5sb2NrV2FpdGVycygpOwogICAgICB9CiAgICAgIF9uZXdSZWxlYXNlcih3ZWlnaHQpIHsKICAgICAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNhbGxlZCkKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHdlaWdodCk7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIF9kcmFpblVubG9ja1dhaXRlcnMoKSB7CiAgICAgICAgICBmb3IgKGxldCB3ZWlnaHQgPSB0aGlzLl92YWx1ZTsgd2VpZ2h0ID4gMDsgd2VpZ2h0LS0pIHsKICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSkKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKCkpOwogICAgICAgICAgICAgIHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSA9IFtdOwogICAgICAgICAgfQogICAgICB9CiAgfQoKICB2YXIgX19hd2FpdGVyJDEgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgIH0pOwogIH07CiAgY2xhc3MgTXV0ZXggewogICAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikgewogICAgICAgICAgdGhpcy5fc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxLCBjYW5jZWxFcnJvcik7CiAgICAgIH0KICAgICAgYWNxdWlyZSgpIHsKICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICBjb25zdCBbLCByZWxlYXNlcl0gPSB5aWVsZCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgpOwogICAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5ydW5FeGNsdXNpdmUoKCkgPT4gY2FsbGJhY2soKSk7CiAgICAgIH0KICAgICAgaXNMb2NrZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCk7CiAgICAgIH0KICAgICAgd2FpdEZvclVubG9jaygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUud2FpdEZvclVubG9jaygpOwogICAgICB9CiAgICAgIHJlbGVhc2UoKSB7CiAgICAgICAgICBpZiAodGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCkpCiAgICAgICAgICAgICAgdGhpcy5fc2VtYXBob3JlLnJlbGVhc2UoKTsKICAgICAgfQogICAgICBjYW5jZWwoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmNhbmNlbCgpOwogICAgICB9CiAgfQoKICBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7CiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZWplY3QoZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5mby5kb25lKSB7CiAgICAgIHJlc29sdmUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7CiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICAgIH0pOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7CiAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogIAlyZXR1cm4gZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwogIH0KCiAgdmFyIF90eXBlb2ZfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG9iaik7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIHZhciBfdHlwZW9mID0gX3R5cGVvZl8xWyJkZWZhdWx0Il07CiAgZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgICAgIHJldHVybiBleHBvcnRzOwogICAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICAgIHZhciBleHBvcnRzID0ge30sCiAgICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksCiAgICAgIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgewogICAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTsKICAgICAgfSwKICAgICAgJFN5bWJvbCA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LAogICAgICBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiLAogICAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogICAgICB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogICAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgIH0pLCBvYmpba2V5XTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGRlZmluZSh7fSwgIiIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsKICAgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsCiAgICAgICAgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLAogICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7CiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsICJfaW52b2tlIiwgewogICAgICAgIHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpCiAgICAgIH0pLCBnZW5lcmF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgICAgICAgICBhcmc6IGZuLmNhbGwob2JqLCBhcmcpCiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJ0aHJvdyIsCiAgICAgICAgICBhcmc6IGVycgogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMud3JhcCA9IHdyYXA7CiAgICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwogICAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAgIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwogICAgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLAogICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogICAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7CiAgICAgICAgaWYgKCJ0aHJvdyIgIT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGludm9rZSgibmV4dCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsKICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkLCByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgICAgIH0KICAgICAgdmFyIHByZXZpb3VzUHJvbWlzZTsKICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgIl9pbnZva2UiLCB7CiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICAgIHZhciBzdGF0ZSA9ICJzdXNwZW5kZWRTdGFydCI7CiAgICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsKICAgICAgICBpZiAoImV4ZWN1dGluZyIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgICBpZiAoImNvbXBsZXRlZCIgPT09IHN0YXRlKSB7CiAgICAgICAgICBpZiAoInRocm93IiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7CiAgICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7CiAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOwogICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCJuZXh0IiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmICgidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgewogICAgICAgICAgICBpZiAoInN1c3BlbmRlZFN0YXJ0IiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQuYXJnOwogICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsKICAgICAgICAgIH0gZWxzZSAicmV0dXJuIiA9PT0gY29udGV4dC5tZXRob2QgJiYgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICAgIHN0YXRlID0gImV4ZWN1dGluZyI7CiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CiAgICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHJlY29yZC50eXBlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/ICJjb21wbGV0ZWQiIDogInN1c3BlbmRlZFlpZWxkIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCiAgICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICAidGhyb3ciID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSAiY29tcGxldGVkIiwgY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsKICAgICAgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZCwKICAgICAgICBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsKICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsICJ0aHJvdyIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdICYmIChjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksICJ0aHJvdyIgPT09IGNvbnRleHQubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbWV0aG9kTmFtZSAmJiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBtZXRob2ROYW1lICsgIicgbWV0aG9kIikpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpOwogICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7CiAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZzsKICAgICAgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsICJyZXR1cm4iICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSAibmV4dCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpOwogICAgfQogICAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsKICAgICAgdmFyIGVudHJ5ID0gewogICAgICAgIHRyeUxvYzogbG9jc1swXQogICAgICB9OwogICAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHsKICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307CiAgICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOwogICAgfQogICAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgewogICAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogICAgICAgIHRyeUxvYzogInJvb3QiCiAgICAgIH1dLCB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyksIHRoaXMucmVzZXQoITApOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZSkgewogICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsKICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlOwogICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgICAgICAgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OwogICAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5leHQ6IGRvbmVSZXN1bHQKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICBkb25lOiAhMAogICAgICB9OwogICAgfQogICAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgewogICAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sCiAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgIH0pLCBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHZhciBjdG9yID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsKICAgICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgIkdlbmVyYXRvckZ1bmN0aW9uIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7CiAgICB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7CiAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgIkdlbmVyYXRvckZ1bmN0aW9uIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsKICAgIH0sIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbiAoYXJnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgX19hd2FpdDogYXJnCiAgICAgIH07CiAgICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsKICAgICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOwogICAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpOwogICAgICB9KTsKICAgIH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3IiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBkZWZpbmUoR3AsICJ0b1N0cmluZyIsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuICJbb2JqZWN0IEdlbmVyYXRvcl0iOwogICAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLAogICAgICAgIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7CiAgICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICBmb3IgKDsga2V5cy5sZW5ndGg7KSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAgICAgfTsKICAgIH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsCiAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7CiAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgInQiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTsKICAgICAgfSwKICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICB0aGlzLmRvbmUgPSAhMDsKICAgICAgICB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogICAgICAgIGlmICgidGhyb3ciID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOwogICAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgICAgIH0sCiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHsKICAgICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247CiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gInRocm93IiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0OwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sCiAgICAgICAgICAgIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICBpZiAoInJvb3QiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpLAogICAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKICAgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkgewogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghaGFzRmluYWxseSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHlFbnRyeSAmJiAoImJyZWFrIiA9PT0gdHlwZSB8fCAiY29udGludWUiID09PSB0eXBlKSAmJiBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJiBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MgJiYgKGZpbmFsbHlFbnRyeSA9IG51bGwpOwogICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9ICJuZXh0IiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogICAgICB9LAogICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgewogICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgICByZXR1cm4gImJyZWFrIiA9PT0gcmVjb3JkLnR5cGUgfHwgImNvbnRpbnVlIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogInJldHVybiIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSAicmV0dXJuIiwgdGhpcy5uZXh0ID0gImVuZCIpIDogIm5vcm1hbCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0sCiAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJjYXRjaCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07CiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247CiAgICAgICAgICAgIGlmICgidGhyb3ciID09PSByZWNvcmQudHlwZSkgewogICAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAgICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwKICAgICAgICAgIG5leHRMb2M6IG5leHRMb2MKICAgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KICAgIH0sIGV4cG9ydHM7CiAgfQogIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKICB9KTsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUgPSByZWdlbmVyYXRvclJ1bnRpbWUkMSgpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgY29uc3QgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIG5ldyBQcm94eSh0LHtnZXQ6KHQscik9PmUodFtyXSl9KX1jbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT12b2lkIDAsdGhpcy5leHBvcnRzPW51bGw7fWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKX1hc3NlcnROb25lU3RhdGUoKXtsZXQgdD10aGlzLmdldFN0YXRlKCk7aWYoMCE9PXQpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIHN0YXRlICR7dH0sIGV4cGVjdGVkIDAuYCl9d3JhcEltcG9ydEZuKHQpe3JldHVybiAoLi4uZSk9PntpZigyPT09dGhpcy5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKSx0aGlzLnZhbHVlO3RoaXMuYXNzZXJ0Tm9uZVN0YXRlKCk7bGV0IHI9dCguLi5lKTtpZighKHM9cil8fCJvYmplY3QiIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnRoZW4pcmV0dXJuIHI7dmFyIHM7dGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZCgxNiksdGhpcy52YWx1ZT1yO319d3JhcE1vZHVsZUltcG9ydHModCl7cmV0dXJuIGUodCx0PT4iZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLndyYXBJbXBvcnRGbih0KTp0KX13cmFwSW1wb3J0cyh0KXtpZih2b2lkIDAhPT10KXJldHVybiBlKHQsKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSk9PnRoaXMud3JhcE1vZHVsZUltcG9ydHModCkpfXdyYXBFeHBvcnRGbihlKXtsZXQgcj10LmdldChlKTtyZXR1cm4gdm9pZCAwIT09cnx8KHI9YXN5bmMoLi4udCk9Pnt0aGlzLmFzc2VydE5vbmVTdGF0ZSgpO2xldCByPWUoLi4udCk7Zm9yKDsxPT09dGhpcy5nZXRTdGF0ZSgpOyl0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKSx0aGlzLnZhbHVlPWF3YWl0IHRoaXMudmFsdWUsdGhpcy5hc3NlcnROb25lU3RhdGUoKSx0aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfcmV3aW5kKDE2KSxyPWUoKTtyZXR1cm4gdGhpcy5hc3NlcnROb25lU3RhdGUoKSxyfSx0LnNldChlLHIpKSxyfXdyYXBFeHBvcnRzKGUpe2xldCByPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCB0IGluIGUpe2xldCBzPWVbdF07ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHQuc3RhcnRzV2l0aCgiYXN5bmNpZnlfIil8fChzPXRoaXMud3JhcEV4cG9ydEZuKHMpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocix0LHtlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KTt9cmV0dXJuIHQuc2V0KGUscikscn1pbml0KHQsZSl7Y29uc3R7ZXhwb3J0czpyfT10LG49ci5tZW1vcnl8fGUuZW52JiZlLmVudi5tZW1vcnk7bmV3IEludDMyQXJyYXkobi5idWZmZXIsMTYpLnNldChbMjQsMTAyNF0pLHRoaXMuZXhwb3J0cz10aGlzLndyYXBFeHBvcnRzKHIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LHMucHJvdG90eXBlKTt9fWNsYXNzIHMgZXh0ZW5kcyBXZWJBc3NlbWJseS5JbnN0YW5jZXtjb25zdHJ1Y3Rvcih0LGUpe2xldCBzPW5ldyByO3N1cGVyKHQscy53cmFwSW1wb3J0cyhlKSkscy5pbml0KHRoaXMsZSk7fWdldCBleHBvcnRzKCl7cmV0dXJuIHQuZ2V0KHN1cGVyLmV4cG9ydHMpfX1hc3luYyBmdW5jdGlvbiBuKHQsZSl7bGV0IHM9bmV3IHIsbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LHMud3JhcEltcG9ydHMoZSkpO3JldHVybiBzLmluaXQobiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP246bi5pbnN0YW5jZSxlKSxufWFzeW5jIGZ1bmN0aW9uIGEodCxlKXtsZXQgcz1uZXcgcixuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHQscy53cmFwSW1wb3J0cyhlKSk7cmV0dXJuIHMuaW5pdChuLmluc3RhbmNlLGUpLG59T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLCJleHBvcnRzIix7ZW51bWVyYWJsZTohMH0pOwoKICBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKICAgIH0sIF90eXBlb2Yob2JqKTsKICB9CgogIGZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmIChfdHlwZW9mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CgogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSkgewogICAgICByZXR1cm4gY2FsbDsKICAgIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsKICB9CgogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsKICAgIH07CiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOwogIH0KCiAgZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMSh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9CiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfcGF0aCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21ldGEiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RmlsZSwgW3sKICAgICAga2V5OiAibWV0YSIsCiAgICAgIGdldDoKICAgICAgLyoqDQogICAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5fbWV0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCQxKHsKICAgICAgICAgIHZlcnNpb246IDAKICAgICAgICB9LCB0aGlzLl9tZXRhKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZGaWxlLCAiX2ZpbGVQdHJzIiwgbmV3IE1hcCgpKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDEoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQxKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBJbmRleGVkIERCIGNvbmZpZ3VyYXRpb25zDQogICAqLwogIHZhciBEQl9OQU1FID0gJ3B2X2RiJzsKICB2YXIgUFZfRklMRV9TVE9SRSA9ICdwdl9maWxlJzsKICB2YXIgREJfVkVSU0lPTiA9IDM7CiAgLyoqDQogICAqIEhlbHBlciB0byBnZXQgSW5kZXhlZERCLg0KICAgKi8KICBmdW5jdGlvbiBnZXREQigpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTsKICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgfTsKICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7CiAgICAgIH07CiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhQVl9GSUxFX1NUT1JFKSkgewogICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSk7CiAgICAgICAgfQogICAgICB9OwogICAgfSk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgSW5kZXhlZERCLg0KICAgKiBJbmRleGVkREIgaXMgUkVRVUlSRUQuDQogICAqLwogIHZhciBQdkZpbGVJREIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVJREIsIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQxKFB2RmlsZUlEQik7CiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3RvciBvZiBQdkZpbGUgaW5zdGFuY2UuDQogICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgYSBmaWxlLg0KICAgICAqIEBwYXJhbSBtZXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZS4NCiAgICAgKiBAcGFyYW0gZGIgVGhlIGRiIGluc3RhbmNlIGN1cnJlbnRseSByZWxhdGVkIHRvIHRoZSBvcGVuZWQgZmlsZS4NCiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSAtIGVpdGhlciByZWFkb25seSBvciByZWFkd3JpdGUuDQogICAgICovCiAgICBmdW5jdGlvbiBQdkZpbGVJREIocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlSURCKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BhZ2VTaXplIiwgNjU1MzYpOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfZGIiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlUHRyIiwgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIl9wYWdlT2Zmc2V0IiwgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fZGIgPSBkYjsKICAgICAgX3RoaXMuX21vZGUgPSBtb2RlOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICAvKioNCiAgICAgKiBPcGVucyBhIGZpbGUgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQdkZpbGUuIEEgZmlsZSBjYW4gYmUgb3BlbmVkIGluIHJlYWRvbmx5IG9yIHJlYWR3cml0ZSBtb2RlDQogICAgICogd2hpY2ggZm9sbG93cyBJbmRleGVkREIgc3RhbmRhcmQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyB2YWx1ZXMgdG8gdGhlIGRiLg0KICAgICAqIFRoZSBmaWxlIGlzIHN0b3JlZCBhcyBhbiBVaW50OEFycmF5IHNlcGFyYXRlZCBieSBwYWdlcy4NCiAgICAgKiBOT1RFOiBUaGUga2V5IGV4YWN0bHkgbWF0Y2hpbmcgdGhlIHBhdGggZXhwZWN0cyBhIHZhbHVlIG9mIHR5cGUgUHZGaWxlTWV0YS4NCiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBvcGVuIHN0b3JlZCBpbiBJbmRleGVkREIuDQogICAgICogQHBhcmFtIG1vZGUgQSBzdHJpbmcsIGlmIGl0IGNvbnRhaW5zICdyJyBpbiB0aGUgc3RyaW5nLCBpdCB3aWxsIG9wZW4gdGhlIGZpbGUgaW4gcmVhZG9ubHkgbW9kZSwgZWxzZSBpdA0KICAgICAqIHdpbGwgb3BlbiBpbiByZWFkd3JpdGUgbW9kZS4NCiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFB2RmlsZT4gQW4gaW5zdGFuY2Ugb2YgUHZGaWxlLg0KICAgICAqIEB0aHJvd3MgRXJyb3IgaWYgSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlSURCLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIENsb3NlcyB0aGUgZGIgY29ubmVjdGlvbi4gQW55IG90aGVyIGluc3RhbmNlIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3Qgd29yayBvbmNlDQogICAgICAgKiB0aGUgZGIgaXMgY2xvc2VkLg0KICAgICAgICovCiAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2Nsb3NlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgICAgICByZXR1cm4gX2Nsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbG9zZTsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVhZHMgYSB0b3RhbCBvZiAnY291bnQnIGVsZW1lbnRzLCBlYWNoIHdpdGggYSBzaXplIG9mICdzaXplJyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uDQogICAgICAgKiBNb3ZlcyB0aGUgc3RyZWFtIGJ5IHRoZSBhbW91bnQgb2YgZWxlbWVudHMgcmVhZC4NCiAgICAgICAqIElmIHRoZSBsYXN0IGZldyBieXRlcyBpcyBzbWFsbGVyIHRoYW4gJ3NpemUnIGl0IHdpbGwgbm90IHJlYWQgKHNpbWlsYXIgdG8gZnJlYWQpIHRoZSBieXRlcy4NCiAgICAgICAqIEBwYXJhbSBzaXplIFRoZSBlbGVtZW50IHNpemUuDQogICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkLg0KICAgICAgICogQHJldHVybnMgUHJvbWlzZTxVaW50OEFycmF5PiBBIFVpbnQ4QXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgY29waWVkIHRvIGl0Lg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVhZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihzaXplLCBjb3VudCkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBpZiAoIV90aGlzMi5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIiciLmNvbmNhdChfdGhpczIuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDsKICAgICAgICAgICAgICAgICAgdmFyIG1heFRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgX3RoaXMyLl9tZXRhLnNpemUpOwogICAgICAgICAgICAgICAgICB2YXIgdG90YWxFbGVtcyA9IG1heFRvQ29weSAtIG1heFRvQ29weSAlIHNpemU7CiAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbEVsZW1zKTsKICAgICAgICAgICAgICAgICAgdmFyIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMi5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMyLl9wYWdlUHRyKSksICIiLmNvbmNhdChfdGhpczIuX3BhdGgsICItIikuY29uY2F0KFB2RmlsZUlEQi5jcmVhdGVQYWdlKF90aGlzMi5fbWV0YS5udW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gX3RoaXMyLl9zdG9yZTsKICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yIHx8IF90aGlzMi5faXNFT0YpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHRvdGFsRWxlbXMgLSBjb3BpZWQsIGN1cnNvci52YWx1ZS5sZW5ndGggLSBfdGhpczIuX3BhZ2VPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoY3Vyc29yLnZhbHVlLnNsaWNlKF90aGlzMi5fcGFnZU9mZnNldCwgX3RoaXMyLl9wYWdlT2Zmc2V0ICsgdG9Db3B5KSwgY29waWVkKTsKICAgICAgICAgICAgICAgICAgICBjb3BpZWQgKz0gdG9Db3B5OwogICAgICAgICAgICAgICAgICAgIF90aGlzMi5fcGFnZU9mZnNldCArPSB0b0NvcHk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzMi5fcGFnZU9mZnNldCA9PT0gX3RoaXMyLl9wYWdlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlUHRyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczIuX3BhZ2VPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkIDwgdG90YWxFbGVtcykgewogICAgICAgICAgICAgICAgICAgICAgY3Vyc29yWyJjb250aW51ZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChzdG9yZS50cmFuc2FjdGlvbi5lcnJvcik7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShidWZmZXIuc2xpY2UoMCwgY29waWVkKSk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZWFkKF94LCBfeDIpIHsKICAgICAgICAgIHJldHVybiBfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogV3JpdGVzIGFuIFVpbnQ4QXJyYXkgdG8gSW5kZXhlZERCIHNlcGVyYXRlZCBieSBwYWdlcy4NCiAgICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBieXRlcyB0byBzYXZlLg0KICAgICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgZmlsZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJ3cml0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF93cml0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjb250ZW50KSB7CiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICAgIHZhciB2ZXJzaW9uLAogICAgICAgICAgICBfYXJnczQgPSBhcmd1bWVudHM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2FyZ3M0Lmxlbmd0aCA+IDEgJiYgX2FyZ3M0WzFdICE9PSB1bmRlZmluZWQgPyBfYXJnczRbMV0gOiAxOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUsIGdldEN1cnJlbnRQYWdlLCBsYXN0LCBuZXdDb250ZW50LCBuZXdTaXplLCBuZXdNZXRhLCBwYWdlcywgaSwga2V5UmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl9tb2RlID09PSAicmVhZG9ubHkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkluc3RhbmNlIGlzIHJlYWRvbmx5IG1vZGUgb25seS4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIHZlcnNpb24gIT09ICJudW1iZXIiICYmIHZlcnNpb24gPD0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJWZXJzaW9uIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzMy5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiBnZXRDdXJyZW50UGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5nZXQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UoX3RoaXMzLl9wYWdlUHRyKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEucmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhyZXEucmVzdWx0LnNsaWNlKDAsIF90aGlzMy5fcGFnZU9mZnNldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMobmV3IFVpbnQ4QXJyYXkoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG5ldyBVaW50OEFycmF5KGxhc3QubGVuZ3RoICsgY29udGVudC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGxhc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0KGNvbnRlbnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gX3RoaXMzLl9wYWdlUHRyICogX3RoaXMzLl9wYWdlU2l6ZSArIG5ld0NvbnRlbnQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBuZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM6IE1hdGguY2VpbChuZXdTaXplIC8gX3RoaXMzLl9wYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3TWV0YSwgX3RoaXMzLl9wYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChuZXdDb250ZW50Lmxlbmd0aCAvIF90aGlzMy5fcGFnZVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5wdXQobmV3Q29udGVudC5zbGljZShpICogX3RoaXMzLl9wYWdlU2l6ZSwgKGkgKyAxKSAqIF90aGlzMy5fcGFnZVNpemUpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX3BhZ2VQdHIgKyBpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMzLmV4aXN0cygpICYmIG5ld01ldGEubnVtUGFnZXMgPCBfdGhpczMuX21ldGEubnVtUGFnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoIiIuY29uY2F0KF90aGlzMy5fcGF0aCwgIi0iKS5jb25jYXQoUHZGaWxlSURCLmNyZWF0ZVBhZ2UobmV3TWV0YS5udW1QYWdlcykpLCAiIi5jb25jYXQoX3RoaXMzLl9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShfdGhpczMuX21ldGEubnVtUGFnZXMpKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVsiZGVsZXRlIl0oa2V5UmFuZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS50cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0b3JlLnRyYW5zYWN0aW9uLmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczMuX21ldGEgPSBuZXdNZXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMzLnNlZWsoMCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQsIF94NSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkpKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHdyaXRlKF94MykgewogICAgICAgICAgcmV0dXJuIF93cml0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JpdGU7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gYnkgJ29mZnNldCcgZWxlbWVudHMgYXQgJ3doZW5jZScgcG9zaXRpb24uDQogICAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZS4NCiAgICAgICAqIEBwYXJhbSB3aGVuY2UgT25lIG9mOg0KICAgICAgICogIC0gMDogbW92ZXMgcG9zaXRpb24gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4NCiAgICAgICAqICAtIDE6IG1vdmVzIHBvc2l0aW9uIGZyb20gY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLg0KICAgICAgICogIC0gMjogbW92ZXMgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBmaWxlLg0KICAgICAgICogQHRocm93cyBFcnJvciBpZiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaWYgRU9GLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDEpIHsKICAgICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fcGFnZVNpemUgKiB0aGlzLl9wYWdlUHRyICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKGN1cnJlbnRPZmZzZXQgKyBvZmZzZXQsIHRoaXMuX21ldGEuc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX21ldGEuc2l6ZSArIG9mZnNldCwgdGhpcy5fbWV0YS5zaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGFnZU9mZnNldCA9IG5ld09mZnNldCAlIHRoaXMuX3BhZ2VTaXplOwogICAgICAgIHRoaXMuX3BhZ2VQdHIgPSBNYXRoLmZsb29yKG5ld09mZnNldCAvIHRoaXMuX3BhZ2VTaXplKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidGVsbCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWxsKCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciAqIHRoaXMuX3BhZ2VTaXplICsgdGhpcy5fcGFnZU9mZnNldDsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJlbW92ZXMgYSBmaWxlIGFuZCBhbnkgcmVsYXRlZCBwYWdlcyBnaXZlbiB0aGUgcGF0aC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVtb3ZlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkgewogICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlNShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbnVtUGFnZXMsIGtleVJhbmdlLCBzdG9yZSwgcmVxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzID0gX3RoaXM0Ll9tZXRhLm51bVBhZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoX3RoaXM0Ll9wYXRoLCAiIi5jb25jYXQoX3RoaXM0Ll9wYXRoLCAiLSIpLmNvbmNhdChQdkZpbGVJREIuY3JlYXRlUGFnZShudW1QYWdlcykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSA9IF90aGlzNC5fc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID0gc3RvcmVbImRlbGV0ZSJdKGtleVJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fbWV0YSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fcGFnZU9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuX3BhZ2VQdHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94NykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpKSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlOwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbGxvd2luZyBwYXRoIGV4aXN0cy4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9tZXRhICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc3RyZWFtIGlzIEVPRi4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfaXNFT0YiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFnZVB0ciA+PSB0aGlzLl9tZXRhLm51bVBhZ2VzIC0gMSAmJiB0aGlzLl9wYWdlT2Zmc2V0ID49IHRoaXMuX21ldGEuc2l6ZSAlIHRoaXMuX3BhZ2VTaXplOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbmRleCB3aGljaCBhcyBhIGtleSB0byBzYXZlIHBhZ2UgZGF0YSB0byBJbmRleGVkREIuDQogICAgICAgKiBUaGlzIGZvcm1hdHMgdGhlIGZpbGUgaW50byAwMDAwLCAwMDAxLCAwMDAyIC4uLg0KICAgICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgbnVtYmVyIHRvIGZvcm1hdC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJfc3RvcmUiLAogICAgICBnZXQ6CiAgICAgIC8qKg0KICAgICAgICogR2V0cyBhIG9iamVjdFN0b3JlIGluc3RhbmNlIGZyb20gdGhlIFB2RmlsZSBpbnN0YW5jZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RiLnRyYW5zYWN0aW9uKFBWX0ZJTEVfU1RPUkUsIHRoaXMuX21vZGUpLm9iamVjdFN0b3JlKFBWX0ZJTEVfU1RPUkUpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICBpZiAoIXNlbGYuaW5kZXhlZERCKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICBlcnJvci5uYW1lID0gIkluZGV4ZWREQk5vdFN1cHBvcnRlZCI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZGIsIHJlcSwgX2Vycm9yMjsKICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0NykgewogICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnByZXYgPSAwOwogICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREQigpOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICBkYiA9IF9jb250ZXh0Ny5zZW50OwogICAgICAgICAgICAgICAgICByZXEgPSBkYi50cmFuc2FjdGlvbihQVl9GSUxFX1NUT1JFLCAicmVhZHdyaXRlIikub2JqZWN0U3RvcmUoUFZfRklMRV9TVE9SRSkuZ2V0KHBhdGgpOwogICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHJlcS5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRiTW9kZSA9IG1vZGUuaW5jbHVkZXMoJ3InKSA/ICJyZWFkb25seSIgOiAicmVhZHdyaXRlIjsKICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PT0gdW5kZWZpbmVkICYmIGRiTW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9lcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgICAgICAgICAgICAgX2Vycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX2Vycm9yKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJREIgPSBuZXcgUHZGaWxlSURCKHBhdGgsIG1ldGEsIGRiLCBkYk1vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgICAgICAgICAgICAgIGZpbGVJREIuc2VlaygwLCAyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlSURCKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gOTsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3LnQwID0gX2NvbnRleHQ3WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ3LnQwLm5hbWUgPT09ICJJbnZhbGlkU3RhdGVFcnJvciIpIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IyID0gbmV3IEVycm9yKCJJbmRleGVkREIgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgICAgICAgIF9lcnJvcjIubmFtZSA9ICJJbmRleGVkREJOb3RTdXBwb3J0ZWQiOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChfZXJyb3IyKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NvbnRleHQ3LnQwKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgX2NhbGxlZTcsIG51bGwsIFtbMCwgOV1dKTsKICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g4LCBfeDkpIHsKICAgICAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0oKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY3JlYXRlUGFnZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQYWdlKHBhZ2UpIHsKICAgICAgICByZXR1cm4gKCIwMDAiICsgcGFnZSkuc2xpY2UoLTQpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlSURCOwogIH0oUHZGaWxlKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMigpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BvcyIsIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdkZpbGVNZW0sIFt7CiAgICAgIGtleTogImNsb3NlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWFkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQoc2l6ZSwgY291bnQpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFT0YpIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgdGhpcy5fZmlsZS5sZW5ndGggLSB0aGlzLl9wb3MpOwogICAgICAgIHZhciB0b3RhbEVsZW1zID0gdG9Db3B5IC0gdG9Db3B5ICUgc2l6ZTsKICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxFbGVtcyk7CiAgICAgICAgYnVmZmVyLnNldCh0aGlzLl9maWxlLnNsaWNlKHRoaXMuX3BvcywgdGhpcy5fcG9zICsgdG90YWxFbGVtcyksIDApOwogICAgICAgIHRoaXMuX3BvcyArPSB0b3RhbEVsZW1zOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAid3JpdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoY29udGVudCkgewogICAgICAgIHZhciBuZXdGaWxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fcG9zICsgY29udGVudC5sZW5ndGgpOwogICAgICAgIGlmICh0aGlzLl9maWxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KHRoaXMuX2ZpbGUuc2xpY2UoMCwgdGhpcy5fcG9zKSk7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50LCB0aGlzLl9wb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgdGhpcy5fcG9zICs9IGNvbnRlbnQubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wb3M7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3JlbW92ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzWyJkZWxldGUiXSh0aGlzLl9wYXRoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3MgPSAwOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW1vdmU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgX2RlZmluZVByb3BlcnR5KFB2RmlsZU1lbSwgIl9tZW1GaWxlcyIsIG5ldyBNYXAoKSk7CgogIGZ1bmN0aW9uIG93bktleXMkMihvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMkMihPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzJDIoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bIkBAaXRlcmF0b3IiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09ICJNYXAiIHx8IG4gPT09ICJTZXQiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB9CiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHBocmFzZSBzdG9yZWQgaW5zaWRlIGFuIGFycmF5IGJ1ZmZlciB0byBhIHN0cmluZw0KICAgKg0KICAgKiBAcGFyYW0gYXJyYXlCdWZmZXIgaW5wdXQgYXJyYXkgYnVmZmVyDQogICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGhyYXNlIGlzIHN0b3JlZA0KICAgKiBAcmV0dXJuIHJldHJpZXZlZCBzdHJpbmcNCiAgICovCiAgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgoYXJyYXlCdWZmZXIsIGluZGV4U3RhcnQpIHsKICAgIHZhciBpbmRleEVuZCA9IGluZGV4U3RhcnQ7CiAgICB3aGlsZSAoYXJyYXlCdWZmZXJbaW5kZXhFbmRdICE9PSAwKSB7CiAgICAgIGluZGV4RW5kKys7CiAgICB9CiAgICB2YXIgdXRmOGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04Jyk7CiAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKGFycmF5QnVmZmVyLnN1YmFycmF5KGluZGV4U3RhcnQsIGluZGV4RW5kKSk7CiAgfQogIC8qKg0KICAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFuZCBzdG9yZWQgaXQgaW4gYSBVaW50OEFycmF5IGFycmF5DQogICAqDQogICAqIEBwYXJhbSBiYXNlNjRTdHJpbmcgaW5wdXQgYmFzZTY0IHN0cmluZw0KICAgKiBAcmV0dXJuIGRlY29kZWQgYXJyYXkNCiAgICovCiAgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykgewogICAgdmFyIGJhc2U2NFN0cmluZ0RlY29kZWQgPSBhdG9iKGJhc2U2NFN0cmluZyk7CiAgICB2YXIgYmluYXJ5QXJyYXkgPSBuZXcgVWludDhBcnJheShiYXNlNjRTdHJpbmdEZWNvZGVkLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0cmluZ0RlY29kZWQubGVuZ3RoOyBpKyspIHsKICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiYXNlNjRTdHJpbmdEZWNvZGVkLmNoYXJDb2RlQXQoaSk7CiAgICB9CiAgICByZXR1cm4gYmluYXJ5QXJyYXk7CiAgfQogIC8qKg0KICAgKiBDb252ZXJ0IGEgc3RyaW5nIGhlYWRlciB0byBKUyBvYmplY3QNCiAgICoNCiAgICogQHBhcmFtIHN0cmluZ0hlYWRlciBpbnB1dCBzdHJpbmcgaW4ganNvbiBmb3JtYXQNCiAgICogQHJldHVybiByZXRyaWV2ZWQgb2JqZWN0DQogICAqLwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZQogIGZ1bmN0aW9uIHN0cmluZ0hlYWRlclRvT2JqZWN0KHN0cmluZ0hlYWRlcikgewogICAgdmFyIG9iamVjdEhlYWRlciA9IHt9OwogICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEoc3RyaW5nSGVhZGVyLnNwbGl0KCdcclxuJykpLAogICAgICBfc3RlcDsKICAgIHRyeSB7CiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gX3N0ZXAudmFsdWU7CiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IHByb3BlcnR5LnNwbGl0KCc6ICcpOwogICAgICAgIGlmIChrZXlWYWx1ZVBhaXJbMF0gIT09ICcnKSB7CiAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICBvYmplY3RIZWFkZXJba2V5VmFsdWVQYWlyWzBdXSA9IGtleVZhbHVlUGFpclsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgIH0KICAgIHJldHVybiBvYmplY3RIZWFkZXI7CiAgfQogIC8qKg0KICAgKiBBIHdyYXBwZXIgdG8gZmV0Y2ggdGhhdCBhbHNvIHN1cHBvcnRzIHRpbWVvdXQNCiAgICoNCiAgICogQHBhcmFtIHVyaSB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZQ0KICAgKiBAcGFyYW0gb3B0aW9ucyBvdGhlciBvcHRpb25zIHJlbGF0ZWQgdG8gZmV0Y2gNCiAgICogQHBhcmFtIHRpbWUgdGltZW91dCB2YWx1ZQ0KICAgKiBAcmV0dXJuIHJlY2VpdmVkIHJlc3BvbnNlDQogICAqLwogIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQoX3gpIHsKICAgIHJldHVybiBfZmV0Y2hXaXRoVGltZW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICAvKioNCiAgICogQ2hlY2tpbmcgd2hldGhlciB0aGUgZ2l2ZW4gQWNjZXNzS2V5IGlzIHZhbGlkDQogICAqDQogICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQWNjZXNzS2V5IGlzIHZhbGlkLCBmYWxzZSBpZiBub3QNCiAgICovCiAgZnVuY3Rpb24gX2ZldGNoV2l0aFRpbWVvdXQoKSB7CiAgICBfZmV0Y2hXaXRoVGltZW91dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKHVyaSkgewogICAgICB2YXIgb3B0aW9ucywKICAgICAgICB0aW1lLAogICAgICAgIGNvbnRyb2xsZXIsCiAgICAgICAgY29uZmlnLAogICAgICAgIHRpbWVvdXQsCiAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgb3B0aW9ucyA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDoge307CiAgICAgICAgICAgIHRpbWUgPSBfYXJncy5sZW5ndGggPiAyICYmIF9hcmdzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnc1syXSA6IDUwMDA7CiAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgICAgIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7fSwgewogICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7CiAgICAgICAgICAgIH0sIHRpbWUpOwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKICAgICAgICAgICAgcmV0dXJuIGZldGNoKHVyaSwgY29uZmlnKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHJlc3BvbnNlKTsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2ZldGNoV2l0aFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpIHsKICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5ICE9PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgYWNjZXNzS2V5Q2xlYW5lZCA9IGFjY2Vzc0tleS50cmltKCk7CiAgICBpZiAoYWNjZXNzS2V5Q2xlYW5lZCA9PT0gJycpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdHJ5IHsKICAgICAgcmV0dXJuIGJ0b2EoYXRvYihhY2Nlc3NLZXlDbGVhbmVkKSkgPT09IGFjY2Vzc0tleUNsZWFuZWQ7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioNCiAgICogT3BlbnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHBhdGggYW5kIG1vZGUuDQogICAqIEByZXR1cm5zIFB2RmlsZSBpbnN0YW5jZS4NCiAgICovCiAgZnVuY3Rpb24gb3BlbihfeDIsIF94MykgewogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIC8qKg0KICAgKiBQdkZpbGUgaGVscGVyLg0KICAgKiBXcml0ZSBtb2RlbEJhc2U2NCB0byBtb2RlbFBhdGggZGVwZW5kaW5nIG9uIG9wdGlvbnMgZm9yY2VXcml0ZSBhbmQgdmVyc2lvbi4NCiAgICovCiAgZnVuY3Rpb24gX29wZW4oKSB7CiAgICBfb3BlbiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihwYXRoLCBtb2RlKSB7CiAgICAgIHZhciBlcnJvcjsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAwOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBQdkZpbGVJREIub3BlbihwYXRoLCBtb2RlKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIF9jb250ZXh0Mi5zZW50KTsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA2OwogICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbImNhdGNoIl0oMCk7CiAgICAgICAgICAgIGlmIChfY29udGV4dDIudDAubmFtZSA9PT0gJ0luZGV4ZWREQk5vdFN1cHBvcnRlZCcpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybignSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxiYWNrIHRvIGluLW1lbW9yeSBzdG9yYWdlLicpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9jb250ZXh0Mi50MC5uYW1lICE9PSAnRmlsZU5vdEV4aXN0cycpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVW5hYmxlIHRvIGFjY2VzcyBJbmRleGVkREIgKCIuY29uY2F0KF9jb250ZXh0Mi50MC50b1N0cmluZygpLCAiKS4gRmFsbGJhY2sgdG8gaW4tbWVtb3J5IHN0b3JhZ2UuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKAogICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgLy8gQHRzLWlnbm9yZQogICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShfY29udGV4dDIudDAubmFtZSA9PT0gJ0ZpbGVOb3RFeGlzdHMnKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgX2NvbnRleHQyLnQwOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW4tbWVtb3J5IHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgd29ya2VyLicpOwogICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcigiRmFpbGVkIHRvIHN0YXJ0IFB2RmlsZTogIi5jb25jYXQoX2NvbnRleHQyLnQwLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdQdkZpbGVOb3RTdXBwb3J0ZWQnOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCBQdkZpbGVNZW0ub3BlbihwYXRoLCBtb2RlKSk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1swLCA2XV0pOwogICAgfSkpOwogICAgcmV0dXJuIF9vcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIGZyb21CYXNlNjQoX3g0LCBfeDUsIF94NiwgX3g3KSB7CiAgICByZXR1cm4gX2Zyb21CYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIGZ1bmN0aW9uIF9mcm9tQmFzZSgpIHsKICAgIF9mcm9tQmFzZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhtb2RlbFBhdGgsIG1vZGVsQmFzZTY0LCBmb3JjZVdyaXRlLCB2ZXJzaW9uKSB7CiAgICAgIHZhciBwdkZpbGU7CiAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuIG9wZW4obW9kZWxQYXRoLCAndycpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwdkZpbGUgPSBfY29udGV4dDMuc2VudDsKICAgICAgICAgICAgaWYgKCEoZm9yY2VXcml0ZSB8fCBwdkZpbGUubWV0YSA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb24gPiBwdkZpbGUubWV0YS52ZXJzaW9uKSkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgIHJldHVybiBwdkZpbGUud3JpdGUoYmFzZTY0VG9VaW50OEFycmF5KG1vZGVsQmFzZTY0KSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbUJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgdmFyIEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUyA9IDUwMDA7CiAgdmFyIEJBQ0tPRkZfU1RBUlRfTUlMTElTRUNPTkRTID0gMjsKICAvKioNCiAgICogUHZGaWxlIGhlbHBlci4NCiAgICogV3JpdGUgcHVibGljUGF0aCdzIG1vZGVsIHRvIG1vZGVsUGF0aCBkZXBlbmRpbmcgb24gb3B0aW9ucyBmb3JjZVdyaXRlIGFuZCB2ZXJzaW9uLg0KICAgKi8KICBmdW5jdGlvbiBmcm9tUHVibGljRGlyZWN0b3J5KF94OCwgX3g5LCBfeDEwLCBfeDExLCBfeDEyKSB7CiAgICByZXR1cm4gX2Zyb21QdWJsaWNEaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgLyoqDQogICAqIFRha2VzIGEgUGljb3ZvaWNlIG1vZGVsIGZpbGUgYW5kIGVpdGhlciBkZWNvZGVzIGl0IGZyb20gYmFzZTY0IG9yIGZldGNoZXMNCiAgICogaXQgZnJvbSB0aGUgcHVibGljIGRpcmVjdG9yeS4gU2F2ZXMgdGhlIHJlc3VsdCB0byBzdG9yYWdlIG9uIHZlcnNpb24gaW5jcmVhc2Ugb3INCiAgICogaWYgZm9yY2VXcml0ZSBpcyBlbmFibGVkLg0KICAgKi8KICBmdW5jdGlvbiBfZnJvbVB1YmxpY0RpcmVjdG9yeSgpIHsKICAgIF9mcm9tUHVibGljRGlyZWN0b3J5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KG1vZGVsUGF0aCwgcHVibGljUGF0aCwgZm9yY2VXcml0ZSwgdmVyc2lvbiwgbnVtRmV0Y2hSZXRpZXMpIHsKICAgICAgdmFyIHB2RmlsZSwgd2FpdFRpbWVNaWxsaXNlY29uZHMsIGRlbGF5LCBudW1BdHRlbXB0c0xlZnQsIGVycm9yLCByZXNwb25zZSwgZGF0YSwgcmVzcG9uc2VUZXh0OwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgIHJldHVybiBvcGVuKG1vZGVsUGF0aCwgJ3cnKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHZGaWxlID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGlmICghKGZvcmNlV3JpdGUgfHwgcHZGaWxlLm1ldGEgPT09IHVuZGVmaW5lZCB8fCB2ZXJzaW9uID4gcHZGaWxlLm1ldGEudmVyc2lvbikpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG51bUZldGNoUmV0aWVzIDwgMCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ251bUZldGNoUmV0cmllcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHdhaXRUaW1lTWlsbGlzZWNvbmRzID0gQkFDS09GRl9TVEFSVF9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZGVsYXlNaWxsaXNlY29uZHMpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNaWxsaXNlY29uZHMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBudW1BdHRlbXB0c0xlZnQgPSBudW1GZXRjaFJldGllcyArIDE7CiAgICAgICAgICAgIGVycm9yID0gbnVsbDsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKG51bUF0dGVtcHRzTGVmdCA+IDApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAzODsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IG51bGw7CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMTI7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTU7CiAgICAgICAgICAgIHJldHVybiBmZXRjaChwdWJsaWNQYXRoLCB7CiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE5OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgcmV0dXJuIHB2RmlsZS53cml0ZShuZXcgVWludDhBcnJheShkYXRhKSwgdmVyc2lvbik7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI1OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJFcnJvciByZXNwb25zZSByZXR1cm5lZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJzogIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgIF9jb250ZXh0NC5wcmV2ID0gMjk7CiAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgxMik7CiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggbW9kZWwgZnJvbSAnIi5jb25jYXQocHVibGljUGF0aCwgIic6ICIpLmNvbmNhdChfY29udGV4dDQudDAubWVzc2FnZSkpOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgbnVtQXR0ZW1wdHNMZWZ0LS07CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMzU7CiAgICAgICAgICAgIHJldHVybiBkZWxheSh3YWl0VGltZU1pbGxpc2Vjb25kcyk7CiAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICB3YWl0VGltZU1pbGxpc2Vjb25kcyA9IE1hdGgubWluKEJBQ0tPRkZfQ0FQX01JTExJU0VDT05EUywgd2FpdFRpbWVNaWxsaXNlY29uZHMgKiBCQUNLT0ZGX1NUQVJUX01JTExJU0VDT05EUyk7CiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgaWYgKCEoZXJyb3IgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA0MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBmZXRjaGluZyBtb2RlbCBmcm9tICciLmNvbmNhdChwdWJsaWNQYXRoLCAiJyIpKTsKICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzEyLCAyOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBfZnJvbVB1YmxpY0RpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBsb2FkTW9kZWwoX3gxMykgewogICAgcmV0dXJuIF9sb2FkTW9kZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CiAgZnVuY3Rpb24gX2xvYWRNb2RlbCgpIHsKICAgIF9sb2FkTW9kZWwgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUobW9kZWwpIHsKICAgICAgdmFyIGJhc2U2NCwgcHVibGljUGF0aCwgY3VzdG9tV3JpdGVQYXRoLCBfbW9kZWwkZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSwgX21vZGVsJHZlcnNpb24sIHZlcnNpb24sIF9tb2RlbCRudW1GZXRjaFJldHJpZSwgbnVtRmV0Y2hSZXRyaWVzOwogICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShtb2RlbCA9PT0gdW5kZWZpbmVkIHx8IG1vZGVsID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtb2RlbCBpcyB1bmRlZmluZWQgLyBlbXB0eScpOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBiYXNlNjQgPSBtb2RlbC5iYXNlNjQsIHB1YmxpY1BhdGggPSBtb2RlbC5wdWJsaWNQYXRoLCBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGgsIF9tb2RlbCRmb3JjZVdyaXRlID0gbW9kZWwuZm9yY2VXcml0ZSwgZm9yY2VXcml0ZSA9IF9tb2RlbCRmb3JjZVdyaXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9tb2RlbCRmb3JjZVdyaXRlLCBfbW9kZWwkdmVyc2lvbiA9IG1vZGVsLnZlcnNpb24sIHZlcnNpb24gPSBfbW9kZWwkdmVyc2lvbiA9PT0gdm9pZCAwID8gMSA6IF9tb2RlbCR2ZXJzaW9uLCBfbW9kZWwkbnVtRmV0Y2hSZXRyaWUgPSBtb2RlbC5udW1GZXRjaFJldHJpZXMsIG51bUZldGNoUmV0cmllcyA9IF9tb2RlbCRudW1GZXRjaFJldHJpZSA9PT0gdm9pZCAwID8gMCA6IF9tb2RlbCRudW1GZXRjaFJldHJpZTsKICAgICAgICAgICAgaWYgKCEoY3VzdG9tV3JpdGVQYXRoID09PSB1bmRlZmluZWQgfHwgY3VzdG9tV3JpdGVQYXRoID09PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjdXN0b21Xcml0ZVBhdGggb2YgdGhlIHByb3ZpZGVkIG1vZGVsIGlzIHVuZGVmaW5lZCAvIGVtcHR5Jyk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGlmICghKGJhc2U2NCAhPT0gdW5kZWZpbmVkICYmIGJhc2U2NCAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gODsKICAgICAgICAgICAgcmV0dXJuIGZyb21CYXNlNjQoY3VzdG9tV3JpdGVQYXRoLCBiYXNlNjQsIGZvcmNlV3JpdGUsIHZlcnNpb24pOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICghKHB1YmxpY1BhdGggIT09IHVuZGVmaW5lZCAmJiBwdWJsaWNQYXRoICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMzsKICAgICAgICAgICAgcmV0dXJuIGZyb21QdWJsaWNEaXJlY3RvcnkoY3VzdG9tV3JpdGVQYXRoLCBwdWJsaWNQYXRoLCBmb3JjZVdyaXRlLCB2ZXJzaW9uLCBudW1GZXRjaFJldHJpZXMpOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcm92aWRlZCBtb2RlbCBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBwdWJsaWNQYXRoIG9yIGJhc2U2NCB2YWx1ZSIpOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoInJldHVybiIsIGN1c3RvbVdyaXRlUGF0aCk7CiAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNSk7CiAgICB9KSk7CiAgICByZXR1cm4gX2xvYWRNb2RlbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgLyoNCiAgICBDb3B5cmlnaHQgMjAyMiBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCwgYXJyb3ctYm9keS1zdHlsZTogMCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOiAwLCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzOiAwICovCiAgdmFyIHdhc2lTbmFwc2hvdFByZXZpZXcxRW11bGF0b3IgPSB7CiAgICBhcmdzX2dldDogZnVuY3Rpb24gYXJnc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IGZ1bmN0aW9uIGFyZ3Nfc2l6ZXNfZ2V0KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fZ2V0OiBmdW5jdGlvbiBlbnZpcm9uX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX3NpemVzX2dldDogZnVuY3Rpb24gZW52aXJvbl9zaXplc19nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogZnVuY3Rpb24gY2xvY2tfcmVzX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja190aW1lX2dldDogZnVuY3Rpb24gY2xvY2tfdGltZV9nZXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiBmdW5jdGlvbiBmZF9hZHZpc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Nsb3NlOiBmdW5jdGlvbiBmZF9jbG9zZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9kYXRhc3luYzogZnVuY3Rpb24gZmRfZGF0YXN5bmMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogZnVuY3Rpb24gZmRfZmRzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X2ZsYWdzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X2ZsYWdzKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfcmlnaHRzOiBmdW5jdGlvbiBmZF9mZHN0YXRfc2V0X3JpZ2h0cyhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9nZXQ6IGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfc2l6ZTogZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IGZ1bmN0aW9uIGZkX3ByZWFkKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZ2V0OiBmdW5jdGlvbiBmZF9wcmVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2Rpcl9uYW1lOiBmdW5jdGlvbiBmZF9wcmVzdGF0X2Rpcl9uYW1lKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3B3cml0ZTogZnVuY3Rpb24gZmRfcHdyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlYWQ6IGZ1bmN0aW9uIGZkX3JlYWQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogZnVuY3Rpb24gZmRfcmVhZGRpcihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZW51bWJlcjogZnVuY3Rpb24gZmRfcmVudW1iZXIoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogZnVuY3Rpb24gZmRfc2VlayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zeW5jOiBmdW5jdGlvbiBmZF9zeW5jKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3RlbGw6IGZ1bmN0aW9uIGZkX3RlbGwoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IGZ1bmN0aW9uIGZkX3dyaXRlKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfY3JlYXRlX2RpcmVjdG9yeTogZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfZ2V0OiBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X3NldF90aW1lczogZnVuY3Rpb24gcGF0aF9maWxlc3RhdF9zZXRfdGltZXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiBmdW5jdGlvbiBwYXRoX2xpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiBmdW5jdGlvbiBwYXRoX29wZW4oaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogZnVuY3Rpb24gcGF0aF9yZWFkbGluayhpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbW92ZV9kaXJlY3Rvcnk6IGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbmFtZTogZnVuY3Rpb24gcGF0aF9yZW5hbWUoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiBmdW5jdGlvbiBwYXRoX3N5bWxpbmsoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogZnVuY3Rpb24gcGF0aF91bmxpbmtfZmlsZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwb2xsX29uZW9mZjogZnVuY3Rpb24gcG9sbF9vbmVvZmYoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiBmdW5jdGlvbiBwcm9jX2V4aXQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogZnVuY3Rpb24gcHJvY19yYWlzZShpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzY2hlZF95aWVsZDogZnVuY3Rpb24gc2NoZWRfeWllbGQoaW5wdXQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogZnVuY3Rpb24gcmFuZG9tX2dldChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3JlY3Y6IGZ1bmN0aW9uIHNvY2tfcmVjdihpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NlbmQ6IGZ1bmN0aW9uIHNvY2tfc2VuZChpbnB1dCkgewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NodXRkb3duOiBmdW5jdGlvbiBzb2NrX3NodXRkb3duKGlucHV0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH07CgogIC8qKg0KICAgKiBJbXBvcnRzIGFuZCBFeHBvcnRzIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgV0FTTS4NCiAgICoNCiAgICogQHBhcmFtIG1lbW9yeSBJbml0aWFsaXplZCBXZWJBc3NlbWJseSBtZW1vcnkgb2JqZWN0Lg0KICAgKiBAcGFyYW0gd2FzbSBUaGUgd2FzbSBmaWxlIGluIGJhc2U2NCBzdHJpbmcgb3Igc3RyZWFtIHRvIHB1YmxpYyBwYXRoIChpLmUuIGZldGNoKCJmaWxlLndhc20iKSkgdG8gaW5pdGlhbGl6ZS4NCiAgICogQHBhcmFtIHB2RXJyb3IgVGhlIFB2RXJyb3Igb2JqZWN0IHRvIHN0b3JlIGVycm9yIGRldGFpbHMuDQogICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBXQVNNLg0KICAgKi8KICBmdW5jdGlvbiBidWlsZFdhc20oX3gsIF94MiwgX3gzKSB7CiAgICByZXR1cm4gX2J1aWxkV2FzbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICBmdW5jdGlvbiBfYnVpbGRXYXNtKCkgewogICAgX2J1aWxkV2FzbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlOShtZW1vcnksIHdhc20sIHB2RXJyb3IpIHsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkh0dHBzUmVxdWVzdFdhc20sIHB2R2V0QnJvd3NlckluZm8sIHB2R2V0T3JpZ2luSW5mbywgcHZGaWxlT3Blbldhc20sIHB2RmlsZUNsb3NlV2FzbSwgcHZGaWxlUmVhZFdhc20sIHB2RmlsZVdyaXRlV2FzbSwgcHZGaWxlU2Vla1dhc20sIHB2RmlsZVRlbGxXYXNtLCBwdkZpbGVSZW1vdmVXYXNtLCBpbXBvcnRPYmplY3QsIGluc3RhbmNlLCByZXNwb25zZSwgZGF0YSwgd2FzbUNvZGVBcnJheSwgYWxpZ25lZF9hbGxvYzsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTkkKF9jb250ZXh0OSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgcHZDb25zb2xlTG9nV2FzbSA9IGZ1bmN0aW9uIHB2Q29uc29sZUxvZ1dhc20oaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBpbmRleCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkFzc2VydFdhc20gPSBmdW5jdGlvbiBwdkFzc2VydFdhc20oZXhwciwgbGluZSwgZmlsZU5hbWVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgaWYgKGV4cHIgPT09IDApIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBmaWxlTmFtZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgIi5jb25jYXQobGluZSwgIiBpbiBcIiIpLmNvbmNhdChmaWxlTmFtZSwgIlwiIikpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZUaW1lV2FzbSA9IGZ1bmN0aW9uIHB2VGltZVdhc20oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkh0dHBzUmVxdWVzdFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaHR0cE1ldGhvZEFkZHJlc3MsIHNlcnZlck5hbWVBZGRyZXNzLCBlbmRwb2ludEFkZHJlc3MsIGhlYWRlckFkZHJlc3MsIGJvZHlBZGRyZXNzLCB0aW1lb3V0TXMsIHJlc3BvbnNlQWRkcmVzc0FkZHJlc3MsIHJlc3BvbnNlU2l6ZUFkZHJlc3MsIHJlc3BvbnNlQ29kZUFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBodHRwTWV0aG9kLCBzZXJ2ZXJOYW1lLCBlbmRwb2ludCwgaGVhZGVyLCBib2R5LCBoZWFkZXJPYmplY3QsIHJlc3BvbnNlLCByZXNwb25zZVRleHQsIHN0YXR1c0NvZGUsIHJlc3BvbnNlQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBodHRwTWV0aG9kQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHNlcnZlck5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGVuZHBvaW50QWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaGVhZGVyQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGJvZHlBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck9iamVjdCA9IHN0cmluZ0hlYWRlclRvT2JqZWN0KGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNjsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoV2l0aFRpbWVvdXQoJ2h0dHBzOi8vJyArIHNlcnZlck5hbWUgKyBlbmRwb2ludCwgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGh0dHBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keQogICAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dE1zKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbImNhdGNoIl0oNik7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2SHR0cHNSZXF1ZXN0V2FzbScsICJGYWlsZWQgdG8gZmV0Y2g6ICIuY29uY2F0KF9jb250ZXh0LnQwKSk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0WyJjYXRjaCJdKDE3KTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZIdHRwc1JlcXVlc3RXYXNtJywgIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgdGV4dDogIi5jb25jYXQoX2NvbnRleHQudDEpKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChyZXNwb25zZVRleHQubGVuZ3RoICsgMSkgKiBJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUFkZHJlc3MgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzcG9uc2VBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdk1hbGxvY0Vycm9yJywgInB2SHR0cHNSZXF1ZXN0V2FzbTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UiKTsKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3Jlc3BvbnNlQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbcmVzcG9uc2VTaXplQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gcmVzcG9uc2VUZXh0Lmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUFkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSByZXNwb25zZUFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcG9uc2VUZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W3Jlc3BvbnNlQWRkcmVzcyArIGldID0gcmVzcG9uc2VUZXh0LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtyZXNwb25zZUFkZHJlc3MgKyByZXNwb25zZVRleHQubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltyZXNwb25zZUNvZGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbNiwgMTNdLCBbMTcsIDIzXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZIdHRwc1JlcXVlc3RXYXNtKF94NCwgX3g1LCBfeDYsIF94NywgX3g4LCBfeDksIF94MTAsIF94MTEsIF94MTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkdldEJyb3dzZXJJbmZvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoYnJvd3NlckluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHVzZXJBZ2VudCwgYnJvd3NlckluZm9BZGRyZXNzLCBpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICd1bmtub3duJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZF9hbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAodXNlckFnZW50Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgYnJvd3NlckluZm9BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShicm93c2VySW5mb0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2TWFsbG9jRXJyb3InLCAicHZHZXRCcm93c2VySW5mbzogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnJvd3NlciBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMlticm93c2VySW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW2Jyb3dzZXJJbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGJyb3dzZXJJbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1c2VyQWdlbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYnJvd3NlckluZm9BZGRyZXNzICsgaV0gPSB1c2VyQWdlbnQuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2Jyb3dzZXJJbmZvQWRkcmVzcyArIHVzZXJBZ2VudC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZHZXRCcm93c2VySW5mbyhfeDEzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2R2V0T3JpZ2luSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKG9yaWdpbkluZm9BZGRyZXNzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIF9zZWxmJG9yaWdpbjsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW4sIGhvc3RuYW1lLCBvcmlnaW5JbmZvQWRkcmVzcywgaTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IChfc2VsZiRvcmlnaW4gPSBzZWxmLm9yaWdpbikgIT09IG51bGwgJiYgX3NlbGYkb3JpZ2luICE9PSB2b2lkIDAgPyBfc2VsZiRvcmlnaW4gOiBzZWxmLmxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChob3N0bmFtZS5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkluZm9BZGRyZXNzID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmlnaW5JbmZvQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZNYWxsb2NFcnJvcicsICJwdkdldE9yaWdpbkluZm86IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yaWdpbiBpbmZvIik7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltvcmlnaW5JbmZvQWRkcmVzc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb3JpZ2luSW5mb0FkZHJlc3NBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBvcmlnaW5JbmZvQWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0bmFtZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFtvcmlnaW5JbmZvQWRkcmVzcyArIGldID0gaG9zdG5hbWUuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W29yaWdpbkluZm9BZGRyZXNzICsgaG9zdG5hbWUubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2R2V0T3JpZ2luSW5mbyhfeDE0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZU9wZW5XYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZmlsZUFkZHJlc3MsIHBhdGhBZGRyZXNzLCBtb2RlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgICAgdmFyIHBhdGgsIG1vZGUsIGZpbGU7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgbW9kZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAyOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgUHZGaWxlLnNldFB0cihmaWxlQWRkcmVzcywgZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0LnQwID0gX2NvbnRleHQ0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0NC50MC5uYW1lICE9PSAiRmlsZU5vdEV4aXN0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVPcGVuV2FzbScsIF9jb250ZXh0NC50MCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQsIG51bGwsIFtbMiwgMTBdXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVPcGVuV2FzbShfeDE1LCBfeDE2LCBfeDE3LCBfeDE4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIHB2RmlsZUNsb3NlV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY1ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGZpbGVBZGRyZXNzLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZTsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnByZXYgPSA5OwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gX2NvbnRleHQ1WyJjYXRjaCJdKDApOwogICAgICAgICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVDbG9zZVdhc20nLCBfY29udGV4dDUudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU1LCBudWxsLCBbWzAsIDldXSk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oX3gxOSwgX3gyMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIF9yZWY2ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ2LnByZXYgPSBfY29udGV4dDYubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5yZWFkKHNpemUsIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gX2NvbnRleHQ2LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnByZXYgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MCA9IF9jb250ZXh0NlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlUmVhZFdhc20nLCBfY29udGV4dDYudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNiwgbnVsbCwgW1swLCAxMV1dKTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKF94MjEsIF94MjIsIF94MjMsIF94MjQsIF94MjUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlV3JpdGVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSwgY29udGVudDsKICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gX2NvbnRleHQ3LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUud3JpdGUoY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBjb250ZW50Lmxlbmd0aCAvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDcudDAgPSBfY29udGV4dDdbImNhdGNoIl0oMCk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVdyaXRlV2FzbScsIF9jb250ZXh0Ny50MCk7CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1Xcml0ZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU3LCBudWxsLCBbWzAsIDExXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlV3JpdGVXYXNtKF94MjYsIF94MjcsIF94MjgsIF94MjksIF94MzApIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgcHZGaWxlU2Vla1dhc20gPSBmdW5jdGlvbiBwdkZpbGVTZWVrV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0LCB3aGVuY2UsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGUuZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHB2RXJyb3IgPT09IG51bGwgfHwgcHZFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHZFcnJvci5hZGRFcnJvcigncHZGaWxlU2Vla1dhc20nLCBlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlVGVsbFdhc20gPSBmdW5jdGlvbiBwdkZpbGVUZWxsV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0QWRkcmVzcykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gZmlsZS50ZWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcHZFcnJvciA9PT0gbnVsbCB8fCBwdkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdkVycm9yLmFkZEVycm9yKCdwdkZpbGVUZWxsV2FzbScsIGUpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZW1vdmVXYXNtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoLCBmaWxlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTgkKF9jb250ZXh0OCkgewogICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgucHJldiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlbihwYXRoLCAidyIpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBfY29udGV4dDguc2VudDsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0OC5wcmV2ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDgudDAgPSBfY29udGV4dDhbImNhdGNoIl0oMSk7CiAgICAgICAgICAgICAgICAgICAgICBwdkVycm9yID09PSBudWxsIHx8IHB2RXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHB2RXJyb3IuYWRkRXJyb3IoJ3B2RmlsZVJlbW92ZVdhc20nLCBfY29udGV4dDgudDApOwogICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU4LCBudWxsLCBbWzEsIDEwXV0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHZGaWxlUmVtb3ZlV2FzbShfeDMxLCBfeDMyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIGltcG9ydE9iamVjdCA9IHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlCiAgICAgICAgICAgICAgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzaVNuYXBzaG90UHJldmlldzFFbXVsYXRvciwKICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgcHZfY29uc29sZV9sb2dfd2FzbTogcHZDb25zb2xlTG9nV2FzbSwKICAgICAgICAgICAgICAgIHB2X2Fzc2VydF93YXNtOiBwdkFzc2VydFdhc20sCiAgICAgICAgICAgICAgICBwdl90aW1lX3dhc206IHB2VGltZVdhc20sCiAgICAgICAgICAgICAgICBwdl9odHRwc19yZXF1ZXN0X3dhc206IHB2SHR0cHNSZXF1ZXN0V2FzbSwKICAgICAgICAgICAgICAgIHB2X2dldF9icm93c2VyX2luZm86IHB2R2V0QnJvd3NlckluZm8sCiAgICAgICAgICAgICAgICBwdl9nZXRfb3JpZ2luX2luZm86IHB2R2V0T3JpZ2luSW5mbywKICAgICAgICAgICAgICAgIHB2X2ZpbGVfb3Blbl93YXNtOiBwdkZpbGVPcGVuV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfY2xvc2Vfd2FzbTogcHZGaWxlQ2xvc2VXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9yZWFkX3dhc206IHB2RmlsZVJlYWRXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV93cml0ZV93YXNtOiBwdkZpbGVXcml0ZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3NlZWtfd2FzbTogcHZGaWxlU2Vla1dhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3RlbGxfd2FzbTogcHZGaWxlVGVsbFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlbW92ZV93YXNtOiBwdkZpbGVSZW1vdmVXYXNtCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoISh3YXNtIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyMDsKICAgICAgICAgICAgcmV0dXJuIGEod2FzbSwgaW1wb3J0T2JqZWN0KTsKICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgIGluc3RhbmNlID0gX2NvbnRleHQ5LnNlbnQuaW5zdGFuY2U7CiAgICAgICAgICAgIF9jb250ZXh0OS5uZXh0ID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAyNTsKICAgICAgICAgICAgcmV0dXJuIHdhc207CiAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0OS5zZW50OwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDI4OwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgIGRhdGEgPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzMTsKICAgICAgICAgICAgcmV0dXJuIG4obmV3IFVpbnQ4QXJyYXkoZGF0YSksIGltcG9ydE9iamVjdCk7CiAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICBpbnN0YW5jZSA9IF9jb250ZXh0OS5zZW50Lmluc3RhbmNlOwogICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICB3YXNtQ29kZUFycmF5ID0gYmFzZTY0VG9VaW50OEFycmF5KHdhc20pOwogICAgICAgICAgICBfY29udGV4dDkubmV4dCA9IDM3OwogICAgICAgICAgICByZXR1cm4gbih3YXNtQ29kZUFycmF5LCBpbXBvcnRPYmplY3QpOwogICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dDkuc2VudC5pbnN0YW5jZTsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBpbnN0YW5jZS5leHBvcnRzKTsKICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWU5KTsKICAgIH0pKTsKICAgIHJldHVybiBfYnVpbGRXYXNtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQyKGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwogIH0KCiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8sIG1pbkxlbikgewogICAgaWYgKCFvKSByZXR1cm47CiAgICBpZiAodHlwZW9mIG8gPT09ICJzdHJpbmciKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQoKICAvKg0KICAgIENvcHlyaWdodCAyMDIzIFBpY292b2ljZSBJbmMuDQoKICAgIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlICJMSUNFTlNFIg0KICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uDQogICAgYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQogICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICB2YXIgUHZFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdkVycm9yKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZFcnJvcik7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX21heE51bUVycm9ycyIsIDEwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfZXJyb3JzIiwgW10pOwogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgIl9sYXN0RXJyb3IiLCB2b2lkIDApOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKFB2RXJyb3IsIFt7CiAgICAgIGtleTogImFkZEVycm9yIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogU3RvcmUgYW4gZXJyb3Igd2l0aCBhIGtleSBhbmQgbWVzc2FnZS4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhZGRFcnJvcihrZXksIGVycm9yKSB7CiAgICAgICAgdGhpcy5fbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKTsKICAgICAgICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA+PSB0aGlzLl9tYXhOdW1FcnJvcnMpIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goewogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIG1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KGVycm9yKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IGFsbCByZWNlbnQgZXJyb3IgbWVzc2FnZXMuIENsZWFucyB1cCBlcnJvciBsaXN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9ycyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFcnJvcnMoKSB7CiAgICAgICAgdmFyIGVycm9ycyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLl9lcnJvcnMpOwogICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdOwogICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBHZXQgZXJyb3JzIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldEVycm9yU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVycm9yU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ycygpLm1hcChmdW5jdGlvbiAoX3JlZikgewogICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LAogICAgICAgICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlOwogICAgICAgICAgcmV0dXJuICInIi5jb25jYXQoa2V5LCAiJyBmYWlsZWQgd2l0aDogIikuY29uY2F0KG1lc3NhZ2UsICIuIik7CiAgICAgICAgfSkuam9pbignXG4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhZGRlZCB0byB0aGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImdldExhc3RFcnJvciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXN0RXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBpdCBjYW4gc3RvcmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0TWF4RXJyb3JOdW0iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWF4RXJyb3JOdW0obnVtKSB7CiAgICAgICAgdGhpcy5fbWF4TnVtRXJyb3JzID0gbnVtOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZFcnJvcjsKICB9KCk7CgogIGNvbnN0IHNpbWQ9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkkMSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfQogIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZiQxKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YkMSh0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4kMSh0aGlzLCByZXN1bHQpOyB9OyB9CiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KICB2YXIgUFZfU1RBVFVTX1NVQ0NFU1MgPSAxMDAwMDsKICB2YXIgTUFYX1BDTV9MRU5HVEhfU0VDID0gNjAgKiAxNTsKICB2YXIgRWFnbGVCYXNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEVhZ2xlQmFzZShoYW5kbGVXYXNtKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlQmFzZSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfcHZTdGF0dXNUb1N0cmluZyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfd2FzbU1lbW9yeSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKHRoaXMsICJfYWxpZ25lZEFsbG9jIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEodGhpcywgIl9wdkZyZWUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX2Z1bmN0aW9uTXV0ZXgiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMSh0aGlzLCAiX3B2RXJyb3IiLCB2b2lkIDApOwogICAgICBFYWdsZUJhc2UuX3NhbXBsZVJhdGUgPSBoYW5kbGVXYXNtLnNhbXBsZVJhdGU7CiAgICAgIEVhZ2xlQmFzZS5fdmVyc2lvbiA9IGhhbmRsZVdhc20udmVyc2lvbjsKICAgICAgdGhpcy5fcHZTdGF0dXNUb1N0cmluZyA9IGhhbmRsZVdhc20ucHZTdGF0dXNUb1N0cmluZzsKICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IGhhbmRsZVdhc20ubWVtb3J5OwogICAgICB0aGlzLl9hbGlnbmVkQWxsb2MgPSBoYW5kbGVXYXNtLmFsaWduZWRBbGxvYzsKICAgICAgdGhpcy5fcHZGcmVlID0gaGFuZGxlV2FzbS5wdkZyZWU7CiAgICAgIHRoaXMuX3B2RXJyb3IgPSBoYW5kbGVXYXNtLnB2RXJyb3I7CiAgICAgIHRoaXMuX2Z1bmN0aW9uTXV0ZXggPSBuZXcgTXV0ZXgoKTsKICAgIH0KICAgIC8qKg0KICAgICAqIEF1ZGlvIHNhbXBsZSByYXRlIHJlcXVpcmVkIGJ5IEVhZ2xlLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoRWFnbGVCYXNlLCBbewogICAgICBrZXk6ICJzYW1wbGVSYXRlIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIEVhZ2xlQmFzZS5fc2FtcGxlUmF0ZTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFZlcnNpb24gb2YgRWFnbGUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAidmVyc2lvbiIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZUJhc2UuX3ZlcnNpb247CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBTZXQgYmFzZTY0IHdhc20gZmlsZS4NCiAgICAgICAqIEBwYXJhbSB3YXNtIEJhc2U2NCdkIHdhc20gZmlsZSB0byB1c2UgdG8gaW5pdGlhbGl6ZSB3YXNtLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAic2V0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXYXNtKHdhc20pIHsKICAgICAgICBpZiAodGhpcy5fd2FzbSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLl93YXNtID0gd2FzbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBTZXQgYmFzZTY0IHdhc20gZmlsZSB3aXRoIFNJTUQgZmVhdHVyZS4NCiAgICAgICAqIEBwYXJhbSB3YXNtU2ltZCBCYXNlNjQnZCB3YXNtIGZpbGUgdG8gdXNlIHRvIGluaXRpYWxpemUgd2FzbS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJzZXRXYXNtU2ltZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXYXNtU2ltZCh3YXNtU2ltZCkgewogICAgICAgIGlmICh0aGlzLl93YXNtU2ltZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLl93YXNtU2ltZCA9IHdhc21TaW1kOwogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdEJhc2VXYXNtIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXRCYXNlV2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod2FzbUJhc2U2NCwgd2FzbU1lbW9yeVNpemUpIHsKICAgICAgICAgIHZhciBtZW1vcnksIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwdkVycm9yLCBleHBvcnRzLCBhbGlnbmVkX2FsbG9jLCBwdl9mcmVlLCBwdl9lYWdsZV92ZXJzaW9uLCBwdl9zYW1wbGVfcmF0ZSwgcHZfc3RhdHVzX3RvX3N0cmluZywgc2FtcGxlUmF0ZSwgdmVyc2lvbkFkZHJlc3MsIHZlcnNpb247CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgLy8gQSBXZWJBc3NlbWJseSBwYWdlIGhhcyBhIGNvbnN0YW50IHNpemUgb2YgNjRLaUIuIC0+IDFNaUIgfj0gMTYgcGFnZXMKICAgICAgICAgICAgICAgIG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoewogICAgICAgICAgICAgICAgICBpbml0aWFsOiB3YXNtTWVtb3J5U2l6ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgcHZFcnJvciA9IG5ldyBQdkVycm9yKCk7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTsKICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFdhc20obWVtb3J5LCB3YXNtQmFzZTY0LCBwdkVycm9yKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBleHBvcnRzID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgICAgICBwdl9mcmVlID0gZXhwb3J0cy5wdl9mcmVlOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfdmVyc2lvbiA9IGV4cG9ydHMucHZfZWFnbGVfdmVyc2lvbjsKICAgICAgICAgICAgICAgIHB2X3NhbXBsZV9yYXRlID0gZXhwb3J0cy5wdl9zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIHB2X3N0YXR1c190b19zdHJpbmcgPSBleHBvcnRzLnB2X3N0YXR1c190b19zdHJpbmc7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfc2FtcGxlX3JhdGUoKTsKICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfdmVyc2lvbigpOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICB2ZXJzaW9uQWRkcmVzcyA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHZlcnNpb25BZGRyZXNzKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgbWVtb3J5OiBtZW1vcnksCiAgICAgICAgICAgICAgICAgIGFsaWduZWRBbGxvYzogYWxpZ25lZF9hbGxvYywKICAgICAgICAgICAgICAgICAgcHZGcmVlOiBwdl9mcmVlLAogICAgICAgICAgICAgICAgICBwdkVycm9yOiBwdkVycm9yLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICBwdlN0YXR1c1RvU3RyaW5nOiBwdl9zdGF0dXNfdG9fc3RyaW5nLAogICAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXRCYXNlV2FzbShfeCwgX3gyKSB7CiAgICAgICAgICByZXR1cm4gX2luaXRCYXNlV2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0QmFzZVdhc207CiAgICAgIH0oKQogICAgfV0pOwogICAgcmV0dXJuIEVhZ2xlQmFzZTsKICB9KCk7CiAgLyoqDQogICAqIEphdmFTY3JpcHQvV2ViQXNzZW1ibHkgYmluZGluZyBmb3IgdGhlIHByb2ZpbGVyIG9mIHRoZSBFYWdsZSBTcGVha2VyIFJlY29nbml0aW9uIGVuZ2luZS4NCiAgICogSXQgZW5yb2xscyBhIHNwZWFrZXIgZ2l2ZW4gYSBzZXQgb2YgdXR0ZXJhbmNlcyBhbmQgdGhlbiBjb25zdHJ1Y3RzIGEgcHJvZmlsZSBmb3IgdGhlIGVucm9sbGVkIHNwZWFrZXIuDQogICAqLwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl9zYW1wbGVSYXRlIiwgdm9pZCAwKTsKICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZUJhc2UsICJfdmVyc2lvbiIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX3dhc20iLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlQmFzZSwgIl93YXNtU2ltZCIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVCYXNlLCAiX2VhZ2xlTXV0ZXgiLCBuZXcgTXV0ZXgoKSk7CiAgdmFyIEVhZ2xlUHJvZmlsZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FYWdsZUJhc2UpIHsKICAgIF9pbmhlcml0cyQxKEVhZ2xlUHJvZmlsZXIsIF9FYWdsZUJhc2UpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihFYWdsZVByb2ZpbGVyKTsKICAgIGZ1bmN0aW9uIEVhZ2xlUHJvZmlsZXIoaGFuZGxlV2FzbSkgewogICAgICB2YXIgX3RoaXM7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVhZ2xlUHJvZmlsZXIpOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGhhbmRsZVdhc20pOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlckRlbGV0ZSIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpcyksICJfcHZFYWdsZVByb2ZpbGVyRW5yb2xsIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXMpLCAiX3B2RWFnbGVQcm9maWxlclJlc2V0Iiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzKSwgIl9vYmplY3RBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgRWFnbGVQcm9maWxlci5fbWluRW5yb2xsU2FtcGxlcyA9IGhhbmRsZVdhc20ubWluRW5yb2xsU2FtcGxlczsKICAgICAgRWFnbGVQcm9maWxlci5fcHJvZmlsZVNpemUgPSBoYW5kbGVXYXNtLnByb2ZpbGVTaXplOwogICAgICBFYWdsZVByb2ZpbGVyLl9tYXhFbnJvbGxTYW1wbGVzID0gTUFYX1BDTV9MRU5HVEhfU0VDICogRWFnbGVQcm9maWxlci5fc2FtcGxlUmF0ZTsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlckRlbGV0ZSA9IGhhbmRsZVdhc20ucHZFYWdsZVByb2ZpbGVyRGVsZXRlOwogICAgICBfdGhpcy5fcHZFYWdsZVByb2ZpbGVyRW5yb2xsID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJFbnJvbGw7CiAgICAgIF90aGlzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9maWxlckV4cG9ydDsKICAgICAgX3RoaXMuX3B2RWFnbGVQcm9maWxlclJlc2V0ID0gaGFuZGxlV2FzbS5wdkVhZ2xlUHJvZmlsZXJSZXNldDsKICAgICAgX3RoaXMuX29iamVjdEFkZHJlc3MgPSBoYW5kbGVXYXNtLm9iamVjdEFkZHJlc3M7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIC8qKg0KICAgICAqIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgcGNtIHJlcXVpcmVkIGJ5IGAuZW5yb2xsKClgLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoRWFnbGVQcm9maWxlciwgW3sKICAgICAga2V5OiAibWluRW5yb2xsU2FtcGxlcyIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBFYWdsZVByb2ZpbGVyLl9taW5FbnJvbGxTYW1wbGVzOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBwcm9maWxlciBjb21wb25lbnQgb2YgdGhlIEVhZ2xlIFNwZWFrZXIgUmVjb2duaXRpb24gRW5naW5lLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBhY2Nlc3NLZXkgQWNjZXNzS2V5IG9idGFpbmVkIGZyb20gUGljb3ZvaWNlIENvbnNvbGUgKGh0dHBzOi8vY29uc29sZS5waWNvdm9pY2UuYWkvKS4NCiAgICAgICAqIEBwYXJhbSBtb2RlbCBFYWdsZSBtb2RlbCBvcHRpb25zLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmJhc2U2NCBUaGUgbW9kZWwgaW4gYmFzZTY0IHN0cmluZyB0byBpbml0aWFsaXplIEVhZ2xlLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnB1YmxpY1BhdGggVGhlIG1vZGVsIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1YmxpYyBkaXJlY3RvcnkuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuY3VzdG9tV3JpdGVQYXRoIEN1c3RvbSBwYXRoIHRvIHNhdmUgdGhlIG1vZGVsIGluIHN0b3JhZ2UuDQogICAgICAgKiBTZXQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byB1c2UgbXVsdGlwbGUgbW9kZWxzIGFjcm9zcyBgZWFnbGVgIGluc3RhbmNlcy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5mb3JjZVdyaXRlIEZsYWcgdG8gb3ZlcndyaXRlIHRoZSBtb2RlbCBpbiBzdG9yYWdlIGV2ZW4gaWYgaXQgZXhpc3RzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnZlcnNpb24gVmVyc2lvbiBvZiB0aGUgbW9kZWwgZmlsZS4gSW5jcmVtZW50IHRvIHVwZGF0ZSB0aGUgbW9kZWwgZmlsZSBpbiBzdG9yYWdlLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImVucm9sbCIsCiAgICAgIHZhbHVlOgogICAgICAvKioNCiAgICAgICAqIEVucm9sbHMgYSBzcGVha2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgdXR0ZXJhbmNlcyBvZiB0aGUgc2FtZSBzcGVha2VyDQogICAgICAgKiB1bnRpbCBgcGVyY2VudGFnZWAgcmVhY2hlcyBgMTAwLjBgLCBhdCB3aGljaCBwb2ludCBhIHNwZWFrZXIgdm9pY2UgcHJvZmlsZSBjYW4gYmUgZXhwb3J0ZWQgdXNpbmcgYC5leHBvcnQoKWAuDQogICAgICAgKiBBbnkgZnVydGhlciBlbnJvbGxtZW50IGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHNwZWFrZXIgcHJvZmlsZS4gVGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCBwY20gdG8NCiAgICAgICAqIGAuZW5yb2xsKClgIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIGAubWluRW5yb2xsU2FtcGxlc2AuDQogICAgICAgKiBUaGUgYXVkaW8gZGF0YSB1c2VkIGZvciBlbnJvbGxtZW50IHNob3VsZCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOg0KICAgICAgICogICAgLSBvbmx5IG9uZSBzcGVha2VyIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBhdWRpbw0KICAgICAgICogICAgLSB0aGUgc3BlYWtlciBzaG91bGQgYmUgc3BlYWtpbmcgaW4gYSBub3JtYWwgdm9pY2UNCiAgICAgICAqICAgIC0gdGhlIGF1ZGlvIHNob3VsZCBjb250YWluIG5vIHNwZWVjaCBmcm9tIG90aGVyIHNwZWFrZXJzIGFuZCBubyBvdGhlciBzb3VuZHMgKGUuZy4gbXVzaWMpDQogICAgICAgKiAgICAtIGl0IHNob3VsZCBiZSBjYXB0dXJlZCBpbiBhIHF1aWV0IGVudmlyb25tZW50IHdpdGggbm8gYmFja2dyb3VuZCBub2lzZQ0KICAgICAgICogQHBhcmFtIHBjbSBBdWRpbyBkYXRhIGZvciBlbnJvbGxtZW50LiBUaGUgYXVkaW8gbmVlZHMgdG8gaGF2ZSBhIHNhbXBsZSByYXRlIGVxdWFsIHRvIGAuc2FtcGxlUmF0ZWAgYW5kIGJlDQogICAgICAgKiAxNi1iaXQgbGluZWFybHktZW5jb2RlZC4gRWFnbGVQcm9maWxlciBvcGVyYXRlcyBvbiBzaW5nbGUtY2hhbm5lbCBhdWRpby4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIFRoZSBwZXJjZW50YWdlIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgc3BlYWtlciBlbnJvbGxtZW50IHByb2Nlc3MgYWxvbmcgd2l0aCB0aGUgZmVlZGJhY2sgY29kZQ0KICAgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlbnJvbGxtZW50IGF0dGVtcHQ6DQogICAgICAgKiAgICAtIGBBVURJT19PS2A6IFRoZSBhdWRpbyBpcyBnb29kIGZvciBlbnJvbGxtZW50Lg0KICAgICAgICogICAgLSBgQVVESU9fVE9PX1NIT1JUYDogQXVkaW8gbGVuZ3RoIGlzIGluc3VmZmljaWVudCBmb3IgZW5yb2xsbWVudCwNCiAgICAgICAqICAgICAgIGkuZS4gaXQgaXMgc2hvcnRlciB0aGFuYC5taW5fZW5yb2xsX3NhbXBsZXNgLg0KICAgICAgICogICAgLSBgVU5LTk9XTl9TUEVBS0VSYDogVGhlcmUgaXMgYW5vdGhlciBzcGVha2VyIGluIHRoZSBhdWRpbyB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVha2VyDQogICAgICAgKiAgICAgICBiZWluZyBlbnJvbGxlZC4gVG9vIG11Y2ggYmFja2dyb3VuZCBub2lzZSBtYXkgY2F1c2UgdGhpcyBlcnJvciBhcyB3ZWxsLg0KICAgICAgICogICAgLSBgTk9fVk9JQ0VfRk9VTkRgOiBUaGUgYXVkaW8gZG9lcyBub3QgY29udGFpbiBhbnkgdm9pY2UsIGkuZS4gaXQgaXMgc2lsZW50IG9yDQogICAgICAgKiAgICAgICBoYXMgYSBsb3cgc2lnbmFsLXRvLW5vaXNlIHJhdGlvLg0KICAgICAgICogICAgLSBgUVVBTElUWV9JU1NVRWA6IFRoZSBhdWRpbyBxdWFsaXR5IGlzIHRvbyBsb3cgZm9yIGVucm9sbG1lbnQgZHVlIHRvIGEgYmFkIG1pY3JvcGhvbmUNCiAgICAgICAqICAgICAgIG9yIHJlY29yZGluZyBlbnZpcm9ubWVudC4NCiAgICAgICAqLwogICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9lbnJvbGwgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHBjbSkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChwY20gaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBhcmd1bWVudCAncGNtJyBtdXN0IGJlIHByb3ZpZGVkIGFzIGFuIEludDE2QXJyYXkiKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBpZiAoIShwY20ubGVuZ3RoID4gRWFnbGVQcm9maWxlci5fbWF4RW5yb2xsU2FtcGxlcykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJ3BjbScgc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiAiLmNvbmNhdChFYWdsZVByb2ZpbGVyLl9tYXhFbnJvbGxTYW1wbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMyLl9mdW5jdGlvbk11dGV4LnJ1bkV4Y2x1c2l2ZSggLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBjbUFkZHJlc3MsIGZlZWRiYWNrQWRkcmVzcywgcGVyY2VudGFnZUFkZHJlc3MsIG1lbW9yeUJ1ZmZlckludDE2LCBzdGF0dXMsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJWaWV3LCBmZWVkYmFjaywgcGVyY2VudGFnZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzMi5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5lbnJvbGwoKWAgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwY20ubGVuZ3RoICogSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwY21BZGRyZXNzID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX2FsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrQWRkcmVzcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZlZWRiYWNrQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZUFkZHJlc3MgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZXJjZW50YWdlQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MTYgPSBuZXcgSW50MTZBcnJheShfdGhpczIuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNi5zZXQocGNtLCBwY21BZGRyZXNzIC8gSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxOTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkVhZ2xlUHJvZmlsZXJFbnJvbGwoX3RoaXMyLl9vYmplY3RBZGRyZXNzLCBwY21BZGRyZXNzLCBwY20ubGVuZ3RoLCBmZWVkYmFja0FkZHJlc3MsIHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwY21BZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShmZWVkYmFja0FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5fcHZGcmVlKHBlcmNlbnRhZ2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzMi5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IEVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MSA9ICJlbnJvbGwgZmFpbGVkIHdpdGggc3RhdHVzICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQzID0gbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdlN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ0ID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLnQ1ID0gKDAsIF9jb250ZXh0Mi50MikoX2NvbnRleHQyLnQzLCBfY29udGV4dDIudDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50NiA9IF9jb250ZXh0Mi50MS5jb25jYXQuY2FsbChfY29udGV4dDIudDEsIF9jb250ZXh0Mi50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0Mi50MChfY29udGV4dDIudDYpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclZpZXcgPSBuZXcgRGF0YVZpZXcoX3RoaXMyLl93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2sgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKGZlZWRiYWNrQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IG1lbW9yeUJ1ZmZlclZpZXcuZ2V0RmxvYXQzMihwZXJjZW50YWdlQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0MzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLl9wdkZyZWUoZmVlZGJhY2tBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ1OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIuX3B2RnJlZShwZXJjZW50YWdlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrOiBmZWVkYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IHBlcmNlbnRhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGVucm9sbChfeDMpIHsKICAgICAgICAgIHJldHVybiBfZW5yb2xsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbnJvbGw7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIEV4cG9ydHMgdGhlIHNwZWFrZXIgcHJvZmlsZSBvZiB0aGUgY3VycmVudCBzZXNzaW9uLg0KICAgICAgICogV2lsbCB0aHJvdyBlcnJvciBpZiB0aGUgcHJvZmlsZSBpcyBub3QgcmVhZHkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiBBbiBFYWdsZVByb2ZpbGUgb2JqZWN0Lg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogImV4cG9ydCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9leHBvcnQyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNSgpIHsKICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczMuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZmlsZUFkZHJlc3MsIHN0YXR1cywgX21lbW9yeUJ1ZmZlclVpbnQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBwcm9maWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLl93YXNtTWVtb3J5ID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLmV4cG9ydCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBFYWdsZVByb2ZpbGVyLl9wcm9maWxlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9wdkVhZ2xlUHJvZmlsZXJFeHBvcnQoX3RoaXMzLl9vYmplY3RBZGRyZXNzLCBwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDQuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDExOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX21lbW9yeUJ1ZmZlclVpbnQgPSBuZXcgVWludDhBcnJheShfdGhpczMuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDEgPSAiZXhwb3J0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50MyA9IF9tZW1vcnlCdWZmZXJVaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NCA9IF9jb250ZXh0NC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0NC50NSA9ICgwLCBfY29udGV4dDQudDIpKF9jb250ZXh0NC50MywgX2NvbnRleHQ0LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQudDYgPSBfY29udGV4dDQudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ0LnQxLCBfY29udGV4dDQudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDQudDAoX2NvbnRleHQ0LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzMy5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBtZW1vcnlCdWZmZXJVaW50OC5zbGljZShwcm9maWxlQWRkcmVzcyAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHByb2ZpbGVBZGRyZXNzIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIEVhZ2xlUHJvZmlsZXIuX3Byb2ZpbGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDI2OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczMuX3B2RnJlZShwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTQpOwogICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTUpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfZXhwb3J0KCkgewogICAgICAgICAgcmV0dXJuIF9leHBvcnQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXhwb3J0OwogICAgICB9KCkKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIEVhZ2xlIFByb2ZpbGVyLg0KICAgICAgICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZW5yb2xsbWVudCBzZXNzaW9uLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3Jlc2V0ID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNygpIHsKICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlNyQoX2NvbnRleHQ3KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICBfdGhpczQuX2Z1bmN0aW9uTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlNigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHsKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzNC5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGNhbGwgYC5yZXNldCgpYCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5fcHZFYWdsZVByb2ZpbGVyUmVzZXQoX3RoaXM0Ll9vYmplY3RBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoX3RoaXM0Ll93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQwID0gRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQ2LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MiA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50MyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NCA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Ni50NSA9ICgwLCBfY29udGV4dDYudDIpKF9jb250ZXh0Ni50MywgX2NvbnRleHQ2LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDYudDYgPSBfY29udGV4dDYudDEuY29uY2F0LmNhbGwoX2NvbnRleHQ2LnQxLCBfY29udGV4dDYudDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBfY29udGV4dDYudDAoX2NvbnRleHQ2LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlNik7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlNyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgICAgcmV0dXJuIF9yZXNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzZXQ7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBhY3F1aXJlZCBieSBFYWdsZSBQcm9maWxlcg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlbGVhc2UiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVsZWFzZSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgoKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlUHJvZmlsZXJEZWxldGUodGhpcy5fb2JqZWN0QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3dhc21NZW1vcnk7CiAgICAgICAgICAgICAgICB0aGlzLl93YXNtTWVtb3J5ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU4LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVsZWFzZTsKICAgICAgfSgpCiAgICB9XSwgW3sKICAgICAga2V5OiAiY3JlYXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2NyZWF0ZSA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTkoYWNjZXNzS2V5LCBtb2RlbCkgewogICAgICAgICAgdmFyIGN1c3RvbVdyaXRlUGF0aCwgbW9kZWxQYXRoOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlOSQoX2NvbnRleHQ5KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQ5Lm5leHQgPSAzOwogICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRNb2RlbChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1vZGVsKSwge30sIHsKICAgICAgICAgICAgICAgICAgY3VzdG9tV3JpdGVQYXRoOiBjdXN0b21Xcml0ZVBhdGgKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBtb2RlbFBhdGggPSBfY29udGV4dDkuc2VudDsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KCJyZXR1cm4iLCBFYWdsZVByb2ZpbGVyLl9pbml0KGFjY2Vzc0tleSwgbW9kZWxQYXRoKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTkpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBjcmVhdGUoX3g0LCBfeDUpIHsKICAgICAgICAgIHJldHVybiBfY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjcmVhdGU7CiAgICAgIH0oKQogICAgfSwgewogICAgICBrZXk6ICJfaW5pdCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0MiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTExKGFjY2Vzc0tleSwgbW9kZWxQYXRoKSB7CiAgICAgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTExJChfY29udGV4dDExKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTEucHJldiA9IF9jb250ZXh0MTEubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmIChpc0FjY2Vzc0tleVZhbGlkKGFjY2Vzc0tleSkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMS5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQWNjZXNzS2V5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTEuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIEVhZ2xlUHJvZmlsZXIuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMCQoX2NvbnRleHQxMCkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMC5wcmV2ID0gX2NvbnRleHQxMC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDEwLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGVQcm9maWxlci5faW5pdFByb2ZpbGVyV2FzbShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgaXNTaW1kID8gX3RoaXM1Ll93YXNtU2ltZCA6IF90aGlzNS5fd2FzbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtT3V0cHV0ID0gX2NvbnRleHQxMC5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDEwLmFicnVwdCgicmV0dXJuIiwgbmV3IEVhZ2xlUHJvZmlsZXIod2FzbU91dHB1dCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTAuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMCk7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDExLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTExKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gX2luaXQoX3g2LCBfeDcpIHsKICAgICAgICAgIHJldHVybiBfaW5pdDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0OwogICAgICB9KCkKICAgIH0sIHsKICAgICAga2V5OiAiX2luaXRQcm9maWxlcldhc20iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfaW5pdFByb2ZpbGVyV2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMihhY2Nlc3NLZXksIG1vZGVsUGF0aCwgd2FzbUJhc2U2NCkgewogICAgICAgICAgdmFyIGJhc2VXYXNtT3V0cHV0LCBtZW1vcnlCdWZmZXJVaW50OCwgcHZfZWFnbGVfcHJvZmlsZXJfaW5pdCwgcHZfZWFnbGVfcHJvZmlsZXJfZGVsZXRlLCBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGwsIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMsIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydCwgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUsIHB2X2VhZ2xlX3Byb2ZpbGVyX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgc3RhdHVzLCBtc2csIG1lbW9yeUJ1ZmZlclZpZXcsIG9iamVjdEFkZHJlc3MsIG1pbkVucm9sbFNhbXBsZXNBZGRyZXNzLCBfbXNnLCBtaW5FbnJvbGxTYW1wbGVzLCBwcm9maWxlU2l6ZUFkZHJlc3MsIF9tc2cyLCBwcm9maWxlU2l6ZTsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEyJChfY29udGV4dDEyKSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTIucHJldiA9IF9jb250ZXh0MTIubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YkMShFYWdsZVByb2ZpbGVyKSwgIl9pbml0QmFzZVdhc20iLCB0aGlzKS5jYWxsKHRoaXMsIHdhc21CYXNlNjQsIDM1MDApOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGJhc2VXYXNtT3V0cHV0ID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9wcm9maWxlcl9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlcyA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZW5yb2xsX21pbl9hdWRpb19sZW5ndGhfc2FtcGxlczsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydCA9IGJhc2VXYXNtT3V0cHV0LmV4cG9ydHMucHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0OwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0X3NpemUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplOwogICAgICAgICAgICAgICAgcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2ZpbGVyX3Jlc2V0OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICBvYmplY3RBZGRyZXNzQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG9iamVjdEFkZHJlc3NBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSAxNjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQuYWxpZ25lZEFsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIChhY2Nlc3NLZXkubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgYWNjZXNzS2V5QWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKGFjY2Vzc0tleUFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDIxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWNjZXNzS2V5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBpXSA9IGFjY2Vzc0tleS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDhbYWNjZXNzS2V5QWRkcmVzcyArIGFjY2Vzc0tleS5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG1vZGVsUGF0aEVuY29kZWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUobW9kZWxQYXRoKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDI2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAobW9kZWxQYXRoRW5jb2RlZC5sZW5ndGggKyAxKSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhBZGRyZXNzID0gX2NvbnRleHQxMi5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEobW9kZWxQYXRoQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMjk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LnNldChtb2RlbFBhdGhFbmNvZGVkLCBtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W21vZGVsUGF0aEFkZHJlc3MgKyBtb2RlbFBhdGhFbmNvZGVkLmxlbmd0aF0gPSAwOwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzM7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfcHJvZmlsZXJfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDM2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShhY2Nlc3NLZXlBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gMzg7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKG1vZGVsUGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA0ODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQwID0gIidwdl9lYWdsZV9wcm9maWxlcl9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDEgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDIgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDQgPSAoMCwgX2NvbnRleHQxMi50MSkoX2NvbnRleHQxMi50MiwgX2NvbnRleHQxMi50Myk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDEyLnQwLmNvbmNhdC5jYWxsKF9jb250ZXh0MTIudDAsIF9jb250ZXh0MTIudDQpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDUyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDU0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICAgICAgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNTc7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSA1NzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDU5OwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3Byb2ZpbGVyX2Vucm9sbF9taW5fYXVkaW9fbGVuZ3RoX3NhbXBsZXMob2JqZWN0QWRkcmVzcywgbWluRW5yb2xsU2FtcGxlc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNTk6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3MDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQ1ID0gIidwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGxfbWluX2F1ZGlvX2xlbmd0aF9zYW1wbGVzJyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDYgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDcgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDY2OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDY2OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50OCA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDkgPSAoMCwgX2NvbnRleHQxMi50NikoX2NvbnRleHQxMi50NywgX2NvbnRleHQxMi50OCk7CiAgICAgICAgICAgICAgICBfbXNnID0gX2NvbnRleHQxMi50NS5jb25jYXQuY2FsbChfY29udGV4dDEyLnQ1LCBfY29udGV4dDEyLnQ5KTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiIi5jb25jYXQoX21zZywgIlxuRGV0YWlsczogIikuY29uY2F0KGJhc2VXYXNtT3V0cHV0LnB2RXJyb3IuZ2V0RXJyb3JTdHJpbmcoKSkpOwogICAgICAgICAgICAgIGNhc2UgNzA6CiAgICAgICAgICAgICAgICBtaW5FbnJvbGxTYW1wbGVzID0gbWVtb3J5QnVmZmVyVmlldy5nZXRJbnQzMihtaW5FbnJvbGxTYW1wbGVzQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3MzsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUobWluRW5yb2xsU2FtcGxlc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA3NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgIHByb2ZpbGVTaXplQWRkcmVzcyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVTaXplQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMi5uZXh0ID0gNzg7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSA3ODoKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDgwOwogICAgICAgICAgICAgICAgcmV0dXJuIHB2X2VhZ2xlX3Byb2ZpbGVyX2V4cG9ydF9zaXplKG9iamVjdEFkZHJlc3MsIHByb2ZpbGVTaXplQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MDoKICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTIuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDkxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb250ZXh0MTIudDEwID0gIidwdl9lYWdsZV9wcm9maWxlcl9leHBvcnRfc2l6ZScgZmFpbGVkIHdpdGggc3RhdHVzICI7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxMSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4OwogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTIgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MTIubmV4dCA9IDg3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgX2NvbnRleHQxMi50MTMgPSBfY29udGV4dDEyLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLnQxNCA9ICgwLCBfY29udGV4dDEyLnQxMSkoX2NvbnRleHQxMi50MTIsIF9jb250ZXh0MTIudDEzKTsKICAgICAgICAgICAgICAgIF9tc2cyID0gX2NvbnRleHQxMi50MTAuY29uY2F0LmNhbGwoX2NvbnRleHQxMi50MTAsIF9jb250ZXh0MTIudDE0KTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiIi5jb25jYXQoX21zZzIsICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgcHJvZmlsZVNpemUgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKHByb2ZpbGVTaXplQWRkcmVzcywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBfY29udGV4dDEyLm5leHQgPSA5NDsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUocHJvZmlsZVNpemVBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDk0OgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTIuYWJydXB0KCJyZXR1cm4iLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhc2VXYXNtT3V0cHV0KSwge30sIHsKICAgICAgICAgICAgICAgICAgbWluRW5yb2xsU2FtcGxlczogbWluRW5yb2xsU2FtcGxlcywKICAgICAgICAgICAgICAgICAgcHJvZmlsZVNpemU6IHByb2ZpbGVTaXplLAogICAgICAgICAgICAgICAgICBvYmplY3RBZGRyZXNzOiBvYmplY3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJEZWxldGU6IHB2X2VhZ2xlX3Byb2ZpbGVyX2RlbGV0ZSwKICAgICAgICAgICAgICAgICAgcHZFYWdsZVByb2ZpbGVyRW5yb2xsOiBwdl9lYWdsZV9wcm9maWxlcl9lbnJvbGwsCiAgICAgICAgICAgICAgICAgIHB2RWFnbGVQcm9maWxlckV4cG9ydDogcHZfZWFnbGVfcHJvZmlsZXJfZXhwb3J0LAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvZmlsZXJSZXNldDogcHZfZWFnbGVfcHJvZmlsZXJfcmVzZXQKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMi5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxMiwgdGhpcyk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIF9pbml0UHJvZmlsZXJXYXNtKF94OCwgX3g5LCBfeDEwKSB7CiAgICAgICAgICByZXR1cm4gX2luaXRQcm9maWxlcldhc20yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdFByb2ZpbGVyV2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGVQcm9maWxlcjsKICB9KEVhZ2xlQmFzZSk7CiAgLyoqDQogICAqIEphdmFTY3JpcHQvV2ViQXNzZW1ibHkgYmluZGluZyBmb3IgRWFnbGUgU3BlYWtlciBSZWNvZ25pdGlvbiBlbmdpbmUuDQogICAqIEl0IHByb2Nlc3NlcyBpbmNvbWluZyBhdWRpbyBpbiBjb25zZWN1dGl2ZSBmcmFtZXMgYW5kIGVtaXRzIGEgc2ltaWxhcml0eSBzY29yZSBmb3IgZWFjaCBlbnJvbGxlZCBzcGVha2VyLg0KICAgKi8KICBfZGVmaW5lUHJvcGVydHkkMShFYWdsZVByb2ZpbGVyLCAiX21heEVucm9sbFNhbXBsZXMiLCB2b2lkIDApOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlUHJvZmlsZXIsICJfbWluRW5yb2xsU2FtcGxlcyIsIHZvaWQgMCk7CiAgX2RlZmluZVByb3BlcnR5JDEoRWFnbGVQcm9maWxlciwgIl9wcm9maWxlU2l6ZSIsIHZvaWQgMCk7CiAgdmFyIEVhZ2xlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWFnbGVCYXNlMikgewogICAgX2luaGVyaXRzJDEoRWFnbGUsIF9FYWdsZUJhc2UyKTsKICAgIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKEVhZ2xlKTsKICAgIGZ1bmN0aW9uIEVhZ2xlKGhhbmRsZVdhc20pIHsKICAgICAgdmFyIF90aGlzNjsKICAgICAgX2NsYXNzQ2FsbENoZWNrJDEodGhpcywgRWFnbGUpOwogICAgICBfdGhpczYgPSBfc3VwZXIyLmNhbGwodGhpcywgaGFuZGxlV2FzbSk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVEZWxldGUiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9wdkVhZ2xlUHJvY2VzcyIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX3B2RWFnbGVSZXNldCIsIHZvaWQgMCk7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eSQxKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQkMShfdGhpczYpLCAiX29iamVjdEFkZHJlc3MiLCB2b2lkIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkkMShfYXNzZXJ0VGhpc0luaXRpYWxpemVkJDEoX3RoaXM2KSwgIl9zY29yZXNBZGRyZXNzIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5JDEoX2Fzc2VydFRoaXNJbml0aWFsaXplZCQxKF90aGlzNiksICJfbnVtU3BlYWtlcnMiLCB2b2lkIDApOwogICAgICBFYWdsZS5fZnJhbWVMZW5ndGggPSBoYW5kbGVXYXNtLmZyYW1lTGVuZ3RoOwogICAgICBfdGhpczYuX3B2RWFnbGVEZWxldGUgPSBoYW5kbGVXYXNtLnB2RWFnbGVEZWxldGU7CiAgICAgIF90aGlzNi5fcHZFYWdsZVByb2Nlc3MgPSBoYW5kbGVXYXNtLnB2RWFnbGVQcm9jZXNzOwogICAgICBfdGhpczYuX3B2RWFnbGVSZXNldCA9IGhhbmRsZVdhc20ucHZFYWdsZVJlc2V0OwogICAgICBfdGhpczYuX29iamVjdEFkZHJlc3MgPSBoYW5kbGVXYXNtLm9iamVjdEFkZHJlc3M7CiAgICAgIF90aGlzNi5fc2NvcmVzQWRkcmVzcyA9IGhhbmRsZVdhc20uc2NvcmVzQWRkcmVzczsKICAgICAgX3RoaXM2Ll9udW1TcGVha2VycyA9IGhhbmRsZVdhc20ubnVtU3BlYWtlcnM7CiAgICAgIHJldHVybiBfdGhpczY7CiAgICB9CiAgICAvKioNCiAgICAgKiBOdW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwZXIgZnJhbWUgZXhwZWN0ZWQgYnkgRWFnbGUgKGkuZS4gbGVuZ3RoIG9mIHRoZSBhcnJheSBwYXNzZWQgaW50byBgLnByb2Nlc3MoKWApDQogICAgICovCiAgICBfY3JlYXRlQ2xhc3MkMShFYWdsZSwgW3sKICAgICAga2V5OiAiZnJhbWVMZW5ndGgiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gRWFnbGUuX2ZyYW1lTGVuZ3RoOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGljb3ZvaWNlIEVhZ2xlIFNwZWFrZXIgUmVjb2duaXRpb24gRW5naW5lLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSBhY2Nlc3NLZXk6IEFjY2Vzc0tleSBvYnRhaW5lZCBmcm9tIFBpY292b2ljZSBDb25zb2xlIChodHRwczovL2NvbnNvbGUucGljb3ZvaWNlLmFpLykNCiAgICAgICAqIEBwYXJhbSBtb2RlbCBFYWdsZSBtb2RlbCBvcHRpb25zLg0KICAgICAgICogQHBhcmFtIG1vZGVsLmJhc2U2NCBUaGUgbW9kZWwgaW4gYmFzZTY0IHN0cmluZyB0byBpbml0aWFsaXplIEVhZ2xlLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnB1YmxpY1BhdGggVGhlIG1vZGVsIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1YmxpYyBkaXJlY3RvcnkuDQogICAgICAgKiBAcGFyYW0gbW9kZWwuY3VzdG9tV3JpdGVQYXRoIEN1c3RvbSBwYXRoIHRvIHNhdmUgdGhlIG1vZGVsIGluIHN0b3JhZ2UuDQogICAgICAgKiBTZXQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byB1c2UgbXVsdGlwbGUgbW9kZWxzIGFjcm9zcyBgZWFnbGVgIGluc3RhbmNlcy4NCiAgICAgICAqIEBwYXJhbSBtb2RlbC5mb3JjZVdyaXRlIEZsYWcgdG8gb3ZlcndyaXRlIHRoZSBtb2RlbCBpbiBzdG9yYWdlIGV2ZW4gaWYgaXQgZXhpc3RzLg0KICAgICAgICogQHBhcmFtIG1vZGVsLnZlcnNpb24gVmVyc2lvbiBvZiB0aGUgbW9kZWwgZmlsZS4gSW5jcmVtZW50IHRvIHVwZGF0ZSB0aGUgbW9kZWwgZmlsZSBpbiBzdG9yYWdlLg0KICAgICAgICogQHBhcmFtIHNwZWFrZXJQcm9maWxlcyBPbmUgb3IgbW9yZSBFYWdsZSBzcGVha2VyIHByb2ZpbGVzLiBUaGVzZSBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgYEVhZ2xlUHJvZmlsZXJgLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIEVhZ2xlIGVuZ2luZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJwcm9jZXNzIiwKICAgICAgdmFsdWU6CiAgICAgIC8qKg0KICAgICAgICogUHJvY2Vzc2VzIGEgZnJhbWUgb2YgYXVkaW8gYW5kIHJldHVybnMgYSBsaXN0IG9mIHNpbWlsYXJpdHkgc2NvcmVzIGZvciBlYWNoIHNwZWFrZXIgcHJvZmlsZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0gcGNtIEEgZnJhbWUgb2YgYXVkaW8gc2FtcGxlcy4gVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZSBjYW4gYmUgYXR0YWluZWQgYnkgY2FsbGluZw0KICAgICAgICogYC5mcmFtZUxlbmd0aGAuIFRoZSBpbmNvbWluZyBhdWRpbyBuZWVkcyB0byBoYXZlIGEgc2FtcGxlIHJhdGUgZXF1YWwgdG8gYC5zYW1wbGVSYXRlYCBhbmQgYmUgMTYtYml0DQogICAgICAgKiBsaW5lYXJseS1lbmNvZGVkLiBFYWdsZSBvcGVyYXRlcyBvbiBzaW5nbGUtY2hhbm5lbCBhdWRpby4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBzaW1pbGFyaXR5IHNjb3JlcyBmb3IgZWFjaCBzcGVha2VyIHByb2ZpbGUuIEEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyB0aGF0IHRoZSB2b2ljZQ0KICAgICAgICogYmVsb25ncyB0byB0aGUgY29ycmVzcG9uZGluZyBzcGVha2VyLiBUaGUgcmFuZ2UgaXMgWzAsIDFdIHdpdGggMS4wIHJlcHJlc2VudGluZyBhIHBlcmZlY3QgbWF0Y2guDQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcHJvY2VzcyA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE0KHBjbSkgewogICAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNCQoX2NvbnRleHQxNCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE0LnByZXYgPSBfY29udGV4dDE0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAocGNtIGluc3RhbmNlb2YgSW50MTZBcnJheSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGFyZ3VtZW50ICdwY20nIG11c3QgYmUgcHJvdmlkZWQgYXMgYW4gSW50MTZBcnJheSIpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKHBjbS5sZW5ndGggIT09IEVhZ2xlLl9mcmFtZUxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxlbmd0aCBvZiBpbnB1dCBmcmFtZSAoIi5jb25jYXQocGNtLmxlbmd0aCwgIikgZG9lcyBub3QgbWF0Y2ggcmVxdWlyZWQgZnJhbWUgbGVuZ3RoICgiKS5jb25jYXQoRWFnbGUuX2ZyYW1lTGVuZ3RoLCAiKSIpKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgX3RoaXM3Ll9mdW5jdGlvbk11dGV4LnJ1bkV4Y2x1c2l2ZSggLyojX19QVVJFX18qL19hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEzKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwY21BZGRyZXNzLCBtZW1vcnlCdWZmZXJJbnQxNiwgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50OCwgbWVtb3J5QnVmZmVyVmlldywgc2NvcmVzLCBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEzJChfY29udGV4dDEzKSB7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEzLnByZXYgPSBfY29udGV4dDEzLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzNy5fd2FzbU1lbW9yeSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjYWxsIGAucHJvY2Vzc2AgYWZ0ZXIgcmVsZWFzZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9hbGlnbmVkQWxsb2MoSW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgcGNtLmxlbmd0aCAqIEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtQWRkcmVzcyA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQxNiA9IG5ldyBJbnQxNkFycmF5KF90aGlzNy5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDE2LnNldChwY20sIHBjbUFkZHJlc3MgLyBJbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczcuX3B2RWFnbGVQcm9jZXNzKF90aGlzNy5fb2JqZWN0QWRkcmVzcywgcGNtQWRkcmVzcywgX3RoaXM3Ll9zY29yZXNBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9jb250ZXh0MTMuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM3Ll9wdkZyZWUocGNtQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICE9PSBQVl9TVEFUVVNfU1VDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDI0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoX3RoaXM3Ll93YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MCA9IEVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDEgPSAicHJvY2VzcyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQyID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50MyA9IG1lbW9yeUJ1ZmZlclVpbnQ4OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDIwOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczcuX3B2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDEzLnQ0ID0gX2NvbnRleHQxMy5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTMudDUgPSAoMCwgX2NvbnRleHQxMy50MikoX2NvbnRleHQxMy50MywgX2NvbnRleHQxMy50NCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxMy50NiA9IF9jb250ZXh0MTMudDEuY29uY2F0LmNhbGwoX2NvbnRleHQxMy50MSwgX2NvbnRleHQxMy50NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IF9jb250ZXh0MTMudDAoX2NvbnRleHQxMy50Nik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhfdGhpczcuX3dhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3RoaXM3Ll9udW1TcGVha2VyczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZXMucHVzaChtZW1vcnlCdWZmZXJWaWV3LmdldEZsb2F0MzIoX3RoaXM3Ll9zY29yZXNBZGRyZXNzICsgaSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMy5hYnJ1cHQoInJldHVybiIsIHNjb3Jlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTMuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUxMyk7CiAgICAgICAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE0KTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhfeDExKSB7CiAgICAgICAgICByZXR1cm4gX3Byb2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByb2Nlc3M7CiAgICAgIH0oKQogICAgICAvKioNCiAgICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGVuZ2luZS4NCiAgICAgICAqIEl0IGlzIGJlc3QgdG8gY2FsbCBiZWZvcmUgcHJvY2Vzc2luZyBhIG5ldyBzZXF1ZW5jZSBvZiBhdWRpbyAoZS5nLiBhIG5ldyB2b2ljZSBpbnRlcmFjdGlvbikuDQogICAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYWNjdXJhY3kgb2YgdGhlIGVuZ2luZSBpcyBub3QgYWZmZWN0ZWQgYnkgYSBjaGFuZ2UgaW4gYXVkaW8gY29udGV4dC4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZXNldCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZXNldDIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNigpIHsKICAgICAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTYkKF9jb250ZXh0MTYpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNi5wcmV2ID0gX2NvbnRleHQxNi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuYWJydXB0KCJyZXR1cm4iLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgIF90aGlzOC5fZnVuY3Rpb25NdXRleC5ydW5FeGNsdXNpdmUoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzLCBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNSQoX2NvbnRleHQxNSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNS5wcmV2ID0gX2NvbnRleHQxNS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpczguX3dhc21NZW1vcnkgPT09IHVuZGVmaW5lZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgLnJlc2V0YCBhZnRlciByZWxlYXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczguX3B2RWFnbGVSZXNldChfdGhpczguX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX2NvbnRleHQxNS5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN0YXR1cyAhPT0gUFZfU1RBVFVTX1NVQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAxNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KF90aGlzOC5fd2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDAgPSBFcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQxID0gInJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQzID0gbWVtb3J5QnVmZmVyVWludDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5fcHZTdGF0dXNUb1N0cmluZyhzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0MTUudDQgPSBfY29udGV4dDE1LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxNS50NSA9ICgwLCBfY29udGV4dDE1LnQyKShfY29udGV4dDE1LnQzLCBfY29udGV4dDE1LnQ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE1LnQ2ID0gX2NvbnRleHQxNS50MS5jb25jYXQuY2FsbChfY29udGV4dDE1LnQxLCBfY29udGV4dDE1LnQ1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX2NvbnRleHQxNS50MChfY29udGV4dDE1LnQ2KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE1KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTYuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMTYpOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICAgIHJldHVybiBfcmVzZXQyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNldDsKICAgICAgfSgpCiAgICAgIC8qKg0KICAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IEVhZ2xlDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVsZWFzZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWxlYXNlMiA9IF9hc3luY1RvR2VuZXJhdG9yJDEoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvciQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KCkgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNy5wcmV2ID0gX2NvbnRleHQxNy5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkZyZWUodGhpcy5fc2NvcmVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdkVhZ2xlRGVsZXRlKHRoaXMuX29iamVjdEFkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93YXNtTWVtb3J5OwogICAgICAgICAgICAgICAgdGhpcy5fd2FzbU1lbW9yeSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTE3LCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gcmVsZWFzZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVsZWFzZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlbGVhc2U7CiAgICAgIH0oKQogICAgfV0sIFt7CiAgICAgIGtleTogImNyZWF0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9jcmVhdGUyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTgoYWNjZXNzS2V5LCBtb2RlbCwgc3BlYWtlclByb2ZpbGVzKSB7CiAgICAgICAgICB2YXIgY3VzdG9tV3JpdGVQYXRoLCBtb2RlbFBhdGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjdXN0b21Xcml0ZVBhdGggPSBtb2RlbC5jdXN0b21Xcml0ZVBhdGggPyBtb2RlbC5jdXN0b21Xcml0ZVBhdGggOiAnZWFnbGVfbW9kZWwnOwogICAgICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMzsKICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kZWwoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb2RlbCksIHt9LCB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbVdyaXRlUGF0aDogY3VzdG9tV3JpdGVQYXRoCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgbW9kZWxQYXRoID0gX2NvbnRleHQxOC5zZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguYWJydXB0KCJyZXR1cm4iLCBFYWdsZS5faW5pdChhY2Nlc3NLZXksIG1vZGVsUGF0aCwgIUFycmF5LmlzQXJyYXkoc3BlYWtlclByb2ZpbGVzKSA/IFtzcGVha2VyUHJvZmlsZXNdIDogc3BlYWtlclByb2ZpbGVzKSk7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUxOCk7CiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZShfeDEyLCBfeDEzLCBfeDE0KSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyZWF0ZTsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX2luaXQzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMjAoYWNjZXNzS2V5LCBtb2RlbFBhdGgsIHNwZWFrZXJQcm9maWxlcykgewogICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMCQoX2NvbnRleHQyMCkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIwLnByZXYgPSBfY29udGV4dDIwLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAoaXNBY2Nlc3NLZXlWYWxpZChhY2Nlc3NLZXkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFjY2Vzc0tleScpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGlmICghKCFzcGVha2VyUHJvZmlsZXMgfHwgc3BlYWtlclByb2ZpbGVzLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNwZWFrZXIgcHJvZmlsZXMgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMC5hYnJ1cHQoInJldHVybiIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgRWFnbGUuX2VhZ2xlTXV0ZXgucnVuRXhjbHVzaXZlKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2ltZCwgd2FzbU91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkgewogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOS5wcmV2ID0gX2NvbnRleHQxOS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDE5Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpbWQgPSBfY29udGV4dDE5LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQxOS5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWFnbGUuX2luaXRXYXNtKGFjY2Vzc0tleSwgbW9kZWxQYXRoLCBzcGVha2VyUHJvZmlsZXMsIGlzU2ltZCA/IF90aGlzOS5fd2FzbVNpbWQgOiBfdGhpczkuX3dhc20pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU91dHB1dCA9IF9jb250ZXh0MTkuc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5hYnJ1cHQoInJldHVybiIsIG5ldyBFYWdsZSh3YXNtT3V0cHV0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTE5KTsKICAgICAgICAgICAgICAgICAgfSkpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgIH0pWyJjYXRjaCJdKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjAuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlMjApOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdChfeDE1LCBfeDE2LCBfeDE3KSB7CiAgICAgICAgICByZXR1cm4gX2luaXQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfaW5pdDsKICAgICAgfSgpCiAgICB9LCB7CiAgICAgIGtleTogIl9pbml0V2FzbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9pbml0V2FzbTIgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMShhY2Nlc3NLZXksIG1vZGVsUGF0aCwgc3BlYWtlclByb2ZpbGVzLCB3YXNtQmFzZTY0KSB7CiAgICAgICAgICB2YXIgYmFzZVdhc21PdXRwdXQsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMiwgcHZfZWFnbGVfaW5pdCwgcHZfZWFnbGVfZGVsZXRlLCBwdl9lYWdsZV9wcm9jZXNzLCBwdl9lYWdsZV9mcmFtZV9sZW5ndGgsIHB2X2VhZ2xlX3Jlc2V0LCBvYmplY3RBZGRyZXNzQWRkcmVzcywgYWNjZXNzS2V5QWRkcmVzcywgaSwgbW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcywgbnVtU3BlYWtlcnMsIHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MsIHByb2ZpbGVzQWRkcmVzc0xpc3QsIF9pdGVyYXRvciwgX3N0ZXAsIHByb2ZpbGUsIHByb2ZpbGVBZGRyZXNzLCBzdGF0dXMsIG1zZywgbWVtb3J5QnVmZmVyVmlldywgb2JqZWN0QWRkcmVzcywgc2NvcmVzQWRkcmVzcywgZnJhbWVMZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMSQoX2NvbnRleHQyMSkgewogICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIxLnByZXYgPSBfY29udGV4dDIxLm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mJDEoRWFnbGUpLCAiX2luaXRCYXNlV2FzbSIsIHRoaXMpLmNhbGwodGhpcywgd2FzbUJhc2U2NCwgMzE1MCk7CiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgYmFzZVdhc21PdXRwdXQgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KGJhc2VXYXNtT3V0cHV0Lm1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX2luaXQgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2luaXQ7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9kZWxldGUgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2RlbGV0ZTsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Byb2Nlc3MgPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX3Byb2Nlc3M7CiAgICAgICAgICAgICAgICBwdl9lYWdsZV9mcmFtZV9sZW5ndGggPSBiYXNlV2FzbU91dHB1dC5leHBvcnRzLnB2X2VhZ2xlX2ZyYW1lX2xlbmd0aDsKICAgICAgICAgICAgICAgIHB2X2VhZ2xlX3Jlc2V0ID0gYmFzZVdhc21PdXRwdXQuZXhwb3J0cy5wdl9lYWdsZV9yZXNldDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzc0FkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3RBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAoYWNjZXNzS2V5Lmxlbmd0aCArIDEpICogVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgIGFjY2Vzc0tleUFkZHJlc3MgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIShhY2Nlc3NLZXlBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjY2Vzc0tleS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFthY2Nlc3NLZXlBZGRyZXNzICsgaV0gPSBhY2Nlc3NLZXkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4W2FjY2Vzc0tleUFkZHJlc3MgKyBhY2Nlc3NLZXkubGVuZ3RoXSA9IDA7CiAgICAgICAgICAgICAgICBtb2RlbFBhdGhFbmNvZGVkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1vZGVsUGF0aCk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyNTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5hbGlnbmVkQWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgKG1vZGVsUGF0aEVuY29kZWQubGVuZ3RoICsgMSkgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgbW9kZWxQYXRoQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKG1vZGVsUGF0aEFkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDI4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQobW9kZWxQYXRoRW5jb2RlZCwgbW9kZWxQYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OFttb2RlbFBhdGhBZGRyZXNzICsgbW9kZWxQYXRoRW5jb2RlZC5sZW5ndGhdID0gMDsKICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzID0gc3BlYWtlclByb2ZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDMzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBudW1TcGVha2VycyAqIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICBwcm9maWxlc0FkZHJlc3NBZGRyZXNzID0gX2NvbnRleHQyMS5zZW50OwogICAgICAgICAgICAgICAgaWYgKCEocHJvZmlsZXNBZGRyZXNzQWRkcmVzcyA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMzY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxsb2MgZmFpbGVkOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Jyk7CiAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHNwZWFrZXJQcm9maWxlcyk7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnByZXYgPSAzODsKICAgICAgICAgICAgICAgIF9pdGVyYXRvci5zKCk7CiAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgIGlmICgoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDUxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQ0OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBwcm9maWxlLmJ5dGVzLmxlbmd0aCAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICBwcm9maWxlQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHByb2ZpbGVBZGRyZXNzID09PSAwKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA0NzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGxvYyBmYWlsZWQ6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKTsKICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KHByb2ZpbGUuYnl0ZXMsIHByb2ZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHByb2ZpbGVzQWRkcmVzc0xpc3QucHVzaChwcm9maWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDQwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDU2OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDUzOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50MCA9IF9jb250ZXh0MjFbImNhdGNoIl0oMzgpOwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQyMS50MCk7CiAgICAgICAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEucHJldiA9IDU2OwogICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLmZpbmlzaCg1Nik7CiAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChuZXcgSW50MzJBcnJheShwcm9maWxlc0FkZHJlc3NMaXN0KSwgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjI7CiAgICAgICAgICAgICAgICByZXR1cm4gcHZfZWFnbGVfaW5pdChhY2Nlc3NLZXlBZGRyZXNzLCBtb2RlbFBhdGhBZGRyZXNzLCBudW1TcGVha2VycywgcHJvZmlsZXNBZGRyZXNzQWRkcmVzcywgb2JqZWN0QWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA2NTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlV2FzbU91dHB1dC5wdkZyZWUoYWNjZXNzS2V5QWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShtb2RlbFBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gNjk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVdhc21PdXRwdXQucHZGcmVlKHByb2ZpbGVzQWRkcmVzc0FkZHJlc3MpOwogICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT09IFBWX1NUQVRVU19TVUNDRVNTKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA3OTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLnQxID0gIidwdl9lYWdsZV9pbml0JyBmYWlsZWQgd2l0aCBzdGF0dXMgIjsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDIgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDMgPSBtZW1vcnlCdWZmZXJVaW50ODsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDc1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2U3RhdHVzVG9TdHJpbmcoc3RhdHVzKTsKICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgX2NvbnRleHQyMS50NCA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEudDUgPSAoMCwgX2NvbnRleHQyMS50MikoX2NvbnRleHQyMS50MywgX2NvbnRleHQyMS50NCk7CiAgICAgICAgICAgICAgICBtc2cgPSBfY29udGV4dDIxLnQxLmNvbmNhdC5jYWxsKF9jb250ZXh0MjEudDEsIF9jb250ZXh0MjEudDUpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChtc2csICJcbkRldGFpbHM6ICIpLmNvbmNhdChiYXNlV2FzbU91dHB1dC5wdkVycm9yLmdldEVycm9yU3RyaW5nKCkpKTsKICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVmlldyA9IG5ldyBEYXRhVmlldyhiYXNlV2FzbU91dHB1dC5tZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgIG9iamVjdEFkZHJlc3MgPSBtZW1vcnlCdWZmZXJWaWV3LmdldEludDMyKG9iamVjdEFkZHJlc3NBZGRyZXNzLCB0cnVlKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDgzOwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LnB2RnJlZShvYmplY3RBZGRyZXNzQWRkcmVzcyk7CiAgICAgICAgICAgICAgY2FzZSA4MzoKICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg1OwogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VXYXNtT3V0cHV0LmFsaWduZWRBbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG51bVNwZWFrZXJzICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzcyA9IF9jb250ZXh0MjEuc2VudDsKICAgICAgICAgICAgICAgIGlmICghKHNjb3Jlc0FkZHJlc3MgPT09IDApKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDg4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWFsbG9jIGZhaWxlZDogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpOwogICAgICAgICAgICAgIGNhc2UgODg6CiAgICAgICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA5MDsKICAgICAgICAgICAgICAgIHJldHVybiBwdl9lYWdsZV9mcmFtZV9sZW5ndGgoKTsKICAgICAgICAgICAgICBjYXNlIDkwOgogICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggPSBfY29udGV4dDIxLnNlbnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMS5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmFzZVdhc21PdXRwdXQpLCB7fSwgewogICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIG51bVNwZWFrZXJzOiBudW1TcGVha2VycywKICAgICAgICAgICAgICAgICAgb2JqZWN0QWRkcmVzczogb2JqZWN0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgc2NvcmVzQWRkcmVzczogc2NvcmVzQWRkcmVzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZURlbGV0ZTogcHZfZWFnbGVfZGVsZXRlLAogICAgICAgICAgICAgICAgICBwdkVhZ2xlUHJvY2VzczogcHZfZWFnbGVfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgcHZFYWdsZVJlc2V0OiBwdl9lYWdsZV9yZXNldAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTIxLCB0aGlzLCBbWzM4LCA1MywgNTYsIDU5XV0pOwogICAgICAgIH0pKTsKICAgICAgICBmdW5jdGlvbiBfaW5pdFdhc20oX3gxOCwgX3gxOSwgX3gyMCwgX3gyMSkgewogICAgICAgICAgcmV0dXJuIF9pbml0V2FzbTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbml0V2FzbTsKICAgICAgfSgpCiAgICB9XSk7CiAgICByZXR1cm4gRWFnbGU7CiAgfShFYWdsZUJhc2UpOwogIF9kZWZpbmVQcm9wZXJ0eSQxKEVhZ2xlLCAiX2ZyYW1lTGVuZ3RoIiwgdm9pZCAwKTsKCiAgdmFyIGVhZ2xlID0gbnVsbDsKICB2YXIgaW5pdFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVxdWVzdCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEoZWFnbGUgIT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VhZ2xlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjsKICAgICAgICAgICAgRWFnbGUuc2V0V2FzbShyZXF1ZXN0Lndhc20pOwogICAgICAgICAgICBFYWdsZS5zZXRXYXNtU2ltZChyZXF1ZXN0Lndhc21TaW1kKTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7CiAgICAgICAgICAgIHJldHVybiBFYWdsZS5faW5pdChyZXF1ZXN0LmFjY2Vzc0tleSwgcmVxdWVzdC5tb2RlbFBhdGgsIHJlcXVlc3Quc3BlYWtlclByb2ZpbGVzKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgZWFnbGUgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJywKICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZWFnbGUuZnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogZWFnbGUuc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICB2ZXJzaW9uOiBlYWdsZS52ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDExOwogICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0WyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dC50MC5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzIsIDExXV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGluaXRSZXF1ZXN0KF94KSB7CiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgcHJvY2Vzc1JlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXF1ZXN0KSB7CiAgICAgIHZhciBzY29yZXM7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEoZWFnbGUgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiAnRWFnbGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJwogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyOwogICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDU7CiAgICAgICAgICAgIHJldHVybiBlYWdsZS5wcm9jZXNzKHJlcXVlc3QuaW5wdXRGcmFtZSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHNjb3JlcyA9IF9jb250ZXh0Mi5zZW50OwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICAgICAgc2NvcmVzOiBzY29yZXMKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyWyJjYXRjaCJdKDIpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQyLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1syLCA5XV0pOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHByb2Nlc3NSZXF1ZXN0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciByZXNldFJlcXVlc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IkMSggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHsKICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShlYWdsZSA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICdFYWdsZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIGVhZ2xlLnJlc2V0KCk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSA4OwogICAgICAgICAgICBfY29udGV4dDMudDAgPSBfY29udGV4dDNbImNhdGNoIl0oMik7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCB7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dDMudDAubWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzLCBudWxsLCBbWzIsIDhdXSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVzZXRSZXF1ZXN0KCkgewogICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciByZWxlYXNlUmVxdWVzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkgewogICAgICByZXR1cm4gcmVnZW5lcmF0b3IkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKGVhZ2xlICE9PSBudWxsKSkgewogICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiBlYWdsZS5yZWxlYXNlKCk7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGVhZ2xlID0gbnVsbDsKICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlNCk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVsZWFzZVJlcXVlc3QoKSB7CiAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgLyoqDQogICAqIEVhZ2xlIHdvcmtlciBoYW5kbGVyLg0KICAgKi8KICBzZWxmLm9ubWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvciQxKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3IkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KGV2ZW50KSB7CiAgICAgIHJldHVybiByZWdlbmVyYXRvciQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTUkKF9jb250ZXh0NSkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2NvbnRleHQ1LnQwID0gZXZlbnQuZGF0YS5jb21tYW5kOwogICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IF9jb250ZXh0NS50MCA9PT0gJ2luaXQnID8gMyA6IF9jb250ZXh0NS50MCA9PT0gJ3Byb2Nlc3MnID8gOSA6IF9jb250ZXh0NS50MCA9PT0gJ3Jlc2V0JyA/IDE1IDogX2NvbnRleHQ1LnQwID09PSAncmVsZWFzZScgPyAyMSA6IDI3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgX2NvbnRleHQ1LnQxID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA2OwogICAgICAgICAgICByZXR1cm4gaW5pdFJlcXVlc3QoZXZlbnQuZGF0YSk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIF9jb250ZXh0NS50MiA9IF9jb250ZXh0NS5zZW50OwogICAgICAgICAgICBfY29udGV4dDUudDEucG9zdE1lc3NhZ2UuY2FsbChfY29udGV4dDUudDEsIF9jb250ZXh0NS50Mik7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuYWJydXB0KCJicmVhayIsIDI4KTsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgX2NvbnRleHQ1LnQzID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMjsKICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KGV2ZW50LmRhdGEpOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgX2NvbnRleHQ1LnQ0ID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0NS50My5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0NS50MywgX2NvbnRleHQ1LnQ0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoImJyZWFrIiwgMjgpOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgX2NvbnRleHQ1LnQ1ID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxODsKICAgICAgICAgICAgcmV0dXJuIHJlc2V0UmVxdWVzdCgpOwogICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgX2NvbnRleHQ1LnQ2ID0gX2NvbnRleHQ1LnNlbnQ7CiAgICAgICAgICAgIF9jb250ZXh0NS50NS5wb3N0TWVzc2FnZS5jYWxsKF9jb250ZXh0NS50NSwgX2NvbnRleHQ1LnQ2KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoImJyZWFrIiwgMjgpOwogICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgX2NvbnRleHQ1LnQ3ID0gc2VsZjsKICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAyNDsKICAgICAgICAgICAgcmV0dXJuIHJlbGVhc2VSZXF1ZXN0KCk7CiAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICBfY29udGV4dDUudDggPSBfY29udGV4dDUuc2VudDsKICAgICAgICAgICAgX2NvbnRleHQ1LnQ3LnBvc3RNZXNzYWdlLmNhbGwoX2NvbnRleHQ1LnQ3LCBfY29udGV4dDUudDgpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdCgiYnJlYWsiLCAyOCk7CiAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZmFpbGVkJywKICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgICAgbWVzc2FnZTogIlVucmVjb2duaXplZCBjb21tYW5kOiAiLmNvbmNhdChldmVudC5kYXRhLmNvbW1hbmQpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAyODoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTUpOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHsKICAgICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKCn0pKCk7Cgo=', null, false);
|
|
4487
4489
|
/* eslint-enable */
|
|
4488
4490
|
|
|
4489
4491
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|