appium-ios-device 2.0.0 → 2.3.0

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/README.md CHANGED
@@ -3,10 +3,8 @@ appium-ios-device
3
3
 
4
4
  [![NPM version](http://img.shields.io/npm/v/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
5
5
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
6
- [![Dependency Status](https://david-dm.org/appium/appium-ios-device/master.svg)](https://david-dm.org/appium/appium-ios-device/master)
7
- [![devDependency Status](https://david-dm.org/appium/appium-ios-device/master/dev-status.svg)](https://david-dm.org/appium/appium-ios-device/master#info=devDependencies)
8
6
 
9
- [![Build Status](https://api.travis-ci.org/appium/appium-ios-device.png?branch=master)](https://travis-ci.org/appium/appium-ios-device)
7
+ [![Release](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml/badge.svg)](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml)
10
8
 
11
9
  Appium API for dealing with iOS devices. This is mainly a rewrite of libimobiledevice in nodejs. The APIs allow Appium to talk directly to the phone over usbmuxd
12
10
 
@@ -22,6 +20,7 @@ More information can be found at the links below:
22
20
  - `utilities.getOSVersion`
23
21
  - `utilities.getDeviceTime`
24
22
  - `utilities.getDeviceName`
23
+ - `utilities.getDeviceInfo`
25
24
  - `utilities.startLockdownSession`
26
25
  - `utilities.connectPort`
27
26
  - `utilities.connectPortSSL`
@@ -32,6 +31,8 @@ More information can be found at the links below:
32
31
  - `services.startAfcService`
33
32
  - `services.startNotificationProxyService`
34
33
  - `services.startHouseArrestService`
34
+ - `services.startInstrumentService`
35
+ - `services.startMCInstallService`
35
36
 
36
37
  ### Usage
37
38
 
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.FLAG_TYPES = exports.DTX_MESSAGE_PAYLOAD_HEADER_LENGTH = exports.DTX_MESSAGE_HEADER_MAGIC_LEN = exports.DTX_MESSAGE_HEADER_MAGIC = exports.DTX_MESSAGE_HEADER_LENGTH = exports.DTXMessagePayloadHeader = exports.DTXMessageHeader = exports.DTXMessageAuxBuffer = exports.DTXMessageAux = exports.DTXMessage = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _nskeyed = require("./transformer/nskeyed");
13
+
14
+ var _bplistParser = _interopRequireDefault(require("bplist-parser"));
15
+
16
+ var _lodash = _interopRequireDefault(require("lodash"));
17
+
18
+ const DTX_MESSAGE_PAYLOAD_HEADER_LENGTH = 16;
19
+ exports.DTX_MESSAGE_PAYLOAD_HEADER_LENGTH = DTX_MESSAGE_PAYLOAD_HEADER_LENGTH;
20
+ const DTX_MESSAGE_HEADER_LENGTH = 32;
21
+ exports.DTX_MESSAGE_HEADER_LENGTH = DTX_MESSAGE_HEADER_LENGTH;
22
+ const DTX_MESSAGE_HEADER_MAGIC = 0x1F3D5B79;
23
+ exports.DTX_MESSAGE_HEADER_MAGIC = DTX_MESSAGE_HEADER_MAGIC;
24
+ const DTX_MESSAGE_HEADER_MAGIC_LEN = 4;
25
+ exports.DTX_MESSAGE_HEADER_MAGIC_LEN = DTX_MESSAGE_HEADER_MAGIC_LEN;
26
+ const DTX_MESSAGE_AUX_HEADER = 0x01F0;
27
+ const DTX_AUXILIARY_MAGIC = 0xa;
28
+ const FLAG_TYPES = Object.freeze({
29
+ recv: 1,
30
+ send: 2,
31
+ reply: 3
32
+ });
33
+ exports.FLAG_TYPES = FLAG_TYPES;
34
+ const AUX_TYPES = Object.freeze({
35
+ NSKeyed: 2,
36
+ UInt32LE: 3,
37
+ BigUInt64LE: 4,
38
+ BigInt64LE: 6
39
+ });
40
+
41
+ class DTXMessageHeader {
42
+ static build(data) {
43
+ const messageHeader = Buffer.alloc(DTX_MESSAGE_HEADER_LENGTH);
44
+ messageHeader.writeUInt32LE(DTX_MESSAGE_HEADER_MAGIC, 0);
45
+ messageHeader.writeUInt32LE(DTX_MESSAGE_HEADER_LENGTH, 4);
46
+ messageHeader.writeUInt16LE(0, 8);
47
+ messageHeader.writeUInt16LE(1, 10);
48
+ messageHeader.writeUInt32LE(data.payloadLength, 12);
49
+ messageHeader.writeUInt32LE(data.identifier, 16);
50
+ messageHeader.writeUInt32LE(data.conversationIndex, 20);
51
+ messageHeader.writeUInt32LE(data.channelCode, 24);
52
+ messageHeader.writeUInt32LE(data.expectsReply, 28);
53
+ return messageHeader;
54
+ }
55
+
56
+ static parse(headerBuffer) {
57
+ return {
58
+ magic: headerBuffer.readUInt32LE(0),
59
+ headerLength: headerBuffer.readUInt32LE(4),
60
+ fragmentId: headerBuffer.readUInt16LE(8),
61
+ fragmentCount: headerBuffer.readUInt16LE(10),
62
+ payloadLength: headerBuffer.readUInt32LE(12),
63
+ identifier: headerBuffer.readUInt32LE(16),
64
+ conversationIndex: headerBuffer.readUInt32LE(20),
65
+ channel: headerBuffer.readUInt32LE(24),
66
+ expectsReply: headerBuffer.readUInt32LE(28)
67
+ };
68
+ }
69
+
70
+ }
71
+
72
+ exports.DTXMessageHeader = DTXMessageHeader;
73
+
74
+ class DTXMessagePayloadHeader {
75
+ static build(data) {
76
+ const messageHeader = Buffer.alloc(DTX_MESSAGE_PAYLOAD_HEADER_LENGTH);
77
+ messageHeader.writeUInt32LE(data.flags, 0);
78
+ messageHeader.writeUInt32LE(data.auxLength, 4);
79
+ messageHeader.writeBigUInt64LE(data.totalLength, 8);
80
+ return messageHeader;
81
+ }
82
+
83
+ static parse(headerBuffer) {
84
+ return {
85
+ flags: headerBuffer.readUInt32LE(0),
86
+ auxLength: headerBuffer.readUInt32LE(4),
87
+ totalLength: headerBuffer.readBigInt64LE(8)
88
+ };
89
+ }
90
+
91
+ }
92
+
93
+ exports.DTXMessagePayloadHeader = DTXMessagePayloadHeader;
94
+
95
+ class DTXMessageAux {
96
+ constructor(data = []) {
97
+ this.data = data;
98
+ }
99
+
100
+ build() {
101
+ const messageAux = new DTXMessageAuxBuffer();
102
+ let buf = Buffer.alloc(0);
103
+
104
+ if (this.data.length === 0) {
105
+ return buf;
106
+ }
107
+
108
+ for (const arg of this.data) {
109
+ if (arg instanceof DTXMessageAuxBuffer) {
110
+ buf = Buffer.concat([buf, arg.getBytes()]);
111
+ } else if (_lodash.default.isNumber(arg)) {
112
+ messageAux.appendInt(arg);
113
+ } else if (typeof arg == 'bigint') {
114
+ messageAux.appendLong(arg);
115
+ } else {
116
+ messageAux.appendObject(arg);
117
+ }
118
+ }
119
+
120
+ return Buffer.concat([buf, messageAux.getBytes()]);
121
+ }
122
+
123
+ static parse(headerBuffer) {
124
+ let cursor = 0;
125
+ const data = [];
126
+ const length = headerBuffer.readBigInt64LE(8);
127
+ cursor += 16;
128
+
129
+ while (cursor <= length) {
130
+ const m = headerBuffer.readUInt32LE(cursor);
131
+
132
+ if (m !== DTX_AUXILIARY_MAGIC) {
133
+ throw new Error(`incorrect auxiliary magic: ${m}`);
134
+ }
135
+
136
+ const type = headerBuffer.readUInt32LE(cursor + 4);
137
+ cursor += 8;
138
+
139
+ switch (type) {
140
+ case AUX_TYPES.NSKeyed:
141
+ {
142
+ const strLen = headerBuffer.readUInt32LE(cursor);
143
+ cursor += 4;
144
+ const archived_data = headerBuffer.slice(cursor, cursor + strLen);
145
+ data.push((0, _nskeyed.unarchive)(archived_data));
146
+ cursor += strLen;
147
+ break;
148
+ }
149
+
150
+ case AUX_TYPES.UInt32LE:
151
+ data.push(headerBuffer.readUInt32LE(cursor));
152
+ cursor += 4;
153
+ break;
154
+
155
+ case AUX_TYPES.BigUInt64LE:
156
+ data.push(headerBuffer.readBigUInt64LE(cursor));
157
+ cursor += 8;
158
+ break;
159
+
160
+ case AUX_TYPES.BigInt64LE:
161
+ data.push(headerBuffer.readBigInt64LE(cursor));
162
+ cursor += 8;
163
+ break;
164
+
165
+ default:
166
+ throw new Error(`Unknown type ${type}`);
167
+ }
168
+ }
169
+
170
+ return data;
171
+ }
172
+
173
+ }
174
+
175
+ exports.DTXMessageAux = DTXMessageAux;
176
+
177
+ class InstrumentRPCParseError {
178
+ constructor(data) {
179
+ this.data = data;
180
+ }
181
+
182
+ }
183
+
184
+ class DTXMessageAuxBuffer {
185
+ constructor() {
186
+ this._buf = Buffer.alloc(0);
187
+ }
188
+
189
+ appendInt(value) {
190
+ const buf = Buffer.alloc(12);
191
+ buf.writeUInt32LE(DTX_AUXILIARY_MAGIC, 0);
192
+ buf.writeUInt32LE(3, 4);
193
+ buf.writeUInt32LE(value, 8);
194
+ this._buf = Buffer.concat([this._buf, buf]);
195
+ }
196
+
197
+ appendLong(value) {
198
+ const buf = Buffer.alloc(16);
199
+ buf.writeUInt32LE(DTX_AUXILIARY_MAGIC, 0);
200
+ buf.writeUInt32LE(4, 4);
201
+ buf.writeBigUInt64LE(value, 8);
202
+ this._buf = Buffer.concat([this._buf, buf]);
203
+ }
204
+
205
+ appendSignedInt(value) {
206
+ const buf = Buffer.alloc(12);
207
+ buf.writeUInt32LE(DTX_AUXILIARY_MAGIC, 0);
208
+ buf.writeUInt32LE(3, 4);
209
+ buf.writeInt32LE(value, 8);
210
+ this._buf = Buffer.concat([this._buf, buf]);
211
+ }
212
+
213
+ appendSignedLong(value) {
214
+ const buf = Buffer.alloc(16);
215
+
216
+ this._buf.writeUInt32LE(DTX_AUXILIARY_MAGIC, 0);
217
+
218
+ this._buf.writeUInt32LE(6, 4);
219
+
220
+ this._buf.writeBigInt64LE(value, 8);
221
+
222
+ this._buf = Buffer.concat([this._buf, buf]);
223
+ }
224
+
225
+ appendObject(value) {
226
+ const buf = (0, _nskeyed.archive)(value);
227
+ const buf2 = Buffer.alloc(12);
228
+ buf2.writeUInt32LE(DTX_AUXILIARY_MAGIC, 0);
229
+ buf2.writeUInt32LE(2, 4);
230
+ buf2.writeUInt32LE(buf.length, 8);
231
+ this._buf = Buffer.concat([this._buf, buf2, buf]);
232
+ }
233
+
234
+ getBytes() {
235
+ const out = Buffer.alloc(16);
236
+ out.writeUInt32LE(DTX_MESSAGE_AUX_HEADER, 0);
237
+ out.writeUInt32LE(this._buf.length, 8);
238
+ return Buffer.concat([out, this._buf]);
239
+ }
240
+
241
+ }
242
+
243
+ exports.DTXMessageAuxBuffer = DTXMessageAuxBuffer;
244
+
245
+ class DTXMessage {
246
+ constructor(opts = {}) {
247
+ const {
248
+ identifier,
249
+ channelCode,
250
+ selector,
251
+ expectsReply,
252
+ conversationIndex = 0,
253
+ flags = FLAG_TYPES.send
254
+ } = opts;
255
+ this._messageHeader = undefined;
256
+ this._payloadHeader = undefined;
257
+ this._identifier = identifier;
258
+ this._channelCode = channelCode;
259
+ this._expectsReply = expectsReply;
260
+ this._selector = selector;
261
+ this._conversationIndex = conversationIndex;
262
+ this._flags = flags;
263
+ this.auxiliaries = new DTXMessageAux();
264
+ }
265
+
266
+ get identifier() {
267
+ var _this$_messageHeader;
268
+
269
+ return (_this$_messageHeader = this._messageHeader) === null || _this$_messageHeader === void 0 ? void 0 : _this$_messageHeader.identifier;
270
+ }
271
+
272
+ get channelCode() {
273
+ var _this$_messageHeader2;
274
+
275
+ return (_this$_messageHeader2 = this._messageHeader) === null || _this$_messageHeader2 === void 0 ? void 0 : _this$_messageHeader2.channel;
276
+ }
277
+
278
+ get expectsReply() {
279
+ var _this$_messageHeader3;
280
+
281
+ return (_this$_messageHeader3 = this._messageHeader) === null || _this$_messageHeader3 === void 0 ? void 0 : _this$_messageHeader3.expectsReply;
282
+ }
283
+
284
+ get selector() {
285
+ return this._selector;
286
+ }
287
+
288
+ set selector(data) {
289
+ this._selector = data;
290
+ }
291
+
292
+ get conversationIndex() {
293
+ var _this$_messageHeader4;
294
+
295
+ return (_this$_messageHeader4 = this._messageHeader) === null || _this$_messageHeader4 === void 0 ? void 0 : _this$_messageHeader4.conversationIndex;
296
+ }
297
+
298
+ build() {
299
+ const sel = this._selector ? (0, _nskeyed.archive)(this._selector) : Buffer.alloc(0);
300
+ const aux = this.auxiliaries.build();
301
+ const payloadHeader = DTXMessagePayloadHeader.build({
302
+ flags: this._flags,
303
+ auxLength: aux.length,
304
+ totalLength: BigInt(aux.length + sel.length)
305
+ });
306
+ const messageHeader = DTXMessageHeader.build({
307
+ payloadLength: DTX_MESSAGE_PAYLOAD_HEADER_LENGTH + aux.length + sel.length,
308
+ identifier: this._identifier,
309
+ conversationIndex: this._conversationIndex,
310
+ channelCode: this._channelCode,
311
+ expectsReply: this._expectsReply
312
+ });
313
+ return Buffer.concat([messageHeader, payloadHeader, aux, sel]);
314
+ }
315
+
316
+ static parse(headerBuf, payloadBuf) {
317
+ let cursor = 0;
318
+ const ret = new DTXMessage();
319
+ ret._messageHeader = DTXMessageHeader.parse(headerBuf);
320
+
321
+ if (ret._messageHeader.payloadLength === 0) {
322
+ return ret;
323
+ }
324
+
325
+ ret._payloadHeader = DTXMessagePayloadHeader.parse(payloadBuf.slice(cursor, DTX_MESSAGE_PAYLOAD_HEADER_LENGTH));
326
+ cursor += DTX_MESSAGE_PAYLOAD_HEADER_LENGTH;
327
+
328
+ if (ret._payloadHeader.totalLength === 0n) {
329
+ return ret;
330
+ }
331
+
332
+ if (ret._payloadHeader.auxLength > 0) {
333
+ ret.auxiliaries = DTXMessageAux.parse(payloadBuf.slice(cursor, cursor + ret._payloadHeader.auxLength));
334
+ cursor += ret._payloadHeader.auxLength;
335
+ }
336
+
337
+ const data = payloadBuf.slice(cursor, cursor + payloadBuf.length);
338
+
339
+ for (const fun of [_nskeyed.unarchive, _bplistParser.default.parseBuffer]) {
340
+ try {
341
+ ret.selector = fun(data);
342
+ break;
343
+ } catch (e) {
344
+ ret.selector = new InstrumentRPCParseError(data);
345
+ }
346
+ }
347
+
348
+ return ret;
349
+ }
350
+
351
+ }
352
+
353
+ exports.DTXMessage = DTXMessage;require('source-map-support').install();
354
+
355
+
356
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbnN0cnVtZW50L2hlYWRlcnMuanMiXSwibmFtZXMiOlsiRFRYX01FU1NBR0VfUEFZTE9BRF9IRUFERVJfTEVOR1RIIiwiRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQyIsIkRUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ19MRU4iLCJEVFhfTUVTU0FHRV9BVVhfSEVBREVSIiwiRFRYX0FVWElMSUFSWV9NQUdJQyIsIkZMQUdfVFlQRVMiLCJPYmplY3QiLCJmcmVlemUiLCJyZWN2Iiwic2VuZCIsInJlcGx5IiwiQVVYX1RZUEVTIiwiTlNLZXllZCIsIlVJbnQzMkxFIiwiQmlnVUludDY0TEUiLCJCaWdJbnQ2NExFIiwiRFRYTWVzc2FnZUhlYWRlciIsImJ1aWxkIiwiZGF0YSIsIm1lc3NhZ2VIZWFkZXIiLCJCdWZmZXIiLCJhbGxvYyIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwicGF5bG9hZExlbmd0aCIsImlkZW50aWZpZXIiLCJjb252ZXJzYXRpb25JbmRleCIsImNoYW5uZWxDb2RlIiwiZXhwZWN0c1JlcGx5IiwicGFyc2UiLCJoZWFkZXJCdWZmZXIiLCJtYWdpYyIsInJlYWRVSW50MzJMRSIsImhlYWRlckxlbmd0aCIsImZyYWdtZW50SWQiLCJyZWFkVUludDE2TEUiLCJmcmFnbWVudENvdW50IiwiY2hhbm5lbCIsIkRUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyIiwiZmxhZ3MiLCJhdXhMZW5ndGgiLCJ3cml0ZUJpZ1VJbnQ2NExFIiwidG90YWxMZW5ndGgiLCJyZWFkQmlnSW50NjRMRSIsIkRUWE1lc3NhZ2VBdXgiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2VBdXgiLCJEVFhNZXNzYWdlQXV4QnVmZmVyIiwiYnVmIiwibGVuZ3RoIiwiYXJnIiwiY29uY2F0IiwiZ2V0Qnl0ZXMiLCJfIiwiaXNOdW1iZXIiLCJhcHBlbmRJbnQiLCJhcHBlbmRMb25nIiwiYXBwZW5kT2JqZWN0IiwiY3Vyc29yIiwibSIsIkVycm9yIiwidHlwZSIsInN0ckxlbiIsImFyY2hpdmVkX2RhdGEiLCJzbGljZSIsInB1c2giLCJyZWFkQmlnVUludDY0TEUiLCJJbnN0cnVtZW50UlBDUGFyc2VFcnJvciIsIl9idWYiLCJ2YWx1ZSIsImFwcGVuZFNpZ25lZEludCIsIndyaXRlSW50MzJMRSIsImFwcGVuZFNpZ25lZExvbmciLCJ3cml0ZUJpZ0ludDY0TEUiLCJidWYyIiwib3V0IiwiRFRYTWVzc2FnZSIsIm9wdHMiLCJzZWxlY3RvciIsIl9tZXNzYWdlSGVhZGVyIiwidW5kZWZpbmVkIiwiX3BheWxvYWRIZWFkZXIiLCJfaWRlbnRpZmllciIsIl9jaGFubmVsQ29kZSIsIl9leHBlY3RzUmVwbHkiLCJfc2VsZWN0b3IiLCJfY29udmVyc2F0aW9uSW5kZXgiLCJfZmxhZ3MiLCJhdXhpbGlhcmllcyIsInNlbCIsImF1eCIsInBheWxvYWRIZWFkZXIiLCJCaWdJbnQiLCJoZWFkZXJCdWYiLCJwYXlsb2FkQnVmIiwicmV0IiwiZnVuIiwidW5hcmNoaXZlIiwicGxpc3RsaWIiLCJwYXJzZUJ1ZmZlciIsImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUNBQWlDLEdBQUcsRUFBMUM7O0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsRUFBbEM7O0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsVUFBakM7O0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBckM7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsTUFBL0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxHQUE1QjtBQUVBLE1BQU1DLFVBQVUsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDL0JDLEVBQUFBLElBQUksRUFBRSxDQUR5QjtBQUUvQkMsRUFBQUEsSUFBSSxFQUFFLENBRnlCO0FBRy9CQyxFQUFBQSxLQUFLLEVBQUU7QUFId0IsQ0FBZCxDQUFuQjs7QUFNQSxNQUFNQyxTQUFTLEdBQUdMLE1BQU0sQ0FBQ0MsTUFBUCxDQUFj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QUFDQyxrQkFBRCxFQUFZQyxzQkFBU0MsV0FBckIsQ0FBbEIsRUFBcUQ7QUFDbkQsVUFBSTtBQUNGSixRQUFBQSxHQUFHLENBQUNqQixRQUFKLEdBQWVrQixHQUFHLENBQUM5RSxJQUFELENBQWxCO0FBQ0E7QUFDRCxPQUhELENBR0UsT0FBT2tGLENBQVAsRUFBVTtBQUNWTCxRQUFBQSxHQUFHLENBQUNqQixRQUFKLEdBQWUsSUFBSVgsdUJBQUosQ0FBNEJqRCxJQUE1QixDQUFmO0FBQ0Q7QUFDRjs7QUFDRCxXQUFPNkUsR0FBUDtBQUNEOztBQXJJYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXJjaGl2ZSwgdW5hcmNoaXZlfSBmcm9tICcuL3RyYW5zZm9ybWVyL25za2V5ZWQnO1xuaW1wb3J0IHBsaXN0bGliIGZyb20gJ2JwbGlzdC1wYXJzZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgRFRYX01FU1NBR0VfUEFZTE9BRF9IRUFERVJfTEVOR1RIID0gMTY7XG5jb25zdCBEVFhfTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gMzI7XG5jb25zdCBEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUMgPSAweDFGM0Q1Qjc5O1xuY29uc3QgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDX0xFTiA9IDQ7XG5jb25zdCBEVFhfTUVTU0FHRV9BVVhfSEVBREVSID0gMHgwMUYwO1xuY29uc3QgRFRYX0FVWElMSUFSWV9NQUdJQyA9IDB4YTtcblxuY29uc3QgRkxBR19UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICByZWN2OiAxLFxuICBzZW5kOiAyLFxuICByZXBseTogM1xufSk7XG5cbmNvbnN0IEFVWF9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOU0tleWVkOiAyLFxuICBVSW50MzJMRTogMyxcbiAgQmlnVUludDY0TEU6IDQsXG4gIEJpZ0ludDY0TEU6IDZcbn0pO1xuXG4vKipcbiAqIERUWE1lc3NhZ2VIZWFkZXIgbGVuZ3RoIDMyXG4gKiBzdHJ1Y3QgRFRYTWVzc2FnZUhlYWRlciB7XG4gKiAgICAgdTMyIG1hZ2ljIERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQ1xuICogICAgIHUzMiBoZWFkZXJMZW5ndGhcbiAqICAgICB1MTYgZnJhZ21lbnRJZCAgIHBhY2tldCBudW1iZXJcbiAqICAgICB1MTYgZnJhZ21lbnRDb3VudCAgcGFja2V0cyB0b3RhbCBudW1iZXJcbiAqICAgICB1MzIgcGF5bG9hZExlbmd0aFxuICogICAgIHUzMiBpZGVudGlmaWVyXG4gKiAgICAgdTMyIGNvbnZlcnNhdGlvbkluZGV4XG4gKiAgICAgdTMyIGNoYW5uZWxcbiAqICAgICB1MzIgZXhwZWN0c1JlcGx5XG4gKiAgICAgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRFRYTWVzc2FnZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZGVudGlmaWVyIHBhY2tldCB0cmFuc21pc3Npb24gc2VxdWVuY2UsIHRoaXMgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggcmVxdWVzdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNoYW5uZWxDb2RlIHRoZSBkYXRhIHRyYW5zbWlzc2lvbiBvZiB0aGUgc2VydmljZSB3aWxsIHVzZSB0aGlzIGNoYW5uZWwgY29kZS5cbiAqIEVhY2ggc2VydmljZSBoYXMgYSBzZXBhcmF0ZSBjaGFubmVsXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBheWxvYWRMZW5ndGggRFRYTWVzc2FnZUF1eEJ1ZmZlci5sZW5ndGgobnVsbGFibGUpICsgc2VsZWN0b3JCdWZmZXIubGVuZ3RoKG51bGxhYmxlKVxuICogQHByb3BlcnR5IHtib29sZWFufSBleHBlY3RzUmVwbHkgaWYgdHJ1ZSByZXBseSBhIGFjayBtZXNzYWdlXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29udmVyc2F0aW9uSW5kZXggIHJhdyBkYXRhICsxIGluZGljYXRlIGEgcmVwbHkgbWVzc2FnZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZsYWdzIG1lc3NhZ2Ugc3RhdHVzXG4gKi9cblxuY2xhc3MgRFRYTWVzc2FnZUhlYWRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0RUWE1lc3NhZ2VPcHRpb25zfSBkYXRhXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IERUWE1lc3NhZ2VIZWFkZXJCdWZmZXJcbiAgICovXG4gIHN0YXRpYyBidWlsZCAoZGF0YSkge1xuICAgIGNvbnN0IG1lc3NhZ2VIZWFkZXIgPSBCdWZmZXIuYWxsb2MoRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKERUWF9NRVNTQUdFX0hFQURFUl9NQUdJQywgMCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKERUWF9NRVNTQUdFX0hFQURFUl9MRU5HVEgsIDQpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MTZMRSgwLCA4KTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDE2TEUoMSwgMTApO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLnBheWxvYWRMZW5ndGgsIDEyKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5pZGVudGlmaWVyLCAxNik7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuY29udmVyc2F0aW9uSW5kZXgsIDIwKTtcbiAgICBtZXNzYWdlSGVhZGVyLndyaXRlVUludDMyTEUoZGF0YS5jaGFubmVsQ29kZSwgMjQpO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmV4cGVjdHNSZXBseSwgMjgpO1xuICAgIHJldHVybiBtZXNzYWdlSGVhZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBoZWFkZXJCdWZmZXIgRFRYTWVzc2FnZUhlYWRlckJ1ZmZlclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIHBhcnNlIChoZWFkZXJCdWZmZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFnaWM6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMCksXG4gICAgICBoZWFkZXJMZW5ndGg6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoNCksXG4gICAgICBmcmFnbWVudElkOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQxNkxFKDgpLFxuICAgICAgZnJhZ21lbnRDb3VudDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MTZMRSgxMCksXG4gICAgICBwYXlsb2FkTGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKDEyKSxcbiAgICAgIGlkZW50aWZpZXI6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMTYpLFxuICAgICAgY29udmVyc2F0aW9uSW5kZXg6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMjApLFxuICAgICAgY2hhbm5lbDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRSgyNCksXG4gICAgICBleHBlY3RzUmVwbHk6IGhlYWRlckJ1ZmZlci5yZWFkVUludDMyTEUoMjgpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlciBsZW5ndGggMTZcbiAqIHN0cnVjdCBEVFhNZXNzYWdlSGVhZGVyIHtcbiAqICAgICB1MzIgZmxhZ3MgRkxBR19UWVBFU1xuICogICAgIHUzMiBhdXhMZW5ndGhcbiAqICAgICB1NjQgdG90YWxMZW5ndGhcbiAqICAgICB9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlck9iamVjdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZsYWdzIG1lc3NhZ2Ugc3RhdHVzXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXV4TGVuZ3RoIERUWE1lc3NhZ2VBdXhCdWZmZXIubGVuZ3RoKG51bGxhYmxlKVxuICogQHByb3BlcnR5IHtiaWdpbnR9IHRvdGFsTGVuZ3RoIERUWE1lc3NhZ2VBdXhCdWZmZXIubGVuZ3RoKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyLmxlbmd0aFxuICovXG5jbGFzcyBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSB7RFRYTWVzc2FnZVBheWxvYWRIZWFkZXJPYmplY3R9XG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyQnVmZmVyXG4gICAqL1xuICBzdGF0aWMgYnVpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gQnVmZmVyLmFsbG9jKERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZVVJbnQzMkxFKGRhdGEuZmxhZ3MsIDApO1xuICAgIG1lc3NhZ2VIZWFkZXIud3JpdGVVSW50MzJMRShkYXRhLmF1eExlbmd0aCwgNCk7XG4gICAgbWVzc2FnZUhlYWRlci53cml0ZUJpZ1VJbnQ2NExFKGRhdGEudG90YWxMZW5ndGgsIDgpO1xuICAgIHJldHVybiBtZXNzYWdlSGVhZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBoZWFkZXJCdWZmZXJcbiAgICogQHJldHVybnMge3tmbGFnczogbnVtYmVyLCB0b3RhbExlbmd0aDogYmlnaW50LCBhdXhMZW5ndGg6IG51bWJlcn19XG4gICAqL1xuICBzdGF0aWMgcGFyc2UgKGhlYWRlckJ1ZmZlcikge1xuICAgIHJldHVybiB7XG4gICAgICBmbGFnczogaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRSgwKSxcbiAgICAgIGF1eExlbmd0aDogaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRSg0KSxcbiAgICAgIHRvdGFsTGVuZ3RoOiBoZWFkZXJCdWZmZXIucmVhZEJpZ0ludDY0TEUoOClcbiAgICB9O1xuICB9XG59XG5cblxuY2xhc3MgRFRYTWVzc2FnZUF1eCB7XG4gIGNvbnN0cnVjdG9yIChkYXRhID0gW10pIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIEFycmF5IHRvIEFwcGxlIE5TS2V5ZWQgQnVmZmVyXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9XG4gICAqL1xuICBidWlsZCAoKSB7XG4gICAgY29uc3QgbWVzc2FnZUF1eCA9IG5ldyBEVFhNZXNzYWdlQXV4QnVmZmVyKCk7XG4gICAgbGV0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRFRYTWVzc2FnZUF1eEJ1ZmZlcikge1xuICAgICAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIGFyZy5nZXRCeXRlcygpXSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNOdW1iZXIoYXJnKSkge1xuICAgICAgICBtZXNzYWdlQXV4LmFwcGVuZEludChhcmcpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09ICdiaWdpbnQnKSB7XG4gICAgICAgIG1lc3NhZ2VBdXguYXBwZW5kTG9uZyhhcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZUF1eC5hcHBlbmRPYmplY3QoYXJnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZiwgbWVzc2FnZUF1eC5nZXRCeXRlcygpXSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG5za2V5ZWQgQnVmZmVyIGludG8ganMgYXJyYXlcbiAgICogQHBhcmFtIGhlYWRlckJ1ZmZlclxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgcGFyc2UgKGhlYWRlckJ1ZmZlcikge1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICBjb25zdCBsZW5ndGggPSBoZWFkZXJCdWZmZXIucmVhZEJpZ0ludDY0TEUoOCk7XG4gICAgY3Vyc29yICs9IDE2O1xuICAgIHdoaWxlIChjdXJzb3IgPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBtID0gaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpO1xuICAgICAgaWYgKG0gIT09IERUWF9BVVhJTElBUllfTUFHSUMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgYXV4aWxpYXJ5IG1hZ2ljOiAke219YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IgKyA0KTtcbiAgICAgIGN1cnNvciArPSA4O1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLk5TS2V5ZWQ6IHtcbiAgICAgICAgICBjb25zdCBzdHJMZW4gPSBoZWFkZXJCdWZmZXIucmVhZFVJbnQzMkxFKGN1cnNvcik7XG4gICAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgICAgY29uc3QgYXJjaGl2ZWRfZGF0YSA9IGhlYWRlckJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIHN0ckxlbik7XG4gICAgICAgICAgZGF0YS5wdXNoKHVuYXJjaGl2ZShhcmNoaXZlZF9kYXRhKSk7XG4gICAgICAgICAgY3Vyc29yICs9IHN0ckxlbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEFVWF9UWVBFUy5VSW50MzJMRTpcbiAgICAgICAgICBkYXRhLnB1c2goaGVhZGVyQnVmZmVyLnJlYWRVSW50MzJMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBVVhfVFlQRVMuQmlnVUludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnVUludDY0TEUoY3Vyc29yKSk7XG4gICAgICAgICAgY3Vyc29yICs9IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQVVYX1RZUEVTLkJpZ0ludDY0TEU6XG4gICAgICAgICAgZGF0YS5wdXNoKGhlYWRlckJ1ZmZlci5yZWFkQmlnSW50NjRMRShjdXJzb3IpKTtcbiAgICAgICAgICBjdXJzb3IgKz0gODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmNsYXNzIEluc3RydW1lbnRSUENQYXJzZUVycm9yIHtcbiAgY29uc3RydWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG59XG5cbmNsYXNzIERUWE1lc3NhZ2VBdXhCdWZmZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kSW50ICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoMywgNCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtiaWdpbnR9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRMb25nICh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxNik7XG4gICAgYnVmLndyaXRlVUludDMyTEUoRFRYX0FVWElMSUFSWV9NQUdJQywgMCk7XG4gICAgYnVmLndyaXRlVUludDMyTEUoNCwgNCk7XG4gICAgYnVmLndyaXRlQmlnVUludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRTaWduZWRJbnQgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDEyKTtcbiAgICBidWYud3JpdGVVSW50MzJMRShEVFhfQVVYSUxJQVJZX01BR0lDLCAwKTtcbiAgICBidWYud3JpdGVVSW50MzJMRSgzLCA0KTtcbiAgICBidWYud3JpdGVJbnQzMkxFKHZhbHVlLCA4KTtcbiAgICB0aGlzLl9idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9idWYsIGJ1Zl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YmlnaW50fSB2YWx1ZVxuICAgKi9cbiAgYXBwZW5kU2lnbmVkTG9uZyAodmFsdWUpIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIHRoaXMuX2J1Zi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIHRoaXMuX2J1Zi53cml0ZVVJbnQzMkxFKDYsIDQpO1xuICAgIHRoaXMuX2J1Zi53cml0ZUJpZ0ludDY0TEUodmFsdWUsIDgpO1xuICAgIHRoaXMuX2J1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZiwgYnVmXSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gICAqL1xuICBhcHBlbmRPYmplY3QgKHZhbHVlKSB7XG4gICAgY29uc3QgYnVmID0gYXJjaGl2ZSh2YWx1ZSk7XG4gICAgY29uc3QgYnVmMiA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgYnVmMi53cml0ZVVJbnQzMkxFKERUWF9BVVhJTElBUllfTUFHSUMsIDApO1xuICAgIGJ1ZjIud3JpdGVVSW50MzJMRSgyLCA0KTtcbiAgICBidWYyLndyaXRlVUludDMyTEUoYnVmLmxlbmd0aCwgOCk7XG4gICAgdGhpcy5fYnVmID0gQnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmLCBidWYyLCBidWZdKTtcbiAgfVxuXG4gIGdldEJ5dGVzICgpIHtcbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKERUWF9NRVNTQUdFX0FVWF9IRUFERVIsIDApO1xuICAgIG91dC53cml0ZVVJbnQzMkxFKHRoaXMuX2J1Zi5sZW5ndGgsIDgpO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtvdXQsIHRoaXMuX2J1Zl0pO1xuICB9XG59XG5cblxuXG5jbGFzcyBEVFhNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RFRYTWVzc2FnZU9wdGlvbnN9IG9wdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgY2hhbm5lbENvZGUsXG4gICAgICBzZWxlY3RvcixcbiAgICAgIGV4cGVjdHNSZXBseSxcbiAgICAgIGNvbnZlcnNhdGlvbkluZGV4ID0gMCxcbiAgICAgIGZsYWdzID0gRkxBR19UWVBFUy5zZW5kXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5fbWVzc2FnZUhlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wYXlsb2FkSGVhZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2lkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuX2NoYW5uZWxDb2RlID0gY2hhbm5lbENvZGU7XG4gICAgdGhpcy5fZXhwZWN0c1JlcGx5ID0gZXhwZWN0c1JlcGx5O1xuICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5fY29udmVyc2F0aW9uSW5kZXggPSBjb252ZXJzYXRpb25JbmRleDtcbiAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xuICAgIHRoaXMuYXV4aWxpYXJpZXMgPSBuZXcgRFRYTWVzc2FnZUF1eCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGlkZW50aWZpZXIuIFBhY2tldCB0cmFuc21pc3Npb24gc2VxdWVuY2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBpZGVudGlmaWVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgRFRYTWVzc2FnZUhlYWRlciBjaGFubmVsQ29kZS5cbiAgICogUGFja2V0IHRyYW5zbWlzc2lvbiBjaGFubmVsQ29kZS4gVXNlIHRoaXMgdmFsdWUgdG8gZGlzdGluZ3Vpc2ggd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY2hhbm5lbHNcbiAgICogY2FsbCB0aGlzIG1ldGhvZCBgSW5zdHJ1bWVudFNlcnZpY2UucmVnaXN0ZXJDaGFubmVsQ2FsbGJhY2tgIGdldCB0aGUgY2hhbm5lbCBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY2hhbm5lbENvZGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGVhZGVyPy5jaGFubmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBEVFhNZXNzYWdlSGVhZGVyIGV4cGVjdHNSZXBseS4gV2hldGhlciB0byBuZWVkIGFjayBtZXNzYWdlXG4gICAqIGlmIGV4cGVjdHNSZXBseSBpcyB0cnVlIG11c3QgcmVwbHkgYWNrIG1lc3NhZ2VcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgZXhwZWN0c1JlcGx5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhlYWRlcj8uZXhwZWN0c1JlcGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdGhpcyBtZXRob2QgYEluc3RydW1lbnRTZXJ2aWNlLnJlZ2lzdGVyU2VsZWN0b3JDYWxsYmFja2AgZ2V0IHRoZSBzZWxlY3RvciBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHsqfSBVbmtub3duIGRhdGFcbiAgICovXG4gIGdldCBzZWxlY3RvciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXQgc2VsZWN0b3IgKGRhdGEpIHtcbiAgICB0aGlzLl9zZWxlY3RvciA9IGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IERUWE1lc3NhZ2VIZWFkZXIgY29udmVyc2F0aW9uSW5kZXhcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBjb252ZXJzYXRpb25JbmRleCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIZWFkZXI/LmNvbnZlcnNhdGlvbkluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIERUWE1lc3NhZ2UgQnVmZmVyOiBEVFhNZXNzYWdlSGVhZGVyICsgUGF5bG9hZEhlYWRlciArIERUWE1lc3NhZ2VBdXhCdWZmZXIobnVsbGFibGUpICsgc2VsZWN0b3IobnVsbGFibGUpXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9XG4gICAqL1xuICBidWlsZCAoKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fc2VsZWN0b3IgPyBhcmNoaXZlKHRoaXMuX3NlbGVjdG9yKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBjb25zdCBhdXggPSB0aGlzLmF1eGlsaWFyaWVzLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZEhlYWRlciA9IERUWE1lc3NhZ2VQYXlsb2FkSGVhZGVyLmJ1aWxkKHtcbiAgICAgIGZsYWdzOiB0aGlzLl9mbGFncyxcbiAgICAgIGF1eExlbmd0aDogYXV4Lmxlbmd0aCxcbiAgICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBiaWdpbnQgaW4gYW55IGNhc2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgdG90YWxMZW5ndGg6IEJpZ0ludChhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBtZXNzYWdlSGVhZGVyID0gRFRYTWVzc2FnZUhlYWRlci5idWlsZCh7XG4gICAgICBwYXlsb2FkTGVuZ3RoOiBEVFhfTUVTU0FHRV9QQVlMT0FEX0hFQURFUl9MRU5HVEggKyBhdXgubGVuZ3RoICsgc2VsLmxlbmd0aCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuX2lkZW50aWZpZXIsXG4gICAgICBjb252ZXJzYXRpb25JbmRleDogdGhpcy5fY29udmVyc2F0aW9uSW5kZXgsXG4gICAgICBjaGFubmVsQ29kZTogdGhpcy5fY2hhbm5lbENvZGUsXG4gICAgICBleHBlY3RzUmVwbHk6IHRoaXMuX2V4cGVjdHNSZXBseVxuICAgIH0pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFttZXNzYWdlSGVhZGVyLCBwYXlsb2FkSGVhZGVyLCBhdXgsIHNlbF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBEVFggYnVmZmVyIGludG8gYW4ganMgb2JqZWN0LiBSZXR1cm5lZCBpbiBEVFhEZWNvZGVyIFN0cmVhbS5UcmFuc2Zvcm1cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWRlckJ1ZiAgRFRYTWVzc2FnZUhlYWRlciBidWZmZXJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWRCdWYgIFBheWxvYWRIZWFkZXJCdWZmZXIgKyBEVFhNZXNzYWdlQXV4QnVmZmVyKG51bGxhYmxlKSArIHNlbGVjdG9yQnVmZmVyKG51bGxhYmxlKVxuICAgKiBAcmV0dXJucyB7RFRYTWVzc2FnZX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZSAoaGVhZGVyQnVmLCBwYXlsb2FkQnVmKSB7XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgY29uc3QgcmV0ID0gbmV3IERUWE1lc3NhZ2UoKTtcbiAgICByZXQuX21lc3NhZ2VIZWFkZXIgPSBEVFhNZXNzYWdlSGVhZGVyLnBhcnNlKGhlYWRlckJ1Zik7XG4gICAgaWYgKHJldC5fbWVzc2FnZUhlYWRlci5wYXlsb2FkTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICByZXQuX3BheWxvYWRIZWFkZXIgPSBEVFhNZXNzYWdlUGF5bG9hZEhlYWRlci5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgRFRYX01FU1NBR0VfUEFZTE9BRF9IRUFERVJfTEVOR1RIKSk7XG4gICAgY3Vyc29yICs9IERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSDtcbiAgICAvLyB0b3RhbExlbmd0aCBpcyBiaWdpbnQgdXNlIDBuXG4gICAgaWYgKHJldC5fcGF5bG9hZEhlYWRlci50b3RhbExlbmd0aCA9PT0gMG4pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlmIChyZXQuX3BheWxvYWRIZWFkZXIuYXV4TGVuZ3RoID4gMCkge1xuICAgICAgcmV0LmF1eGlsaWFyaWVzID0gRFRYTWVzc2FnZUF1eC5wYXJzZShwYXlsb2FkQnVmLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgcmV0Ll9wYXlsb2FkSGVhZGVyLmF1eExlbmd0aCkpO1xuICAgICAgY3Vyc29yICs9IHJldC5fcGF5bG9hZEhlYWRlci5hdXhMZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHBheWxvYWRCdWYuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBwYXlsb2FkQnVmLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBmdW4gb2YgW3VuYXJjaGl2ZSwgcGxpc3RsaWIucGFyc2VCdWZmZXJdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXQuc2VsZWN0b3IgPSBmdW4oZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXQuc2VsZWN0b3IgPSBuZXcgSW5zdHJ1bWVudFJQQ1BhcnNlRXJyb3IoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgRFRYTWVzc2FnZUhlYWRlciwgRFRYTWVzc2FnZVBheWxvYWRIZWFkZXIsIERUWE1lc3NhZ2VBdXhCdWZmZXIsIERUWE1lc3NhZ2VBdXgsIERUWE1lc3NhZ2UsXG4gIERUWF9NRVNTQUdFX1BBWUxPQURfSEVBREVSX0xFTkdUSCwgRFRYX01FU1NBR0VfSEVBREVSX0xFTkdUSCwgRFRYX01FU1NBR0VfSEVBREVSX01BR0lDLCBEVFhfTUVTU0FHRV9IRUFERVJfTUFHSUNfTEVOLFxuICBGTEFHX1RZUEVTfTsiXSwiZmlsZSI6ImxpYi9pbnN0cnVtZW50L2hlYWRlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.SERVICE = exports.InstrumentService = exports.INSTRUMENT_SERVICE_NAME_VERSION_14 = exports.INSTRUMENT_SERVICE_NAME = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _baseService = require("../base-service");
13
+
14
+ var _headers = require("./headers");
15
+
16
+ var _dtxEncode = require("./transformer/dtx-encode");
17
+
18
+ var _dtxDecode = require("./transformer/dtx-decode");
19
+
20
+ var _events = _interopRequireDefault(require("events"));
21
+
22
+ var _lodash = _interopRequireDefault(require("lodash"));
23
+
24
+ var _asyncbox = require("asyncbox");
25
+
26
+ const CHECK_FREQ_MS = 500;
27
+ const WAIT_REPLY_TIME_MS = 10000;
28
+ const EMPTY_MESSAGE_SIZE = 16;
29
+ const CHANNEL_CANCELED = '_channelCanceled';
30
+ const CHANNEL_OFFSET = 2 ** 32;
31
+ const INSTRUMENT_SERVICE_NAME_VERSION_14 = 'com.apple.instruments.remoteserver.DVTSecureSocketProxy';
32
+ exports.INSTRUMENT_SERVICE_NAME_VERSION_14 = INSTRUMENT_SERVICE_NAME_VERSION_14;
33
+ const INSTRUMENT_SERVICE_NAME = 'com.apple.instruments.remoteserver';
34
+ exports.INSTRUMENT_SERVICE_NAME = INSTRUMENT_SERVICE_NAME;
35
+ const SERVICE = Object.freeze({
36
+ DEVICE_INFO: 'com.apple.instruments.server.services.deviceinfo',
37
+ PROCESS_CONTROL: 'com.apple.instruments.server.services.processcontrol',
38
+ SYSMONTAP: 'com.apple.instruments.server.services.sysmontap',
39
+ NETWORKING: 'com.apple.instruments.server.services.networking',
40
+ MOBILE_NOTIFICATIONS: 'com.apple.instruments.server.services.mobilenotifications',
41
+ GRAPHICS_OPENGL: 'com.apple.instruments.server.services.graphics.opengl',
42
+ APPLICATION_LISTING: 'com.apple.instruments.server.services.device.applictionListing',
43
+ CONDITION_INDUCER: 'com.apple.instruments.server.services.ConditionInducer'
44
+ });
45
+ exports.SERVICE = SERVICE;
46
+
47
+ function defaultDict(createValue) {
48
+ return new Proxy(Object.create(null), {
49
+ get(storage, property) {
50
+ if (!(property in storage)) {
51
+ storage[property] = createValue(property);
52
+ }
53
+
54
+ return storage[property];
55
+ }
56
+
57
+ });
58
+ }
59
+
60
+ class InstrumentService extends _baseService.BaseServiceSocket {
61
+ constructor(socketClient, event) {
62
+ super(socketClient);
63
+ this._undefinedCallback = event;
64
+ this._callbacks = new _events.default.EventEmitter();
65
+ this._channelCallbacks = new _events.default.EventEmitter();
66
+ this._replyQueues = defaultDict(() => []);
67
+ this._channels = {};
68
+ this._nextIdentifier = 1;
69
+ this._encoder = new _dtxEncode.DTXEncoder();
70
+
71
+ this._encoder.pipe(this._socketClient);
72
+
73
+ this._assignClientFailureHandlers(this._encoder);
74
+
75
+ this._decoder = new _dtxDecode.DTXDecoder();
76
+
77
+ this._socketClient.pipe(this._decoder);
78
+
79
+ this._decoder.on('data', this._handleData.bind(this));
80
+ }
81
+
82
+ registerSelectorCallback(selector, event) {
83
+ this._callbacks.addListener(selector, event);
84
+ }
85
+
86
+ registerUndefinedCallback(event) {
87
+ this._undefinedCallback = event;
88
+ }
89
+
90
+ async registerChannelCallback(channel, event) {
91
+ const channelId = await this.makeChannel(channel);
92
+
93
+ this._channelCallbacks.addListener(channelId, event);
94
+ }
95
+
96
+ async makeChannel(channel) {
97
+ if (channel in this._channels) {
98
+ return this._channels[channel];
99
+ }
100
+
101
+ const channelCode = Object.keys(this._channels).length + 1;
102
+ await this._callChannel(true, 0, '_requestChannelWithCode:identifier:', channelCode, channel);
103
+ this._channels[channel] = channelCode;
104
+ return channelCode;
105
+ }
106
+
107
+ async callChannel(channel, selector, ...auxiliaries) {
108
+ const channelCode = await this.makeChannel(channel);
109
+ return await this._callChannel(true, channelCode, selector, ...auxiliaries);
110
+ }
111
+
112
+ async _callChannel(sync, channelCode, selector, ...auxiliaries) {
113
+ const identifier = this._nextIdentifier;
114
+
115
+ this._encoder.write({
116
+ sync,
117
+ channelCode,
118
+ selector,
119
+ auxiliaries,
120
+ identifier
121
+ });
122
+
123
+ ++this._nextIdentifier;
124
+
125
+ if (sync) {
126
+ try {
127
+ return await (0, _asyncbox.waitForCondition)(() => {
128
+ const queue = this._replyQueues[identifier];
129
+ const data = queue.shift();
130
+
131
+ if (!_lodash.default.isUndefined(data)) {
132
+ return data;
133
+ }
134
+ }, {
135
+ waitMs: WAIT_REPLY_TIME_MS,
136
+ intervalMs: CHECK_FREQ_MS,
137
+ error: 'reply channel data timeout'
138
+ });
139
+ } catch (err) {
140
+ this.close();
141
+ throw new Error(err);
142
+ }
143
+ }
144
+ }
145
+
146
+ _handleData(data) {
147
+ if (_lodash.default.includes(data.selector, CHANNEL_CANCELED)) {
148
+ this.close();
149
+ }
150
+
151
+ if (data.conversationIndex === 1) {
152
+ this._replyQueues[data.identifier].push(data);
153
+ } else if (this._channelCallbacks.listenerCount(CHANNEL_OFFSET - data.channelCode) > 0) {
154
+ this._channelCallbacks.emit(CHANNEL_OFFSET - data.channelCode, data);
155
+ } else {
156
+ const selector = data.selector;
157
+
158
+ if (_lodash.default.isString(selector) && this._callbacks.listenerCount(selector) > 0) {
159
+ this._callbacks.emit(selector, data);
160
+ } else if (this._undefinedCallback) {
161
+ this._undefinedCallback(data);
162
+ }
163
+
164
+ if (data.expectsReply) {
165
+ this._replyAck(data);
166
+ }
167
+ }
168
+ }
169
+
170
+ _replyAck(data) {
171
+ const reply = new _headers.DTXMessage({
172
+ identifier: data.identifier,
173
+ channelCode: data.channelCode,
174
+ selector: Buffer.alloc(EMPTY_MESSAGE_SIZE),
175
+ conversationIndex: data.conversationIndex + 1,
176
+ flags: _headers.FLAG_TYPES.reply
177
+ });
178
+
179
+ this._socketClient.write(reply.build());
180
+ }
181
+
182
+ }
183
+
184
+ exports.InstrumentService = InstrumentService;require('source-map-support').install();
185
+
186
+
187
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbnN0cnVtZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbIkNIRUNLX0ZSRVFfTVMiLCJXQUlUX1JFUExZX1RJTUVfTVMiLCJFTVBUWV9NRVNTQUdFX1NJWkUiLCJDSEFOTkVMX0NBTkNFTEVEIiwiQ0hBTk5FTF9PRkZTRVQiLCJJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRV9WRVJTSU9OXzE0IiwiSU5TVFJVTUVOVF9TRVJWSUNFX05BTUUiLCJTRVJWSUNFIiwiT2JqZWN0IiwiZnJlZXplIiwiREVWSUNFX0lORk8iLCJQUk9DRVNTX0NPTlRST0wiLCJTWVNNT05UQVAiLCJORVRXT1JLSU5HIiwiTU9CSUxFX05PVElGSUNBVElPTlMiLCJHUkFQSElDU19PUEVOR0wiLCJBUFBMSUNBVElPTl9MSVNUSU5HIiwiQ09ORElUSU9OX0lORFVDRVIiLCJkZWZhdWx0RGljdCIsImNyZWF0ZVZhbHVlIiwiUHJveHkiLCJjcmVhdGUiLCJnZXQiLCJzdG9yYWdlIiwicHJvcGVydHkiLCJJbnN0cnVtZW50U2VydmljZSIsIkJhc2VTZXJ2aWNlU29ja2V0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJldmVudCIsIl91bmRlZmluZWRDYWxsYmFjayIsIl9jYWxsYmFja3MiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJfY2hhbm5lbENhbGxiYWNrcyIsIl9yZXBseVF1ZXVlcyIsIl9jaGFubmVscyIsIl9uZXh0SWRlbnRpZmllciIsIl9lbmNvZGVyIiwiRFRYRW5jb2RlciIsInBpcGUiLCJfc29ja2V0Q2xpZW50IiwiX2Fzc2lnbkNsaWVudEZhaWx1cmVIYW5kbGVycyIsIl9kZWNvZGVyIiwiRFRYRGVjb2RlciIsIm9uIiwiX2hhbmRsZURhdGEiLCJiaW5kIiwicmVnaXN0ZXJTZWxlY3RvckNhbGxiYWNrIiwic2VsZWN0b3IiLCJhZGRMaXN0ZW5lciIsInJlZ2lzdGVyVW5kZWZpbmVkQ2FsbGJhY2siLCJyZWdpc3RlckNoYW5uZWxDYWxsYmFjayIsImNoYW5uZWwiLCJjaGFubmVsSWQiLCJtYWtlQ2hhbm5lbCIsImNoYW5uZWxDb2RlIiwia2V5cyIsImxlbmd0aCIsIl9jYWxsQ2hhbm5lbCIsImNhbGxDaGFubmVsIiwiYXV4aWxpYXJpZXMiLCJzeW5jIiwiaWRlbnRpZmllciIsIndyaXRlIiwicXVldWUiLCJkYXRhIiwic2hpZnQiLCJfIiwiaXNVbmRlZmluZWQiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZXJyb3IiLCJlcnIiLCJjbG9zZSIsIkVycm9yIiwiaW5jbHVkZXMiLCJjb252ZXJzYXRpb25JbmRleCIsInB1c2giLCJsaXN0ZW5lckNvdW50IiwiZW1pdCIsImlzU3RyaW5nIiwiZXhwZWN0c1JlcGx5IiwiX3JlcGx5QWNrIiwicmVwbHkiLCJEVFhNZXNzYWdlIiwiQnVmZmVyIiwiYWxsb2MiLCJmbGFncyIsIkZMQUdfVFlQRVMiLCJidWlsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxhQUFhLEdBQUcsR0FBdEI7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxLQUEzQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEVBQTNCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsa0JBQXpCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEtBQUssRUFBNUI7QUFFQSxNQUFNQyxrQ0FBa0MsR0FBRyx5REFBM0M7O0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsb0NBQWhDOztBQUVPLE1BQU1DLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDbkNDLEVBQUFBLFdBQVcsRUFBRSxrREFEc0I7QUFFbkNDLEVBQUFBLGVBQWUsRUFBRSxzREFGa0I7QUFHbkNDLEVBQUFBLFNBQVMsRUFBRSxpREFId0I7QUFJbkNDLEVBQUFBLFVBQVUsRUFBRSxrREFKdUI7QUFLbkNDLEVBQUFBLG9CQUFvQixFQUFFLDJEQUxhO0FBTW5DQyxFQUFBQSxlQUFlLEVBQUUsdURBTmtCO0FBT25DQyxFQUFBQSxt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QVcsRUFBRVUsSUFBSSxDQUFDVixXQUZTO0FBRzNCUCxNQUFBQSxRQUFRLEVBQUVxQyxNQUFNLENBQUNDLEtBQVAsQ0FBYXJGLGtCQUFiLENBSGlCO0FBSTNCMkUsTUFBQUEsaUJBQWlCLEVBQUVYLElBQUksQ0FBQ1csaUJBQUwsR0FBeUIsQ0FKakI7QUFLM0JXLE1BQUFBLEtBQUssRUFBRUMsb0JBQVdMO0FBTFMsS0FBZixDQUFkOztBQU9BLFNBQUszQyxhQUFMLENBQW1CdUIsS0FBbkIsQ0FBeUJvQixLQUFLLENBQUNNLEtBQU4sRUFBekI7QUFDRDs7QUF2SStDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ZdWVDaGVuLUMvcHktaW9zLWRldmljZVxuXG5pbXBvcnQge0Jhc2VTZXJ2aWNlU29ja2V0fSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuaW1wb3J0IHtEVFhNZXNzYWdlLCBGTEFHX1RZUEVTfSBmcm9tICcuL2hlYWRlcnMnO1xuaW1wb3J0IHtEVFhFbmNvZGVyfSBmcm9tICcuL3RyYW5zZm9ybWVyL2R0eC1lbmNvZGUnO1xuaW1wb3J0IHtEVFhEZWNvZGVyfSBmcm9tICcuL3RyYW5zZm9ybWVyL2R0eC1kZWNvZGUnO1xuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7d2FpdEZvckNvbmRpdGlvbn0gZnJvbSAnYXN5bmNib3gnO1xuXG5jb25zdCBDSEVDS19GUkVRX01TID0gNTAwO1xuY29uc3QgV0FJVF9SRVBMWV9USU1FX01TID0gMTAwMDA7XG5jb25zdCBFTVBUWV9NRVNTQUdFX1NJWkUgPSAxNjtcbmNvbnN0IENIQU5ORUxfQ0FOQ0VMRUQgPSAnX2NoYW5uZWxDYW5jZWxlZCc7XG5jb25zdCBDSEFOTkVMX09GRlNFVCA9IDIgKiogMzI7XG5cbmNvbnN0IElOU1RSVU1FTlRfU0VSVklDRV9OQU1FX1ZFUlNJT05fMTQgPSAnY29tLmFwcGxlLmluc3RydW1lbnRzLnJlbW90ZXNlcnZlci5EVlRTZWN1cmVTb2NrZXRQcm94eSc7XG5jb25zdCBJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRSA9ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMucmVtb3Rlc2VydmVyJztcblxuZXhwb3J0IGNvbnN0IFNFUlZJQ0UgPSBPYmplY3QuZnJlZXplKHtcbiAgREVWSUNFX0lORk86ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMuc2VydmVyLnNlcnZpY2VzLmRldmljZWluZm8nLFxuICBQUk9DRVNTX0NPTlRST0w6ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMuc2VydmVyLnNlcnZpY2VzLnByb2Nlc3Njb250cm9sJyxcbiAgU1lTTU9OVEFQOiAnY29tLmFwcGxlLmluc3RydW1lbnRzLnNlcnZlci5zZXJ2aWNlcy5zeXNtb250YXAnLFxuICBORVRXT1JLSU5HOiAnY29tLmFwcGxlLmluc3RydW1lbnRzLnNlcnZlci5zZXJ2aWNlcy5uZXR3b3JraW5nJyxcbiAgTU9CSUxFX05PVElGSUNBVElPTlM6ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMuc2VydmVyLnNlcnZpY2VzLm1vYmlsZW5vdGlmaWNhdGlvbnMnLFxuICBHUkFQSElDU19PUEVOR0w6ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMuc2VydmVyLnNlcnZpY2VzLmdyYXBoaWNzLm9wZW5nbCcsXG4gIEFQUExJQ0FUSU9OX0xJU1RJTkc6ICdjb20uYXBwbGUuaW5zdHJ1bWVudHMuc2VydmVyLnNlcnZpY2VzLmRldmljZS5hcHBsaWN0aW9uTGlzdGluZycsXG4gIENPTkRJVElPTl9JTkRVQ0VSOiAnY29tLmFwcGxlLmluc3RydW1lbnRzLnNlcnZlci5zZXJ2aWNlcy5Db25kaXRpb25JbmR1Y2VyJ1xufSk7XG5cbmZ1bmN0aW9uIGRlZmF1bHREaWN0IChjcmVhdGVWYWx1ZSkge1xuICByZXR1cm4gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICBnZXQgKHN0b3JhZ2UsIHByb3BlcnR5KSB7XG4gICAgICBpZiAoIShwcm9wZXJ0eSBpbiBzdG9yYWdlKSkge1xuICAgICAgICBzdG9yYWdlW3Byb3BlcnR5XSA9IGNyZWF0ZVZhbHVlKHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdG9yYWdlW3Byb3BlcnR5XTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGF0YSB0cmFuc21pc3Npb24gaW4gaW5zdHJ1bWVudCBzZXJ2ZVxuICogQG5hbWUgRFRYQ2FsbGJhY2tcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtEVFhNZXNzYWdlfSBvYmplY3RcbiovXG5cbi8qKlxuICogQHBhcmFtIHtTb2NrZXR9IHNvY2tldENsaWVudCAgRFRYTWVzc2FnZS5zZWxlY3RvclxuICogQHBhcmFtIHs/RFRYQ2FsbGJhY2t9IGV2ZW50IGlmIGVtcHR5IHdpbGwgaWdub3JlIGFueSBtZXNzYWdlc1xuICovXG5jbGFzcyBJbnN0cnVtZW50U2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlU29ja2V0IHtcbiAgY29uc3RydWN0b3IgKHNvY2tldENsaWVudCwgZXZlbnQpIHtcbiAgICBzdXBlcihzb2NrZXRDbGllbnQpO1xuICAgIHRoaXMuX3VuZGVmaW5lZENhbGxiYWNrID0gZXZlbnQ7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLl9jaGFubmVsQ2FsbGJhY2tzID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLl9yZXBseVF1ZXVlcyA9IGRlZmF1bHREaWN0KCgpID0+IFtdKTtcbiAgICB0aGlzLl9jaGFubmVscyA9IHt9O1xuICAgIHRoaXMuX25leHRJZGVudGlmaWVyID0gMTtcbiAgICB0aGlzLl9lbmNvZGVyID0gbmV3IERUWEVuY29kZXIoKTtcbiAgICB0aGlzLl9lbmNvZGVyLnBpcGUodGhpcy5fc29ja2V0Q2xpZW50KTtcbiAgICB0aGlzLl9hc3NpZ25DbGllbnRGYWlsdXJlSGFuZGxlcnModGhpcy5fZW5jb2Rlcik7XG4gICAgdGhpcy5fZGVjb2RlciA9IG5ldyBEVFhEZWNvZGVyKCk7XG4gICAgdGhpcy5fc29ja2V0Q2xpZW50LnBpcGUodGhpcy5fZGVjb2Rlcik7XG4gICAgdGhpcy5fZGVjb2Rlci5vbignZGF0YScsIHRoaXMuX2hhbmRsZURhdGEuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHNlbGVjdG9yIGlzIHJlZ2lzdGVyZWQsIFRoZSBtZXNzYWdlIG9mIHRoZSBzZWxlY3RvciBldmVudCB3aWxsIGJlIHJldHVybmVkLiByZWZlciB0byB0aGlzLl9oYW5kbGVEYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAgTGlzdGVuIGZvciByZXR1cm4gRFRYTWVzc2FnZS5zZWxlY3RvciBkYXRhXG4gICAqIEBwYXJhbSB7RFRYQ2FsbGJhY2t9IGV2ZW50XG4gICAqL1xuICByZWdpc3RlclNlbGVjdG9yQ2FsbGJhY2sgKHNlbGVjdG9yLCBldmVudCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcy5hZGRMaXN0ZW5lcihzZWxlY3RvciwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBldmVudCBpcyByZWdpc3RlcmVkLCBhbGwgdW5yZWdpc3RlcmVkIG1lc3NhZ2VzIHdpbGwgYmUgcmV0dXJuZWQgdG8gZXZlbnQuIHJlZmVyIHRvIHRoaXMuX2hhbmRsZURhdGFcbiAgICogQHBhcmFtIHtEVFhDYWxsYmFja30gZXZlbnRcbiAgICovXG4gIHJlZ2lzdGVyVW5kZWZpbmVkQ2FsbGJhY2sgKGV2ZW50KSB7XG4gICAgdGhpcy5fdW5kZWZpbmVkQ2FsbGJhY2sgPSBldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZXZlbnQgaXMgcmVnaXN0ZXJlZCwgdGhpcyBjaGFubmVsIHtTRVJWSUNFfSBtZXNzYWdlcyB3aWxsIGJlIHJldHVybmVkIHRvIGV2ZW50LiByZWZlciB0byB0aGlzLl9oYW5kbGVEYXRhXG4gICAqIEl0J3MgYWN0dWFsbHkgbGlzdGVuaW5nIGZvciBpbnQgY2hhbm5lbENvZGUuIEluIHRoaXMuX2NoYW5uZWwgb2JqZWN0IHRvIHJlY29yZCBjaGFubmVsIGtleSBhbmQgaW50IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIGluc3RydW1lbnRzIHNlcnZpY2UgY2hhbm5lbCBlLmc6IFNFUlZJQ0UuREVWSUNFX0lORk8uXG4gICAqIEBwYXJhbSB7RFRYQ2FsbGJhY2t9IGV2ZW50XG4gICAqL1xuICBhc3luYyByZWdpc3RlckNoYW5uZWxDYWxsYmFjayAoY2hhbm5lbCwgZXZlbnQpIHtcbiAgICBjb25zdCBjaGFubmVsSWQgPSBhd2FpdCB0aGlzLm1ha2VDaGFubmVsKGNoYW5uZWwpO1xuICAgIHRoaXMuX2NoYW5uZWxDYWxsYmFja3MuYWRkTGlzdGVuZXIoY2hhbm5lbElkLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2VydmljZSBjaGFubmVsLCBkYXRhIHRyYW5zbWlzc2lvbiBvZiB0aGUgc2VydmljZSB3aWxsIHVzZSB0aGlzIGNoYW5uZWxDb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsICBpbnN0cnVtZW50cyBzZXJ2aWNlIGNoYW5uZWwgZS5nOiBTRVJWSUNFLkRFVklDRV9JTkZPXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcnwqPn0gaW5zdHJ1bWVudHMgc2VydmljZSBjaGFubmVsIGNvZGUgZm9yIGRhdGEgdHJhbnNtaXNzaW9uXG4gICAqL1xuICBhc3luYyBtYWtlQ2hhbm5lbCAoY2hhbm5lbCkge1xuICAgIGlmIChjaGFubmVsIGluIHRoaXMuX2NoYW5uZWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxDb2RlID0gT2JqZWN0LmtleXModGhpcy5fY2hhbm5lbHMpLmxlbmd0aCArIDE7XG4gICAgYXdhaXQgdGhpcy5fY2FsbENoYW5uZWwodHJ1ZSwgMCwgJ19yZXF1ZXN0Q2hhbm5lbFdpdGhDb2RlOmlkZW50aWZpZXI6JywgY2hhbm5lbENvZGUsIGNoYW5uZWwpO1xuICAgIHRoaXMuX2NoYW5uZWxzW2NoYW5uZWxdID0gY2hhbm5lbENvZGU7XG4gICAgcmV0dXJuIGNoYW5uZWxDb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGdlbmVyYWwsIHdlIGNhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGhlIGluc3RydW1lbnQgZHR4IHNlcnZpY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgaW5zdHJ1bWVudCBkdHggc2VydmljZSBlLmc6IFNFUlZJQ0UuREVWSUNFX0lORk9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIGluc3RydW1lbnQgc2VydmljZSBtZXRob2QgbmFtZSAocmVmbGVjdGlvbiBjYWxscylcbiAgICogQHBhcmFtIHsuLi5hbnl9IGF1eGlsaWFyaWVzIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8RFRYTWVzc2FnZT59XG4gICAqIGV4YW1wbGXvvJpcbiAgICogaW5zdHJ1bWVudFNlcnZpY2UuY2FsbENoYW5uZWwoU0VSVklDRS5QUk9DRVNTX0NPTlRST0wsXG4gICAgICAgICdsYXVuY2hTdXNwZW5kZWRQcm9jZXNzV2l0aERldmljZVBhdGg6YnVuZGxlSWRlbnRpZmllcjplbnZpcm9ubWVudDphcmd1bWVudHM6b3B0aW9uczonLCAnJyxcbiAgICAgICAgYnVuZGxlSUQsIHt9LCBbXSwgeydTdGFydFN1c3BlbmRlZEtleSc6IDAsICdLaWxsRXhpc3RpbmcnOiAxfVxuICAgKi9cbiAgYXN5bmMgY2FsbENoYW5uZWwgKGNoYW5uZWwsIHNlbGVjdG9yLCAuLi5hdXhpbGlhcmllcykge1xuICAgIGNvbnN0IGNoYW5uZWxDb2RlID0gYXdhaXQgdGhpcy5tYWtlQ2hhbm5lbChjaGFubmVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2FsbENoYW5uZWwodHJ1ZSwgY2hhbm5lbENvZGUsIHNlbGVjdG9yLCAuLi5hdXhpbGlhcmllcyk7XG4gIH1cblxuICBhc3luYyBfY2FsbENoYW5uZWwgKHN5bmMsIGNoYW5uZWxDb2RlLCBzZWxlY3RvciwgLi4uYXV4aWxpYXJpZXMpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5fbmV4dElkZW50aWZpZXI7XG4gICAgdGhpcy5fZW5jb2Rlci53cml0ZSh7c3luYywgY2hhbm5lbENvZGUsIHNlbGVjdG9yLCBhdXhpbGlhcmllcywgaWRlbnRpZmllcn0pO1xuICAgICsrdGhpcy5fbmV4dElkZW50aWZpZXI7XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX3JlcGx5UXVldWVzW2lkZW50aWZpZXJdO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7d2FpdE1zOiBXQUlUX1JFUExZX1RJTUVfTVMsIGludGVydmFsTXM6IENIRUNLX0ZSRVFfTVMsIGVycm9yOiAncmVwbHkgY2hhbm5lbCBkYXRhIHRpbWVvdXQnfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxpbmcgcmVnaXN0ZXJlZCBhc3luY2hyb25vdXMgbWVzc2FnZSBjYWxsYmFja3NcbiAgICogQHBhcmFtIHtEVFhNZXNzYWdlfSBkYXRhXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlRGF0YSAoZGF0YSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGRhdGEuc2VsZWN0b3IsIENIQU5ORUxfQ0FOQ0VMRUQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmNvbnZlcnNhdGlvbkluZGV4ID09PSAxKSB7XG4gICAgICB0aGlzLl9yZXBseVF1ZXVlc1tkYXRhLmlkZW50aWZpZXJdLnB1c2goZGF0YSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jaGFubmVsQ2FsbGJhY2tzLmxpc3RlbmVyQ291bnQoQ0hBTk5FTF9PRkZTRVQgLSBkYXRhLmNoYW5uZWxDb2RlKSA+IDApIHtcbiAgICAgIHRoaXMuX2NoYW5uZWxDYWxsYmFja3MuZW1pdChDSEFOTkVMX09GRlNFVCAtIGRhdGEuY2hhbm5lbENvZGUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGRhdGEuc2VsZWN0b3I7XG4gICAgICBpZiAoXy5pc1N0cmluZyhzZWxlY3RvcikgJiYgdGhpcy5fY2FsbGJhY2tzLmxpc3RlbmVyQ291bnQoc2VsZWN0b3IpID4gMCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MuZW1pdChzZWxlY3RvciwgZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VuZGVmaW5lZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3VuZGVmaW5lZENhbGxiYWNrKGRhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZXhwZWN0c1JlcGx5KSB7XG4gICAgICAgIHRoaXMuX3JlcGx5QWNrKGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBlbXB0eSBhY2sgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0RUWE1lc3NhZ2V9IGRhdGFcbiAgICovXG4gIF9yZXBseUFjayAoZGF0YSkge1xuICAgIGNvbnN0IHJlcGx5ID0gbmV3IERUWE1lc3NhZ2Uoe1xuICAgICAgaWRlbnRpZmllcjogZGF0YS5pZGVudGlmaWVyLFxuICAgICAgY2hhbm5lbENvZGU6IGRhdGEuY2hhbm5lbENvZGUsXG4gICAgICBzZWxlY3RvcjogQnVmZmVyLmFsbG9jKEVNUFRZX01FU1NBR0VfU0laRSksXG4gICAgICBjb252ZXJzYXRpb25JbmRleDogZGF0YS5jb252ZXJzYXRpb25JbmRleCArIDEsXG4gICAgICBmbGFnczogRkxBR19UWVBFUy5yZXBseVxuICAgIH0pO1xuICAgIHRoaXMuX3NvY2tldENsaWVudC53cml0ZShyZXBseS5idWlsZCgpKTtcbiAgfVxufVxuXG5leHBvcnQgeyBJbnN0cnVtZW50U2VydmljZSwgSU5TVFJVTUVOVF9TRVJWSUNFX05BTUVfVkVSU0lPTl8xNCwgSU5TVFJVTUVOVF9TRVJWSUNFX05BTUUgfTtcbiJdLCJmaWxlIjoibGliL2luc3RydW1lbnQvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==