@shadr/iterm2-ts 0.1.0 → 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/cli.cjs ADDED
@@ -0,0 +1,1115 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var commander = require('commander');
5
+ var protobuf = require('@bufbuild/protobuf');
6
+ var child_process = require('child_process');
7
+ var net = require('net');
8
+ var WebSocket = require('ws');
9
+ var codegenv2 = require('@bufbuild/protobuf/codegenv2');
10
+ var fs = require('fs');
11
+ var os = require('os');
12
+ var path = require('path');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var net__default = /*#__PURE__*/_interopDefault(net);
17
+ var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
18
+
19
+ var cookieArgs = () => ["-e", 'tell application "iTerm2" to request cookie'];
20
+ var cookieAndKeyArgs = (name) => [
21
+ "-e",
22
+ `tell application "iTerm2" to request cookie and key for app named "${name}"`
23
+ ];
24
+ var getAuthCredentials = (appName = "iterm2-ts") => {
25
+ const envCookie = process.env.ITERM2_COOKIE;
26
+ if (envCookie) {
27
+ const envKey = process.env.ITERM2_KEY;
28
+ return { cookie: envCookie, key: envKey ?? void 0 };
29
+ }
30
+ try {
31
+ const result = child_process.execFileSync("osascript", cookieAndKeyArgs(appName), {
32
+ encoding: "utf-8",
33
+ timeout: 5e3
34
+ }).trim();
35
+ const parts = result.split(" ");
36
+ const cookie = parts[0];
37
+ const key = parts[1];
38
+ if (!cookie) {
39
+ throw new Error("Empty cookie from osascript");
40
+ }
41
+ return { cookie, key: key || void 0 };
42
+ } catch {
43
+ try {
44
+ const cookie = child_process.execFileSync("osascript", cookieArgs(), {
45
+ encoding: "utf-8",
46
+ timeout: 5e3
47
+ }).trim();
48
+ if (!cookie) {
49
+ throw new Error("Empty cookie from osascript");
50
+ }
51
+ return { cookie };
52
+ } catch (err) {
53
+ throw new Error(
54
+ `Failed to get iTerm2 auth credentials. Ensure iTerm2 is running and "Enable Python API" is on in Preferences > General > Magic. ${err}`
55
+ );
56
+ }
57
+ }
58
+ };
59
+ var buildHeaders = (advisoryName, disableAuthUi = false) => {
60
+ const creds = getAuthCredentials(advisoryName);
61
+ return {
62
+ origin: "ws://localhost",
63
+ "x-iterm2-library-version": "typescript 0.1.0",
64
+ "x-iterm2-disable-auth-ui": disableAuthUi ? "1" : "0",
65
+ "x-iterm2-advisory-name": advisoryName,
66
+ ...creds.cookie ? { "x-iterm2-cookie": creds.cookie } : {},
67
+ ...creds.key ? { "x-iterm2-key": creds.key } : {}
68
+ };
69
+ };
70
+ var file_api = /* @__PURE__ */ codegenv2.fileDesc("CglhcGkucHJvdG8SBml0ZXJtMiLZEAoXQ2xpZW50T3JpZ2luYXRlZE1lc3NhZ2USCgoCaWQYASABKAMSNgoSZ2V0X2J1ZmZlcl9yZXF1ZXN0GGQgASgLMhguaXRlcm0yLkdldEJ1ZmZlclJlcXVlc3RIABI2ChJnZXRfcHJvbXB0X3JlcXVlc3QYZSABKAsyGC5pdGVybTIuR2V0UHJvbXB0UmVxdWVzdEgAEjkKE3RyYW5zYWN0aW9uX3JlcXVlc3QYZiABKAsyGi5pdGVybTIuVHJhbnNhY3Rpb25SZXF1ZXN0SAASOwoUbm90aWZpY2F0aW9uX3JlcXVlc3QYZyABKAsyGy5pdGVybTIuTm90aWZpY2F0aW9uUmVxdWVzdEgAEjwKFXJlZ2lzdGVyX3Rvb2xfcmVxdWVzdBhoIAEoCzIbLml0ZXJtMi5SZWdpc3RlclRvb2xSZXF1ZXN0SAASSQocc2V0X3Byb2ZpbGVfcHJvcGVydHlfcmVxdWVzdBhpIAEoCzIhLml0ZXJtMi5TZXRQcm9maWxlUHJvcGVydHlSZXF1ZXN0SAASPAoVbGlzdF9zZXNzaW9uc19yZXF1ZXN0GGogASgLMhsuaXRlcm0yLkxpc3RTZXNzaW9uc1JlcXVlc3RIABI0ChFzZW5kX3RleHRfcmVxdWVzdBhrIAEoCzIXLml0ZXJtMi5TZW5kVGV4dFJlcXVlc3RIABI2ChJjcmVhdGVfdGFiX3JlcXVlc3QYbCABKAsyGC5pdGVybTIuQ3JlYXRlVGFiUmVxdWVzdEgAEjYKEnNwbGl0X3BhbmVfcmVxdWVzdBhtIAEoCzIYLml0ZXJtMi5TcGxpdFBhbmVSZXF1ZXN0SAASSQocZ2V0X3Byb2ZpbGVfcHJvcGVydHlfcmVxdWVzdBhuIAEoCzIhLml0ZXJtMi5HZXRQcm9maWxlUHJvcGVydHlSZXF1ZXN0SAASOgoUc2V0X3Byb3BlcnR5X3JlcXVlc3QYbyABKAsyGi5pdGVybTIuU2V0UHJvcGVydHlSZXF1ZXN0SAASOgoUZ2V0X3Byb3BlcnR5X3JlcXVlc3QYcCABKAsyGi5pdGVybTIuR2V0UHJvcGVydHlSZXF1ZXN0SAASLwoOaW5qZWN0X3JlcXVlc3QYcSABKAsyFS5pdGVybTIuSW5qZWN0UmVxdWVzdEgAEjMKEGFjdGl2YXRlX3JlcXVlc3QYciABKAsyFy5pdGVybTIuQWN0aXZhdGVSZXF1ZXN0SAASMwoQdmFyaWFibGVfcmVxdWVzdBhzIAEoCzIXLml0ZXJtMi5WYXJpYWJsZVJlcXVlc3RIABJEChlzYXZlZF9hcnJhbmdlbWVudF9yZXF1ZXN0GHQgASgLMh8uaXRlcm0yLlNhdmVkQXJyYW5nZW1lbnRSZXF1ZXN0SAASLQoNZm9jdXNfcmVxdWVzdBh1IAEoCzIULml0ZXJtMi5Gb2N1c1JlcXVlc3RIABI8ChVsaXN0X3Byb2ZpbGVzX3JlcXVlc3QYdiABKAsyGy5pdGVybTIuTGlzdFByb2ZpbGVzUmVxdWVzdEgAElgKJHNlcnZlcl9vcmlnaW5hdGVkX3JwY19yZXN1bHRfcmVxdWVzdBh3IAEoCzIoLml0ZXJtMi5TZXJ2ZXJPcmlnaW5hdGVkUlBDUmVzdWx0UmVxdWVzdEgAEkAKF3Jlc3RhcnRfc2Vzc2lvbl9yZXF1ZXN0GHggASgLMh0uaXRlcm0yLlJlc3RhcnRTZXNzaW9uUmVxdWVzdEgAEjQKEW1lbnVfaXRlbV9yZXF1ZXN0GHkgASgLMhcuaXRlcm0yLk1lbnVJdGVtUmVxdWVzdEgAEj0KFnNldF90YWJfbGF5b3V0X3JlcXVlc3QYeiABKAsyGy5pdGVybTIuU2V0VGFiTGF5b3V0UmVxdWVzdEgAEksKHWdldF9icm9hZGNhc3RfZG9tYWluc19yZXF1ZXN0GHsgASgLMiIuaXRlcm0yLkdldEJyb2FkY2FzdERvbWFpbnNSZXF1ZXN0SAASKwoMdG11eF9yZXF1ZXN0GHwgASgLMhMuaXRlcm0yLlRtdXhSZXF1ZXN0SAASOgoUcmVvcmRlcl90YWJzX3JlcXVlc3QYfSABKAsyGi5pdGVybTIuUmVvcmRlclRhYnNSZXF1ZXN0SAASOQoTcHJlZmVyZW5jZXNfcmVxdWVzdBh+IAEoCzIaLml0ZXJtMi5QcmVmZXJlbmNlc1JlcXVlc3RIABI6ChRjb2xvcl9wcmVzZXRfcmVxdWVzdBh/IAEoCzIaLml0ZXJtMi5Db2xvclByZXNldFJlcXVlc3RIABI2ChFzZWxlY3Rpb25fcmVxdWVzdBiAASABKAsyGC5pdGVybTIuU2VsZWN0aW9uUmVxdWVzdEgAEkoKHHN0YXR1c19iYXJfY29tcG9uZW50X3JlcXVlc3QYgQEgASgLMiEuaXRlcm0yLlN0YXR1c0JhckNvbXBvbmVudFJlcXVlc3RIABJMCh1zZXRfYnJvYWRjYXN0X2RvbWFpbnNfcmVxdWVzdBiCASABKAsyIi5pdGVybTIuU2V0QnJvYWRjYXN0RG9tYWluc1JlcXVlc3RIABIuCg1jbG9zZV9yZXF1ZXN0GIMBIAEoCzIULml0ZXJtMi5DbG9zZVJlcXVlc3RIABJBChdpbnZva2VfZnVuY3Rpb25fcmVxdWVzdBiEASABKAsyHS5pdGVybTIuSW52b2tlRnVuY3Rpb25SZXF1ZXN0SAASOwoUbGlzdF9wcm9tcHRzX3JlcXVlc3QYhQEgASgLMhouaXRlcm0yLkxpc3RQcm9tcHRzUmVxdWVzdEgAQgwKCnN1Ym1lc3NhZ2Ui3REKF1NlcnZlck9yaWdpbmF0ZWRNZXNzYWdlEgoKAmlkGAEgASgDEg8KBWVycm9yGAIgASgJSAASOAoTZ2V0X2J1ZmZlcl9yZXNwb25zZRhkIAEoCzIZLml0ZXJtMi5HZXRCdWZmZXJSZXNwb25zZUgAEjgKE2dldF9wcm9tcHRfcmVzcG9uc2UYZSABKAsyGS5pdGVybTIuR2V0UHJvbXB0UmVzcG9uc2VIABI7ChR0cmFuc2FjdGlvbl9yZXNwb25zZRhmIAEoCzIbLml0ZXJtMi5UcmFuc2FjdGlvblJlc3BvbnNlSAASPQoVbm90aWZpY2F0aW9uX3Jlc3BvbnNlGGcgASgLMhwuaXRlcm0yLk5vdGlmaWNhdGlvblJlc3BvbnNlSAASPgoWcmVnaXN0ZXJfdG9vbF9yZXNwb25zZRhoIAEoCzIcLml0ZXJtMi5SZWdpc3RlclRvb2xSZXNwb25zZUgAEksKHXNldF9wcm9maWxlX3Byb3BlcnR5X3Jlc3BvbnNlGGkgASgLMiIuaXRlcm0yLlNldFByb2ZpbGVQcm9wZXJ0eVJlc3BvbnNlSAASPgoWbGlzdF9zZXNzaW9uc19yZXNwb25zZRhqIAEoCzIcLml0ZXJtMi5MaXN0U2Vzc2lvbnNSZXNwb25zZUgAEjYKEnNlbmRfdGV4dF9yZXNwb25zZRhrIAEoCzIYLml0ZXJtMi5TZW5kVGV4dFJlc3BvbnNlSAASOAoTY3JlYXRlX3RhYl9yZXNwb25zZRhsIAEoCzIZLml0ZXJtMi5DcmVhdGVUYWJSZXNwb25zZUgAEjgKE3NwbGl0X3BhbmVfcmVzcG9uc2UYbSABKAsyGS5pdGVybTIuU3BsaXRQYW5lUmVzcG9uc2VIABJLCh1nZXRfcHJvZmlsZV9wcm9wZXJ0eV9yZXNwb25zZRhuIAEoCzIiLml0ZXJtMi5HZXRQcm9maWxlUHJvcGVydHlSZXNwb25zZUgAEjwKFXNldF9wcm9wZXJ0eV9yZXNwb25zZRhvIAEoCzIbLml0ZXJtMi5TZXRQcm9wZXJ0eVJlc3BvbnNlSAASPAoVZ2V0X3Byb3BlcnR5X3Jlc3BvbnNlGHAgASgLMhsuaXRlcm0yLkdldFByb3BlcnR5UmVzcG9uc2VIABIxCg9pbmplY3RfcmVzcG9uc2UYcSABKAsyFi5pdGVybTIuSW5qZWN0UmVzcG9uc2VIABI1ChFhY3RpdmF0ZV9yZXNwb25zZRhyIAEoCzIYLml0ZXJtMi5BY3RpdmF0ZVJlc3BvbnNlSAASNQoRdmFyaWFibGVfcmVzcG9uc2UYcyABKAsyGC5pdGVybTIuVmFyaWFibGVSZXNwb25zZUgAEkYKGnNhdmVkX2FycmFuZ2VtZW50X3Jlc3BvbnNlGHQgASgLMiAuaXRlcm0yLlNhdmVkQXJyYW5nZW1lbnRSZXNwb25zZUgAEi8KDmZvY3VzX3Jlc3BvbnNlGHUgASgLMhUuaXRlcm0yLkZvY3VzUmVzcG9uc2VIABI+ChZsaXN0X3Byb2ZpbGVzX3Jlc3BvbnNlGHYgASgLMhwuaXRlcm0yLkxpc3RQcm9maWxlc1Jlc3BvbnNlSAASWgolc2VydmVyX29yaWdpbmF0ZWRfcnBjX3Jlc3VsdF9yZXNwb25zZRh3IAEoCzIpLml0ZXJtMi5TZXJ2ZXJPcmlnaW5hdGVkUlBDUmVzdWx0UmVzcG9uc2VIABJCChhyZXN0YXJ0X3Nlc3Npb25fcmVzcG9uc2UYeCABKAsyHi5pdGVybTIuUmVzdGFydFNlc3Npb25SZXNwb25zZUgAEjYKEm1lbnVfaXRlbV9yZXNwb25zZRh5IAEoCzIYLml0ZXJtMi5NZW51SXRlbVJlc3BvbnNlSAASPwoXc2V0X3RhYl9sYXlvdXRfcmVzcG9uc2UYeiABKAsyHC5pdGVybTIuU2V0VGFiTGF5b3V0UmVzcG9uc2VIABJNCh5nZXRfYnJvYWRjYXN0X2RvbWFpbnNfcmVzcG9uc2UYeyABKAsyIy5pdGVybTIuR2V0QnJvYWRjYXN0RG9tYWluc1Jlc3BvbnNlSAASLQoNdG11eF9yZXNwb25zZRh8IAEoCzIULml0ZXJtMi5UbXV4UmVzcG9uc2VIABI8ChVyZW9yZGVyX3RhYnNfcmVzcG9uc2UYfSABKAsyGy5pdGVybTIuUmVvcmRlclRhYnNSZXNwb25zZUgAEjsKFHByZWZlcmVuY2VzX3Jlc3BvbnNlGH4gASgLMhsuaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2VIABI8ChVjb2xvcl9wcmVzZXRfcmVzcG9uc2UYfyABKAsyGy5pdGVybTIuQ29sb3JQcmVzZXRSZXNwb25zZUgAEjgKEnNlbGVjdGlvbl9yZXNwb25zZRiAASABKAsyGS5pdGVybTIuU2VsZWN0aW9uUmVzcG9uc2VIABJMCh1zdGF0dXNfYmFyX2NvbXBvbmVudF9yZXNwb25zZRiBASABKAsyIi5pdGVybTIuU3RhdHVzQmFyQ29tcG9uZW50UmVzcG9uc2VIABJOCh5zZXRfYnJvYWRjYXN0X2RvbWFpbnNfcmVzcG9uc2UYggEgASgLMiMuaXRlcm0yLlNldEJyb2FkY2FzdERvbWFpbnNSZXNwb25zZUgAEjAKDmNsb3NlX3Jlc3BvbnNlGIMBIAEoCzIVLml0ZXJtMi5DbG9zZVJlc3BvbnNlSAASQwoYaW52b2tlX2Z1bmN0aW9uX3Jlc3BvbnNlGIQBIAEoCzIeLml0ZXJtMi5JbnZva2VGdW5jdGlvblJlc3BvbnNlSAASPQoVbGlzdF9wcm9tcHRzX3Jlc3BvbnNlGIUBIAEoCzIbLml0ZXJtMi5MaXN0UHJvbXB0c1Jlc3BvbnNlSAASLQoMbm90aWZpY2F0aW9uGOgHIAEoCzIULml0ZXJtMi5Ob3RpZmljYXRpb25IAEIMCgpzdWJtZXNzYWdlIs8DChVJbnZva2VGdW5jdGlvblJlcXVlc3QSMAoDdGFiGAEgASgLMiEuaXRlcm0yLkludm9rZUZ1bmN0aW9uUmVxdWVzdC5UYWJIABI4CgdzZXNzaW9uGAIgASgLMiUuaXRlcm0yLkludm9rZUZ1bmN0aW9uUmVxdWVzdC5TZXNzaW9uSAASNgoGd2luZG93GAMgASgLMiQuaXRlcm0yLkludm9rZUZ1bmN0aW9uUmVxdWVzdC5XaW5kb3dIABIwCgNhcHAYBCABKAsyIS5pdGVybTIuSW52b2tlRnVuY3Rpb25SZXF1ZXN0LkFwcEgAEjYKBm1ldGhvZBgHIAEoCzIkLml0ZXJtMi5JbnZva2VGdW5jdGlvblJlcXVlc3QuTWV0aG9kSAASEgoKaW52b2NhdGlvbhgFIAEoCRITCgd0aW1lb3V0GAYgASgBOgItMRoVCgNUYWISDgoGdGFiX2lkGAEgASgJGh0KB1Nlc3Npb24SEgoKc2Vzc2lvbl9pZBgBIAEoCRobCgZXaW5kb3cSEQoJd2luZG93X2lkGAEgASgJGgUKA0FwcBoaCgZNZXRob2QSEAoIcmVjZWl2ZXIYASABKAlCCQoHY29udGV4dCLZAgoWSW52b2tlRnVuY3Rpb25SZXNwb25zZRI1CgVlcnJvchgBIAEoCzIkLml0ZXJtMi5JbnZva2VGdW5jdGlvblJlc3BvbnNlLkVycm9ySAASOQoHc3VjY2VzcxgCIAEoCzImLml0ZXJtMi5JbnZva2VGdW5jdGlvblJlc3BvbnNlLlN1Y2Nlc3NIABpUCgVFcnJvchI1CgZzdGF0dXMYASABKA4yJS5pdGVybTIuSW52b2tlRnVuY3Rpb25SZXNwb25zZS5TdGF0dXMSFAoMZXJyb3JfcmVhc29uGAIgASgJGh4KB1N1Y2Nlc3MSEwoLanNvbl9yZXN1bHQYASABKAkiSAoGU3RhdHVzEgsKB1RJTUVPVVQQARIKCgZGQUlMRUQQAhIVChFSRVFVRVNUX01BTEZPUk1FRBADEg4KCklOVkFMSURfSUQQBEINCgtkaXNwb3NpdGlvbiKtAgoMQ2xvc2VSZXF1ZXN0Ei4KBHRhYnMYASABKAsyHi5pdGVybTIuQ2xvc2VSZXF1ZXN0LkNsb3NlVGFic0gAEjYKCHNlc3Npb25zGAIgASgLMiIuaXRlcm0yLkNsb3NlUmVxdWVzdC5DbG9zZVNlc3Npb25zSAASNAoHd2luZG93cxgDIAEoCzIhLml0ZXJtMi5DbG9zZVJlcXVlc3QuQ2xvc2VXaW5kb3dzSAASDQoFZm9yY2UYBCABKAgaHAoJQ2xvc2VUYWJzEg8KB3RhYl9pZHMYASADKAkaJAoNQ2xvc2VTZXNzaW9ucxITCgtzZXNzaW9uX2lkcxgBIAMoCRoiCgxDbG9zZVdpbmRvd3MSEgoKd2luZG93X2lkcxgBIAMoCUIICgZ0YXJnZXQicwoNQ2xvc2VSZXNwb25zZRIuCghzdGF0dXNlcxgBIAMoDjIcLml0ZXJtMi5DbG9zZVJlc3BvbnNlLlN0YXR1cyIyCgZTdGF0dXMSBgoCT0sQABINCglOT1RfRk9VTkQQARIRCg1VU0VSX0RFQ0xJTkVEEAIiUAoaU2V0QnJvYWRjYXN0RG9tYWluc1JlcXVlc3QSMgoRYnJvYWRjYXN0X2RvbWFpbnMYASADKAsyFy5pdGVybTIuQnJvYWRjYXN0RG9tYWluIscBChtTZXRCcm9hZGNhc3REb21haW5zUmVzcG9uc2USOgoGc3RhdHVzGAEgASgOMiouaXRlcm0yLlNldEJyb2FkY2FzdERvbWFpbnNSZXNwb25zZS5TdGF0dXMibAoGU3RhdHVzEgYKAk9LEAASFQoRU0VTU0lPTl9OT1RfRk9VTkQQARIiCh5CUk9BRENBU1RfRE9NQUlOU19OT1RfRElTSk9JTlQQAhIfChtTRVNTSU9OU19OT1RfSU5fU0FNRV9XSU5ET1cQAyLOAQoZU3RhdHVzQmFyQ29tcG9uZW50UmVxdWVzdBJFCgxvcGVuX3BvcG92ZXIYASABKAsyLS5pdGVybTIuU3RhdHVzQmFyQ29tcG9uZW50UmVxdWVzdC5PcGVuUG9wb3ZlckgAEhIKCmlkZW50aWZpZXIYAiABKAkaSwoLT3BlblBvcG92ZXISEgoKc2Vzc2lvbl9pZBgBIAEoCRIMCgRodG1sGAIgASgJEhoKBHNpemUYAyABKAsyDC5pdGVybTIuU2l6ZUIJCgdyZXF1ZXN0Iq8BChpTdGF0dXNCYXJDb21wb25lbnRSZXNwb25zZRI5CgZzdGF0dXMYASABKA4yKS5pdGVybTIuU3RhdHVzQmFyQ29tcG9uZW50UmVzcG9uc2UuU3RhdHVzIlYKBlN0YXR1cxIGCgJPSxAAEhUKEVNFU1NJT05fTk9UX0ZPVU5EEAESFQoRUkVRVUVTVF9NQUxGT1JNRUQQAhIWChJJTlZBTElEX0lERU5USUZJRVIQAyJdChJXaW5kb3dlZENvb3JkUmFuZ2USJwoLY29vcmRfcmFuZ2UYASABKAsyEi5pdGVybTIuQ29vcmRSYW5nZRIeCgdjb2x1bW5zGAIgASgLMg0uaXRlcm0yLlJhbmdlIooBCgxTdWJTZWxlY3Rpb24SOAoUd2luZG93ZWRfY29vcmRfcmFuZ2UYASABKAsyGi5pdGVybTIuV2luZG93ZWRDb29yZFJhbmdlEi0KDnNlbGVjdGlvbl9tb2RlGAIgASgOMhUuaXRlcm0yLlNlbGVjdGlvbk1vZGUSEQoJY29ubmVjdGVkGAMgASgIIjkKCVNlbGVjdGlvbhIsCg5zdWJfc2VsZWN0aW9ucxgBIAMoCzIULml0ZXJtMi5TdWJTZWxlY3Rpb24itwIKEFNlbGVjdGlvblJlcXVlc3QSTQoVZ2V0X3NlbGVjdGlvbl9yZXF1ZXN0GAEgASgLMiwuaXRlcm0yLlNlbGVjdGlvblJlcXVlc3QuR2V0U2VsZWN0aW9uUmVxdWVzdEgAEk0KFXNldF9zZWxlY3Rpb25fcmVxdWVzdBgCIAEoCzIsLml0ZXJtMi5TZWxlY3Rpb25SZXF1ZXN0LlNldFNlbGVjdGlvblJlcXVlc3RIABopChNHZXRTZWxlY3Rpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkaTwoTU2V0U2VsZWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEiQKCXNlbGVjdGlvbhgCIAEoCzIRLml0ZXJtMi5TZWxlY3Rpb25CCQoHcmVxdWVzdCKcAwoRU2VsZWN0aW9uUmVzcG9uc2USMAoGc3RhdHVzGAEgASgOMiAuaXRlcm0yLlNlbGVjdGlvblJlc3BvbnNlLlN0YXR1cxJQChZnZXRfc2VsZWN0aW9uX3Jlc3BvbnNlGAIgASgLMi4uaXRlcm0yLlNlbGVjdGlvblJlc3BvbnNlLkdldFNlbGVjdGlvblJlc3BvbnNlSAASUAoWc2V0X3NlbGVjdGlvbl9yZXNwb25zZRgDIAEoCzIuLml0ZXJtMi5TZWxlY3Rpb25SZXNwb25zZS5TZXRTZWxlY3Rpb25SZXNwb25zZUgAGjwKFEdldFNlbGVjdGlvblJlc3BvbnNlEiQKCXNlbGVjdGlvbhgCIAEoCzIRLml0ZXJtMi5TZWxlY3Rpb24aFgoUU2V0U2VsZWN0aW9uUmVzcG9uc2UiTwoGU3RhdHVzEgYKAk9LEAASEwoPSU5WQUxJRF9TRVNTSU9OEAESEQoNSU5WQUxJRF9SQU5HRRACEhUKEVJFUVVFU1RfTUFMRk9STUVEEANCCgoIcmVzcG9uc2UixQEKEkNvbG9yUHJlc2V0UmVxdWVzdBI+CgxsaXN0X3ByZXNldHMYASABKAsyJi5pdGVybTIuQ29sb3JQcmVzZXRSZXF1ZXN0Lkxpc3RQcmVzZXRzSAASOgoKZ2V0X3ByZXNldBgCIAEoCzIkLml0ZXJtMi5Db2xvclByZXNldFJlcXVlc3QuR2V0UHJlc2V0SAAaDQoLTGlzdFByZXNldHMaGQoJR2V0UHJlc2V0EgwKBG5hbWUYASABKAlCCQoHcmVxdWVzdCL0AwoTQ29sb3JQcmVzZXRSZXNwb25zZRI/CgxsaXN0X3ByZXNldHMYASABKAsyJy5pdGVybTIuQ29sb3JQcmVzZXRSZXNwb25zZS5MaXN0UHJlc2V0c0gAEjsKCmdldF9wcmVzZXQYAiABKAsyJS5pdGVybTIuQ29sb3JQcmVzZXRSZXNwb25zZS5HZXRQcmVzZXRIABIyCgZzdGF0dXMYAyABKA4yIi5pdGVybTIuQ29sb3JQcmVzZXRSZXNwb25zZS5TdGF0dXMaGwoLTGlzdFByZXNldHMSDAoEbmFtZRgBIAMoCRrCAQoJR2V0UHJlc2V0EkoKDmNvbG9yX3NldHRpbmdzGAEgAygLMjIuaXRlcm0yLkNvbG9yUHJlc2V0UmVzcG9uc2UuR2V0UHJlc2V0LkNvbG9yU2V0dGluZxppCgxDb2xvclNldHRpbmcSCwoDcmVkGAEgASgCEg0KBWdyZWVuGAIgASgCEgwKBGJsdWUYAyABKAISDQoFYWxwaGEYBCABKAISEwoLY29sb3Jfc3BhY2UYBSABKAkSCwoDa2V5GAYgASgJIj0KBlN0YXR1cxIGCgJPSxAAEhQKEFBSRVNFVF9OT1RfRk9VTkQQARIVChFSRVFVRVNUX01BTEZPUk1FRBACQgoKCHJlc3BvbnNlIssEChJQcmVmZXJlbmNlc1JlcXVlc3QSNAoIcmVxdWVzdHMYASADKAsyIi5pdGVybTIuUHJlZmVyZW5jZXNSZXF1ZXN0LlJlcXVlc3Qa/gMKB1JlcXVlc3QSUgoWc2V0X3ByZWZlcmVuY2VfcmVxdWVzdBgBIAEoCzIwLml0ZXJtMi5QcmVmZXJlbmNlc1JlcXVlc3QuUmVxdWVzdC5TZXRQcmVmZXJlbmNlSAASUgoWZ2V0X3ByZWZlcmVuY2VfcmVxdWVzdBgCIAEoCzIwLml0ZXJtMi5QcmVmZXJlbmNlc1JlcXVlc3QuUmVxdWVzdC5HZXRQcmVmZXJlbmNlSAASWwobc2V0X2RlZmF1bHRfcHJvZmlsZV9yZXF1ZXN0GAMgASgLMjQuaXRlcm0yLlByZWZlcmVuY2VzUmVxdWVzdC5SZXF1ZXN0LlNldERlZmF1bHRQcm9maWxlSAASWwobZ2V0X2RlZmF1bHRfcHJvZmlsZV9yZXF1ZXN0GAQgASgLMjQuaXRlcm0yLlByZWZlcmVuY2VzUmVxdWVzdC5SZXF1ZXN0LkdldERlZmF1bHRQcm9maWxlSAAaMAoNU2V0UHJlZmVyZW5jZRILCgNrZXkYASABKAkSEgoKanNvbl92YWx1ZRgCIAEoCRocCg1HZXRQcmVmZXJlbmNlEgsKA2tleRgBIAEoCRohChFTZXREZWZhdWx0UHJvZmlsZRIMCgRndWlkGAEgASgJGhMKEUdldERlZmF1bHRQcm9maWxlQgkKB3JlcXVlc3QivwcKE1ByZWZlcmVuY2VzUmVzcG9uc2USMwoHcmVzdWx0cxgBIAMoCzIiLml0ZXJtMi5QcmVmZXJlbmNlc1Jlc3BvbnNlLlJlc3VsdBryBgoGUmVzdWx0ElUKFHVucmVjb2duaXplZF9yZXF1ZXN0GAEgASgLMjUuaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2UuUmVzdWx0LlVucmVjb2duaXplZFJlc3VsdEgAElcKFXNldF9wcmVmZXJlbmNlX3Jlc3VsdBgCIAEoCzI2Lml0ZXJtMi5QcmVmZXJlbmNlc1Jlc3BvbnNlLlJlc3VsdC5TZXRQcmVmZXJlbmNlUmVzdWx0SAASVwoVZ2V0X3ByZWZlcmVuY2VfcmVzdWx0GAMgASgLMjYuaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2UuUmVzdWx0LkdldFByZWZlcmVuY2VSZXN1bHRIABJgChpzZXRfZGVmYXVsdF9wcm9maWxlX3Jlc3VsdBgEIAEoCzI6Lml0ZXJtMi5QcmVmZXJlbmNlc1Jlc3BvbnNlLlJlc3VsdC5TZXREZWZhdWx0UHJvZmlsZVJlc3VsdEgAEmAKGmdldF9kZWZhdWx0X3Byb2ZpbGVfcmVzdWx0GAUgASgLMjouaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2UuUmVzdWx0LkdldERlZmF1bHRQcm9maWxlUmVzdWx0SAAalwEKE1NldFByZWZlcmVuY2VSZXN1bHQSTQoGc3RhdHVzGAEgASgOMj0uaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2UuUmVzdWx0LlNldFByZWZlcmVuY2VSZXN1bHQuU3RhdHVzIjEKBlN0YXR1cxIGCgJPSxAAEgwKCEJBRF9KU09OEAESEQoNSU5WQUxJRF9WQUxVRRACGikKE0dldFByZWZlcmVuY2VSZXN1bHQSEgoKanNvbl92YWx1ZRgBIAEoCRqMAQoXU2V0RGVmYXVsdFByb2ZpbGVSZXN1bHQSUQoGc3RhdHVzGAEgASgOMkEuaXRlcm0yLlByZWZlcmVuY2VzUmVzcG9uc2UuUmVzdWx0LlNldERlZmF1bHRQcm9maWxlUmVzdWx0LlN0YXR1cyIeCgZTdGF0dXMSBgoCT0sQABIMCghCQURfR1VJRBABGhQKElVucmVjb2duaXplZFJlc3VsdBonChdHZXREZWZhdWx0UHJvZmlsZVJlc3VsdBIMCgRndWlkGAEgASgJQggKBnJlc3VsdCKCAQoSUmVvcmRlclRhYnNSZXF1ZXN0EjoKC2Fzc2lnbm1lbnRzGAMgAygLMiUuaXRlcm0yLlJlb3JkZXJUYWJzUmVxdWVzdC5Bc3NpZ25tZW50GjAKCkFzc2lnbm1lbnQSEQoJd2luZG93X2lkGAEgASgJEg8KB3RhYl9pZHMYAiADKAkingEKE1Jlb3JkZXJUYWJzUmVzcG9uc2USMgoGc3RhdHVzGAQgASgOMiIuaXRlcm0yLlJlb3JkZXJUYWJzUmVzcG9uc2UuU3RhdHVzIlMKBlN0YXR1cxIGCgJPSxAAEhYKEklOVkFMSURfQVNTSUdOTUVOVBABEhUKEUlOVkFMSURfV0lORE9XX0lEEAISEgoOSU5WQUxJRF9UQUJfSUQQAyLjAwoLVG11eFJlcXVlc3QSPwoQbGlzdF9jb25uZWN0aW9ucxgBIAEoCzIjLml0ZXJtMi5UbXV4UmVxdWVzdC5MaXN0Q29ubmVjdGlvbnNIABI3CgxzZW5kX2NvbW1hbmQYAiABKAsyHy5pdGVybTIuVG11eFJlcXVlc3QuU2VuZENvbW1hbmRIABJCChJzZXRfd2luZG93X3Zpc2libGUYAyABKAsyJC5pdGVybTIuVG11eFJlcXVlc3QuU2V0V2luZG93VmlzaWJsZUgAEjkKDWNyZWF0ZV93aW5kb3cYBCABKAsyIC5pdGVybTIuVG11eFJlcXVlc3QuQ3JlYXRlV2luZG93SAAaEQoPTGlzdENvbm5lY3Rpb25zGjUKC1NlbmRDb21tYW5kEhUKDWNvbm5lY3Rpb25faWQYASABKAkSDwoHY29tbWFuZBgCIAEoCRpNChBTZXRXaW5kb3dWaXNpYmxlEhUKDWNvbm5lY3Rpb25faWQYASABKAkSEQoJd2luZG93X2lkGAIgASgJEg8KB3Zpc2libGUYAyABKAgaNwoMQ3JlYXRlV2luZG93EhUKDWNvbm5lY3Rpb25faWQYASABKAkSEAoIYWZmaW5pdHkYAiABKAlCCQoHcGF5bG9hZCKJBQoMVG11eFJlc3BvbnNlEkAKEGxpc3RfY29ubmVjdGlvbnMYASABKAsyJC5pdGVybTIuVG11eFJlc3BvbnNlLkxpc3RDb25uZWN0aW9uc0gAEjgKDHNlbmRfY29tbWFuZBgCIAEoCzIgLml0ZXJtMi5UbXV4UmVzcG9uc2UuU2VuZENvbW1hbmRIABJDChJzZXRfd2luZG93X3Zpc2libGUYAyABKAsyJS5pdGVybTIuVG11eFJlc3BvbnNlLlNldFdpbmRvd1Zpc2libGVIABI6Cg1jcmVhdGVfd2luZG93GAUgASgLMiEuaXRlcm0yLlRtdXhSZXNwb25zZS5DcmVhdGVXaW5kb3dIABIrCgZzdGF0dXMYBCABKA4yGy5pdGVybTIuVG11eFJlc3BvbnNlLlN0YXR1cxqXAQoPTGlzdENvbm5lY3Rpb25zEkQKC2Nvbm5lY3Rpb25zGAEgAygLMi8uaXRlcm0yLlRtdXhSZXNwb25zZS5MaXN0Q29ubmVjdGlvbnMuQ29ubmVjdGlvbho+CgpDb25uZWN0aW9uEhUKDWNvbm5lY3Rpb25faWQYASABKAkSGQoRb3duaW5nX3Nlc3Npb25faWQYAiABKAkaHQoLU2VuZENvbW1hbmQSDgoGb3V0cHV0GAEgASgJGhIKEFNldFdpbmRvd1Zpc2libGUaHgoMQ3JlYXRlV2luZG93Eg4KBnRhYl9pZBgBIAEoCSJXCgZTdGF0dXMSBgoCT0sQABITCg9JTlZBTElEX1JFUVVFU1QQARIZChVJTlZBTElEX0NPTk5FQ1RJT05fSUQQAhIVChFJTlZBTElEX1dJTkRPV19JRBADQgkKB3BheWxvYWQiHAoaR2V0QnJvYWRjYXN0RG9tYWluc1JlcXVlc3QiJgoPQnJvYWRjYXN0RG9tYWluEhMKC3Nlc3Npb25faWRzGAEgAygJIlEKG0dldEJyb2FkY2FzdERvbWFpbnNSZXNwb25zZRIyChFicm9hZGNhc3RfZG9tYWlucxgBIAMoCzIXLml0ZXJtMi5Ccm9hZGNhc3REb21haW4iSgoTU2V0VGFiTGF5b3V0UmVxdWVzdBIjCgRyb290GAEgASgLMhUuaXRlcm0yLlNwbGl0VHJlZU5vZGUSDgoGdGFiX2lkGAIgASgJIo8BChRTZXRUYWJMYXlvdXRSZXNwb25zZRIzCgZzdGF0dXMYASABKA4yIy5pdGVybTIuU2V0VGFiTGF5b3V0UmVzcG9uc2UuU3RhdHVzIkIKBlN0YXR1cxIGCgJPSxAAEg4KCkJBRF9UQUJfSUQQARIOCgpXUk9OR19UUkVFEAISEAoMSU5WQUxJRF9TSVpFEAMiOQoPTWVudUl0ZW1SZXF1ZXN0EhIKCmlkZW50aWZpZXIYASABKAkSEgoKcXVlcnlfb25seRgCIAEoCCKZAQoQTWVudUl0ZW1SZXNwb25zZRIvCgZzdGF0dXMYASABKA4yHy5pdGVybTIuTWVudUl0ZW1SZXNwb25zZS5TdGF0dXMSDwoHY2hlY2tlZBgCIAEoCBIPCgdlbmFibGVkGAMgASgIIjIKBlN0YXR1cxIGCgJPSxAAEhIKDkJBRF9JREVOVElGSUVSEAESDAoIRElTQUJMRUQQAiJDChVSZXN0YXJ0U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIWCg5vbmx5X2lmX2V4aXRlZBgCIAEoCCKVAQoWUmVzdGFydFNlc3Npb25SZXNwb25zZRI1CgZzdGF0dXMYASABKA4yJS5pdGVybTIuUmVzdGFydFNlc3Npb25SZXNwb25zZS5TdGF0dXMiRAoGU3RhdHVzEgYKAk9LEAASFQoRU0VTU0lPTl9OT1RfRk9VTkQQARIbChdTRVNTSU9OX05PVF9SRVNUQVJUQUJMRRACInAKIFNlcnZlck9yaWdpbmF0ZWRSUENSZXN1bHRSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSGAoOanNvbl9leGNlcHRpb24YAiABKAlIABIUCgpqc29uX3ZhbHVlGAMgASgJSABCCAoGcmVzdWx0IiMKIVNlcnZlck9yaWdpbmF0ZWRSUENSZXN1bHRSZXNwb25zZSI4ChNMaXN0UHJvZmlsZXNSZXF1ZXN0EhIKCnByb3BlcnRpZXMYASADKAkSDQoFZ3VpZHMYAiADKAkihgEKFExpc3RQcm9maWxlc1Jlc3BvbnNlEjYKCHByb2ZpbGVzGAEgAygLMiQuaXRlcm0yLkxpc3RQcm9maWxlc1Jlc3BvbnNlLlByb2ZpbGUaNgoHUHJvZmlsZRIrCgpwcm9wZXJ0aWVzGAEgAygLMhcuaXRlcm0yLlByb2ZpbGVQcm9wZXJ0eSIOCgxGb2N1c1JlcXVlc3QiSAoNRm9jdXNSZXNwb25zZRI3Cg1ub3RpZmljYXRpb25zGAEgAygLMiAuaXRlcm0yLkZvY3VzQ2hhbmdlZE5vdGlmaWNhdGlvbiKdAQoXU2F2ZWRBcnJhbmdlbWVudFJlcXVlc3QSDAoEbmFtZRgBIAEoCRI2CgZhY3Rpb24YAiABKA4yJi5pdGVybTIuU2F2ZWRBcnJhbmdlbWVudFJlcXVlc3QuQWN0aW9uEhEKCXdpbmRvd19pZBgDIAEoCSIpCgZBY3Rpb24SCwoHUkVTVE9SRRAAEggKBFNBVkUQARIICgRMSVNUEAIivAEKGFNhdmVkQXJyYW5nZW1lbnRSZXNwb25zZRI3CgZzdGF0dXMYASABKA4yJy5pdGVybTIuU2F2ZWRBcnJhbmdlbWVudFJlc3BvbnNlLlN0YXR1cxINCgVuYW1lcxgCIAMoCSJYCgZTdGF0dXMSBgoCT0sQABIZChVBUlJBTkdFTUVOVF9OT1RfRk9VTkQQARIUChBXSU5ET1dfTk9UX0ZPVU5EEAISFQoRUkVRVUVTVF9NQUxGT1JNRUQQAyLBAQoPVmFyaWFibGVSZXF1ZXN0EhQKCnNlc3Npb25faWQYASABKAlIABIQCgZ0YWJfaWQYBCABKAlIABINCgNhcHAYBSABKAhIABITCgl3aW5kb3dfaWQYBiABKAlIABIoCgNzZXQYAiADKAsyGy5pdGVybTIuVmFyaWFibGVSZXF1ZXN0LlNldBILCgNnZXQYAyADKAkaIgoDU2V0EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAlCBwoFc2NvcGUi5QEKEFZhcmlhYmxlUmVzcG9uc2USLwoGc3RhdHVzGAEgASgOMh8uaXRlcm0yLlZhcmlhYmxlUmVzcG9uc2UuU3RhdHVzEg4KBnZhbHVlcxgCIAMoCSKPAQoGU3RhdHVzEgYKAk9LEAASFQoRU0VTU0lPTl9OT1RfRk9VTkQQARIQCgxJTlZBTElEX05BTUUQAhIRCg1NSVNTSU5HX1NDT1BFEAMSEQoNVEFCX05PVF9GT1VORBAEEhgKFE1VTFRJX0dFVF9ESVNBTExPV0VEEAUSFAoQV0lORE9XX05PVF9GT1VORBAGIpYCCg9BY3RpdmF0ZVJlcXVlc3QSEwoJd2luZG93X2lkGAEgASgJSAASEAoGdGFiX2lkGAIgASgJSAASFAoKc2Vzc2lvbl9pZBgDIAEoCUgAEhoKEm9yZGVyX3dpbmRvd19mcm9udBgEIAEoCBISCgpzZWxlY3RfdGFiGAUgASgIEhYKDnNlbGVjdF9zZXNzaW9uGAYgASgIEjEKDGFjdGl2YXRlX2FwcBgHIAEoCzIbLml0ZXJtMi5BY3RpdmF0ZVJlcXVlc3QuQXBwGj0KA0FwcBIZChFyYWlzZV9hbGxfd2luZG93cxgBIAEoCBIbChNpZ25vcmluZ19vdGhlcl9hcHBzGAIgASgIQgwKCmlkZW50aWZpZXIifQoQQWN0aXZhdGVSZXNwb25zZRIvCgZzdGF0dXMYASABKA4yHy5pdGVybTIuQWN0aXZhdGVSZXNwb25zZS5TdGF0dXMiOAoGU3RhdHVzEgYKAk9LEAASEgoOQkFEX0lERU5USUZJRVIQARISCg5JTlZBTElEX09QVElPThACIjEKDUluamVjdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAMoCRIMCgRkYXRhGAIgASgMImgKDkluamVjdFJlc3BvbnNlEi0KBnN0YXR1cxgBIAMoDjIdLml0ZXJtMi5JbmplY3RSZXNwb25zZS5TdGF0dXMiJwoGU3RhdHVzEgYKAk9LEAASFQoRU0VTU0lPTl9OT1RfRk9VTkQQASJbChJHZXRQcm9wZXJ0eVJlcXVlc3QSEwoJd2luZG93X2lkGAEgASgJSAASFAoKc2Vzc2lvbl9pZBgDIAEoCUgAEgwKBG5hbWUYAiABKAlCDAoKaWRlbnRpZmllciKaAQoTR2V0UHJvcGVydHlSZXNwb25zZRIyCgZzdGF0dXMYASABKA4yIi5pdGVybTIuR2V0UHJvcGVydHlSZXNwb25zZS5TdGF0dXMSEgoKanNvbl92YWx1ZRgCIAEoCSI7CgZTdGF0dXMSBgoCT0sQABIVChFVTlJFQ09HTklaRURfTkFNRRABEhIKDklOVkFMSURfVEFSR0VUEAIibwoSU2V0UHJvcGVydHlSZXF1ZXN0EhMKCXdpbmRvd19pZBgBIAEoCUgAEhQKCnNlc3Npb25faWQYBSABKAlIABIMCgRuYW1lGAMgASgJEhIKCmpzb25fdmFsdWUYBCABKAlCDAoKaWRlbnRpZmllciLDAQoTU2V0UHJvcGVydHlSZXNwb25zZRIyCgZzdGF0dXMYASABKA4yIi5pdGVybTIuU2V0UHJvcGVydHlSZXNwb25zZS5TdGF0dXMieAoGU3RhdHVzEgYKAk9LEAASFQoRVU5SRUNPR05JWkVEX05BTUUQARIRCg1JTlZBTElEX1ZBTFVFEAISEgoOSU5WQUxJRF9UQVJHRVQQAxIMCghERUZFUlJFRBAEEg4KCklNUE9TU0lCTEUQBRIKCgZGQUlMRUQQBiLYAQoTUmVnaXN0ZXJUb29sUmVxdWVzdBIMCgRuYW1lGAEgASgJEhIKCmlkZW50aWZpZXIYAiABKAkSKwoccmV2ZWFsX2lmX2FscmVhZHlfcmVnaXN0ZXJlZBgFIAEoCDoFZmFsc2USRgoJdG9vbF90eXBlGAMgASgOMiQuaXRlcm0yLlJlZ2lzdGVyVG9vbFJlcXVlc3QuVG9vbFR5cGU6DVdFQl9WSUVXX1RPT0wSCwoDVVJMGAQgASgJIh0KCFRvb2xUeXBlEhEKDVdFQl9WSUVXX1RPT0wQASLfDAoWUlBDUmVnaXN0cmF0aW9uUmVxdWVzdBIMCgRuYW1lGAEgASgJEkYKCWFyZ3VtZW50cxgCIAMoCzIzLml0ZXJtMi5SUENSZWdpc3RyYXRpb25SZXF1ZXN0LlJQQ0FyZ3VtZW50U2lnbmF0dXJlEjwKCGRlZmF1bHRzGAQgAygLMiouaXRlcm0yLlJQQ1JlZ2lzdHJhdGlvblJlcXVlc3QuUlBDQXJndW1lbnQSDwoHdGltZW91dBgDIAEoAhI6CgRyb2xlGAUgASgOMiMuaXRlcm0yLlJQQ1JlZ2lzdHJhdGlvblJlcXVlc3QuUm9sZToHR0VORVJJQxJZChhzZXNzaW9uX3RpdGxlX2F0dHJpYnV0ZXMYByABKAsyNS5pdGVybTIuUlBDUmVnaXN0cmF0aW9uUmVxdWVzdC5TZXNzaW9uVGl0bGVBdHRyaWJ1dGVzSAASZgofc3RhdHVzX2Jhcl9jb21wb25lbnRfYXR0cmlidXRlcxgIIAEoCzI7Lml0ZXJtMi5SUENSZWdpc3RyYXRpb25SZXF1ZXN0LlN0YXR1c0JhckNvbXBvbmVudEF0dHJpYnV0ZXNIABJXChdjb250ZXh0X21lbnVfYXR0cmlidXRlcxgJIAEoCzI0Lml0ZXJtMi5SUENSZWdpc3RyYXRpb25SZXF1ZXN0LkNvbnRleHRNZW51QXR0cmlidXRlc0gAEhgKDGRpc3BsYXlfbmFtZRgGIAEoCUICGAEaJAoUUlBDQXJndW1lbnRTaWduYXR1cmUSDAoEbmFtZRgBIAEoCRopCgtSUENBcmd1bWVudBIMCgRuYW1lGAEgASgJEgwKBHBhdGgYAiABKAkaSQoWU2Vzc2lvblRpdGxlQXR0cmlidXRlcxIUCgxkaXNwbGF5X25hbWUYASABKAkSGQoRdW5pcXVlX2lkZW50aWZpZXIYBiABKAka2QUKHFN0YXR1c0JhckNvbXBvbmVudEF0dHJpYnV0ZXMSGQoRc2hvcnRfZGVzY3JpcHRpb24YASABKAkSHAoUZGV0YWlsZWRfZGVzY3JpcHRpb24YAiABKAkSTwoFa25vYnMYAyADKAsyQC5pdGVybTIuUlBDUmVnaXN0cmF0aW9uUmVxdWVzdC5TdGF0dXNCYXJDb21wb25lbnRBdHRyaWJ1dGVzLktub2ISEAoIZXhlbXBsYXIYBCABKAkSFgoOdXBkYXRlX2NhZGVuY2UYBSABKAISGQoRdW5pcXVlX2lkZW50aWZpZXIYBiABKAkSTwoFaWNvbnMYByADKAsyQC5pdGVybTIuUlBDUmVnaXN0cmF0aW9uUmVxdWVzdC5TdGF0dXNCYXJDb21wb25lbnRBdHRyaWJ1dGVzLkljb24SXgoGZm9ybWF0GAggASgOMkIuaXRlcm0yLlJQQ1JlZ2lzdHJhdGlvblJlcXVlc3QuU3RhdHVzQmFyQ29tcG9uZW50QXR0cmlidXRlcy5Gb3JtYXQ6ClBMQUlOX1RFWFQa7wEKBEtub2ISDAoEbmFtZRgBIAEoCRJTCgR0eXBlGAIgASgOMkUuaXRlcm0yLlJQQ1JlZ2lzdHJhdGlvblJlcXVlc3QuU3RhdHVzQmFyQ29tcG9uZW50QXR0cmlidXRlcy5Lbm9iLlR5cGUSEwoLcGxhY2Vob2xkZXIYAyABKAkSGgoSanNvbl9kZWZhdWx0X3ZhbHVlGAQgASgJEgsKA2tleRgFIAEoCSJGCgRUeXBlEgwKCENoZWNrYm94EAESCgoGU3RyaW5nEAISGQoVUG9zaXRpdmVGbG9hdGluZ1BvaW50EAMSCQoFQ29sb3IQBBojCgRJY29uEgwKBGRhdGEYASABKAwSDQoFc2NhbGUYAiABKAIiIgoGRm9ybWF0Eg4KClBMQUlOX1RFWFQQABIICgRIVE1MEAEaSAoVQ29udGV4dE1lbnVBdHRyaWJ1dGVzEhQKDGRpc3BsYXlfbmFtZRgBIAEoCRIZChF1bmlxdWVfaWRlbnRpZmllchgCIAEoCSJSCgRSb2xlEgsKB0dFTkVSSUMQARIRCg1TRVNTSU9OX1RJVExFEAISGAoUU1RBVFVTX0JBUl9DT01QT05FTlQQAxIQCgxDT05URVhUX01FTlUQBEIYChZSb2xlU3BlY2lmaWNBdHRyaWJ1dGVzIosBChRSZWdpc3RlclRvb2xSZXNwb25zZRIzCgZzdGF0dXMYASABKA4yIy5pdGVybTIuUmVnaXN0ZXJUb29sUmVzcG9uc2UuU3RhdHVzIj4KBlN0YXR1cxIGCgJPSxAAEhUKEVJFUVVFU1RfTUFMRk9STUVEEAESFQoRUEVSTUlTU0lPTl9ERU5JRUQQAiK+AQoQS2V5c3Ryb2tlUGF0dGVybhItChJyZXF1aXJlZF9tb2RpZmllcnMYASADKA4yES5pdGVybTIuTW9kaWZpZXJzEi4KE2ZvcmJpZGRlbl9tb2RpZmllcnMYAiADKA4yES5pdGVybTIuTW9kaWZpZXJzEhAKCGtleWNvZGVzGAMgAygFEhIKCmNoYXJhY3RlcnMYBCADKAkSJQodY2hhcmFjdGVyc19pZ25vcmluZ19tb2RpZmllcnMYBSADKAkiZQoXS2V5c3Ryb2tlTW9uaXRvclJlcXVlc3QSOAoScGF0dGVybnNfdG9faWdub3JlGAEgAygLMhguaXRlcm0yLktleXN0cm9rZVBhdHRlcm5CAhgBEhAKCGFkdmFuY2VkGAIgASgIIk4KFktleXN0cm9rZUZpbHRlclJlcXVlc3QSNAoScGF0dGVybnNfdG9faWdub3JlGAEgAygLMhguaXRlcm0yLktleXN0cm9rZVBhdHRlcm4iYAoWVmFyaWFibGVNb25pdG9yUmVxdWVzdBIMCgRuYW1lGAEgASgJEiQKBXNjb3BlGAIgASgOMhUuaXRlcm0yLlZhcmlhYmxlU2NvcGUSEgoKaWRlbnRpZmllchgDIAEoCSIkChRQcm9maWxlQ2hhbmdlUmVxdWVzdBIMCgRndWlkGAEgASgJIkAKFFByb21wdE1vbml0b3JSZXF1ZXN0EigKBW1vZGVzGAEgAygOMhkuaXRlcm0yLlByb21wdE1vbml0b3JNb2RlIo0EChNOb3RpZmljYXRpb25SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSEQoJc3Vic2NyaWJlGAIgASgIEjMKEW5vdGlmaWNhdGlvbl90eXBlGAMgASgOMhguaXRlcm0yLk5vdGlmaWNhdGlvblR5cGUSQgoYcnBjX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0GAQgASgLMh4uaXRlcm0yLlJQQ1JlZ2lzdHJhdGlvblJlcXVlc3RIABJEChlrZXlzdHJva2VfbW9uaXRvcl9yZXF1ZXN0GAUgASgLMh8uaXRlcm0yLktleXN0cm9rZU1vbml0b3JSZXF1ZXN0SAASQgoYdmFyaWFibGVfbW9uaXRvcl9yZXF1ZXN0GAYgASgLMh4uaXRlcm0yLlZhcmlhYmxlTW9uaXRvclJlcXVlc3RIABI+ChZwcm9maWxlX2NoYW5nZV9yZXF1ZXN0GAcgASgLMhwuaXRlcm0yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0SAASQgoYa2V5c3Ryb2tlX2ZpbHRlcl9yZXF1ZXN0GAggASgLMh4uaXRlcm0yLktleXN0cm9rZUZpbHRlclJlcXVlc3RIABI+ChZwcm9tcHRfbW9uaXRvcl9yZXF1ZXN0GAkgASgLMhwuaXRlcm0yLlByb21wdE1vbml0b3JSZXF1ZXN0SABCCwoJYXJndW1lbnRzIvUBChROb3RpZmljYXRpb25SZXNwb25zZRIzCgZzdGF0dXMYASABKA4yIy5pdGVybTIuTm90aWZpY2F0aW9uUmVzcG9uc2UuU3RhdHVzIqcBCgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABEhUKEVJFUVVFU1RfTUFMRk9STUVEEAISEgoOTk9UX1NVQlNDUklCRUQQAxIWChJBTFJFQURZX1NVQlNDUklCRUQQBBIjCh9EVVBMSUNBVEVfU0VSVkVSX09SSUdJTkFURURfUlBDEAUSFgoSSU5WQUxJRF9JREVOVElGSUVSEAYiygcKDE5vdGlmaWNhdGlvbhI9ChZrZXlzdHJva2Vfbm90aWZpY2F0aW9uGAEgASgLMh0uaXRlcm0yLktleXN0cm9rZU5vdGlmaWNhdGlvbhJEChpzY3JlZW5fdXBkYXRlX25vdGlmaWNhdGlvbhgCIAEoCzIgLml0ZXJtMi5TY3JlZW5VcGRhdGVOb3RpZmljYXRpb24SNwoTcHJvbXB0X25vdGlmaWNhdGlvbhgDIAEoCzIaLml0ZXJtMi5Qcm9tcHROb3RpZmljYXRpb24STAocbG9jYXRpb25fY2hhbmdlX25vdGlmaWNhdGlvbhgEIAEoCzIiLml0ZXJtMi5Mb2NhdGlvbkNoYW5nZU5vdGlmaWNhdGlvbkICGAESVQojY3VzdG9tX2VzY2FwZV9zZXF1ZW5jZV9ub3RpZmljYXRpb24YBSABKAsyKC5pdGVybTIuQ3VzdG9tRXNjYXBlU2VxdWVuY2VOb3RpZmljYXRpb24SQAoYbmV3X3Nlc3Npb25fbm90aWZpY2F0aW9uGAYgASgLMh4uaXRlcm0yLk5ld1Nlc3Npb25Ob3RpZmljYXRpb24STAoedGVybWluYXRlX3Nlc3Npb25fbm90aWZpY2F0aW9uGAcgASgLMiQuaXRlcm0yLlRlcm1pbmF0ZVNlc3Npb25Ob3RpZmljYXRpb24SRgobbGF5b3V0X2NoYW5nZWRfbm90aWZpY2F0aW9uGAggASgLMiEuaXRlcm0yLkxheW91dENoYW5nZWROb3RpZmljYXRpb24SRAoaZm9jdXNfY2hhbmdlZF9ub3RpZmljYXRpb24YCSABKAsyIC5pdGVybTIuRm9jdXNDaGFuZ2VkTm90aWZpY2F0aW9uElMKInNlcnZlcl9vcmlnaW5hdGVkX3JwY19ub3RpZmljYXRpb24YCiABKAsyJy5pdGVybTIuU2VydmVyT3JpZ2luYXRlZFJQQ05vdGlmaWNhdGlvbhJOChlicm9hZGNhc3RfZG9tYWluc19jaGFuZ2VkGAsgASgLMisuaXRlcm0yLkJyb2FkY2FzdERvbWFpbnNDaGFuZ2VkTm90aWZpY2F0aW9uEkoKHXZhcmlhYmxlX2NoYW5nZWRfbm90aWZpY2F0aW9uGAwgASgLMiMuaXRlcm0yLlZhcmlhYmxlQ2hhbmdlZE5vdGlmaWNhdGlvbhJIChxwcm9maWxlX2NoYW5nZWRfbm90aWZpY2F0aW9uGA0gASgLMiIuaXRlcm0yLlByb2ZpbGVDaGFuZ2VkTm90aWZpY2F0aW9uIioKGlByb2ZpbGVDaGFuZ2VkTm90aWZpY2F0aW9uEgwKBGd1aWQYASABKAkifQobVmFyaWFibGVDaGFuZ2VkTm90aWZpY2F0aW9uEiQKBXNjb3BlGAEgASgOMhUuaXRlcm0yLlZhcmlhYmxlU2NvcGUSEgoKaWRlbnRpZmllchgCIAEoCRIMCgRuYW1lGAMgASgJEhYKDmpzb25fbmV3X3ZhbHVlGAQgASgJIlkKI0Jyb2FkY2FzdERvbWFpbnNDaGFuZ2VkTm90aWZpY2F0aW9uEjIKEWJyb2FkY2FzdF9kb21haW5zGAEgAygLMhcuaXRlcm0yLkJyb2FkY2FzdERvbWFpbiKQAQoTU2VydmVyT3JpZ2luYXRlZFJQQxIMCgRuYW1lGAIgASgJEjoKCWFyZ3VtZW50cxgDIAMoCzInLml0ZXJtMi5TZXJ2ZXJPcmlnaW5hdGVkUlBDLlJQQ0FyZ3VtZW50Gi8KC1JQQ0FyZ3VtZW50EgwKBG5hbWUYASABKAkSEgoKanNvbl92YWx1ZRgCIAEoCSJfCh9TZXJ2ZXJPcmlnaW5hdGVkUlBDTm90aWZpY2F0aW9uEhIKCnJlcXVlc3RfaWQYASABKAkSKAoDcnBjGAIgASgLMhsuaXRlcm0yLlNlcnZlck9yaWdpbmF0ZWRSUEMihQIKFUtleXN0cm9rZU5vdGlmaWNhdGlvbhISCgpjaGFyYWN0ZXJzGAEgASgJEiMKG2NoYXJhY3RlcnNJZ25vcmluZ01vZGlmaWVycxgCIAEoCRIkCgltb2RpZmllcnMYAyADKA4yES5pdGVybTIuTW9kaWZpZXJzEg8KB2tleUNvZGUYBCABKAUSDwoHc2Vzc2lvbhgFIAEoCRI0CgZhY3Rpb24YBiABKA4yJC5pdGVybTIuS2V5c3Ryb2tlTm90aWZpY2F0aW9uLkFjdGlvbiI1CgZBY3Rpb24SDAoIS0VZX0RPV04QABIKCgZLRVlfVVAQARIRCg1GTEFHU19DSEFOR0VEEAIiKwoYU2NyZWVuVXBkYXRlTm90aWZpY2F0aW9uEg8KB3Nlc3Npb24YASABKAkiWgoYUHJvbXB0Tm90aWZpY2F0aW9uUHJvbXB0EhMKC3BsYWNlaG9sZGVyGAEgASgJEikKBnByb21wdBgCIAEoCzIZLml0ZXJtMi5HZXRQcm9tcHRSZXNwb25zZSIxCh5Qcm9tcHROb3RpZmljYXRpb25Db21tYW5kU3RhcnQSDwoHY29tbWFuZBgBIAEoCSIuChxQcm9tcHROb3RpZmljYXRpb25Db21tYW5kRW5kEg4KBnN0YXR1cxgBIAEoBSL6AQoSUHJvbXB0Tm90aWZpY2F0aW9uEg8KB3Nlc3Npb24YASABKAkSMgoGcHJvbXB0GAIgASgLMiAuaXRlcm0yLlByb21wdE5vdGlmaWNhdGlvblByb21wdEgAEj8KDWNvbW1hbmRfc3RhcnQYAyABKAsyJi5pdGVybTIuUHJvbXB0Tm90aWZpY2F0aW9uQ29tbWFuZFN0YXJ0SAASOwoLY29tbWFuZF9lbmQYBCABKAsyJC5pdGVybTIuUHJvbXB0Tm90aWZpY2F0aW9uQ29tbWFuZEVuZEgAEhgKEHVuaXF1ZV9wcm9tcHRfaWQYBSABKAlCBwoFZXZlbnQiZgoaTG9jYXRpb25DaGFuZ2VOb3RpZmljYXRpb24SEQoJaG9zdF9uYW1lGAEgASgJEhEKCXVzZXJfbmFtZRgCIAEoCRIRCglkaXJlY3RvcnkYAyABKAkSDwoHc2Vzc2lvbhgEIAEoCSJdCiBDdXN0b21Fc2NhcGVTZXF1ZW5jZU5vdGlmaWNhdGlvbhIPCgdzZXNzaW9uGAEgASgJEhcKD3NlbmRlcl9pZGVudGl0eRgCIAEoCRIPCgdwYXlsb2FkGAMgASgJIiwKFk5ld1Nlc3Npb25Ob3RpZmljYXRpb24SEgoKc2Vzc2lvbl9pZBgBIAEoCSKEAwoYRm9jdXNDaGFuZ2VkTm90aWZpY2F0aW9uEhwKEmFwcGxpY2F0aW9uX2FjdGl2ZRgBIAEoCEgAEjkKBndpbmRvdxgCIAEoCzInLml0ZXJtMi5Gb2N1c0NoYW5nZWROb3RpZmljYXRpb24uV2luZG93SAASFgoMc2VsZWN0ZWRfdGFiGAMgASgJSAASEQoHc2Vzc2lvbhgEIAEoCUgAGtoBCgZXaW5kb3cSSwoNd2luZG93X3N0YXR1cxgBIAEoDjI0Lml0ZXJtMi5Gb2N1c0NoYW5nZWROb3RpZmljYXRpb24uV2luZG93LldpbmRvd1N0YXR1cxIRCgl3aW5kb3dfaWQYAiABKAkicAoMV2luZG93U3RhdHVzEh4KGlRFUk1JTkFMX1dJTkRPV19CRUNBTUVfS0VZEAASHgoaVEVSTUlOQUxfV0lORE9XX0lTX0NVUlJFTlQQARIgChxURVJNSU5BTF9XSU5ET1dfUkVTSUdORURfS0VZEAJCBwoFZXZlbnQiMgocVGVybWluYXRlU2Vzc2lvbk5vdGlmaWNhdGlvbhISCgpzZXNzaW9uX2lkGAEgASgJIlkKGUxheW91dENoYW5nZWROb3RpZmljYXRpb24SPAoWbGlzdF9zZXNzaW9uc19yZXNwb25zZRgBIAEoCzIcLml0ZXJtMi5MaXN0U2Vzc2lvbnNSZXNwb25zZSJiChBHZXRCdWZmZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSJQoKbGluZV9yYW5nZRgCIAEoCzIRLml0ZXJtMi5MaW5lUmFuZ2USFgoOaW5jbHVkZV9zdHlsZXMYAyABKAgi6AIKEUdldEJ1ZmZlclJlc3BvbnNlEjQKBnN0YXR1cxgBIAEoDjIgLml0ZXJtMi5HZXRCdWZmZXJSZXNwb25zZS5TdGF0dXM6Ak9LEiAKBXJhbmdlGAIgASgLMg0uaXRlcm0yLlJhbmdlQgIYARImCghjb250ZW50cxgDIAMoCzIULml0ZXJtMi5MaW5lQ29udGVudHMSHQoGY3Vyc29yGAQgASgLMg0uaXRlcm0yLkNvb3JkEiIKFm51bV9saW5lc19hYm92ZV9zY3JlZW4YBSABKANCAhgBEjgKFHdpbmRvd2VkX2Nvb3JkX3JhbmdlGAYgASgLMhouaXRlcm0yLldpbmRvd2VkQ29vcmRSYW5nZSJWCgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABEhYKEklOVkFMSURfTElORV9SQU5HRRACEhUKEVJFUVVFU1RfTUFMRk9STUVEEAMiPQoQR2V0UHJvbXB0UmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhgKEHVuaXF1ZV9wcm9tcHRfaWQYAiABKAki4wMKEUdldFByb21wdFJlc3BvbnNlEjQKBnN0YXR1cxgBIAEoDjIgLml0ZXJtMi5HZXRQcm9tcHRSZXNwb25zZS5TdGF0dXM6Ak9LEigKDHByb21wdF9yYW5nZRgCIAEoCzISLml0ZXJtMi5Db29yZFJhbmdlEikKDWNvbW1hbmRfcmFuZ2UYAyABKAsyEi5pdGVybTIuQ29vcmRSYW5nZRIoCgxvdXRwdXRfcmFuZ2UYBCABKAsyEi5pdGVybTIuQ29vcmRSYW5nZRIZChF3b3JraW5nX2RpcmVjdG9yeRgFIAEoCRIPCgdjb21tYW5kGAYgASgJEjUKDHByb21wdF9zdGF0ZRgHIAEoDjIfLml0ZXJtMi5HZXRQcm9tcHRSZXNwb25zZS5TdGF0ZRITCgtleGl0X3N0YXR1cxgJIAEoDRIYChB1bmlxdWVfcHJvbXB0X2lkGAogASgJIlYKBlN0YXR1cxIGCgJPSxAAEhUKEVNFU1NJT05fTk9UX0ZPVU5EEAESFQoRUkVRVUVTVF9NQUxGT1JNRUQQAhIWChJQUk9NUFRfVU5BVkFJTEFCTEUQAyIvCgVTdGF0ZRILCgdFRElUSU5HEAASCwoHUlVOTklORxABEgwKCEZJTklTSEVEEAIiVgoSTGlzdFByb21wdHNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPZmlyc3RfdW5pcXVlX2lkGAIgASgJEhYKDmxhc3RfdW5pcXVlX2lkGAMgASgJIpABChNMaXN0UHJvbXB0c1Jlc3BvbnNlEjYKBnN0YXR1cxgBIAEoDjIiLml0ZXJtMi5MaXN0UHJvbXB0c1Jlc3BvbnNlLlN0YXR1czoCT0sSGAoQdW5pcXVlX3Byb21wdF9pZBgCIAMoCSInCgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABIjoKGUdldFByb2ZpbGVQcm9wZXJ0eVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIMCgRrZXlzGAIgAygJIjIKD1Byb2ZpbGVQcm9wZXJ0eRILCgNrZXkYASABKAkSEgoKanNvbl92YWx1ZRgCIAEoCSLTAQoaR2V0UHJvZmlsZVByb3BlcnR5UmVzcG9uc2USPQoGc3RhdHVzGAEgASgOMikuaXRlcm0yLkdldFByb2ZpbGVQcm9wZXJ0eVJlc3BvbnNlLlN0YXR1czoCT0sSKwoKcHJvcGVydGllcxgDIAMoCzIXLml0ZXJtMi5Qcm9maWxlUHJvcGVydHkiSQoGU3RhdHVzEgYKAk9LEAASFQoRU0VTU0lPTl9OT1RfRk9VTkQQARIVChFSRVFVRVNUX01BTEZPUk1FRBACEgkKBUVSUk9SEAMipwIKGVNldFByb2ZpbGVQcm9wZXJ0eVJlcXVlc3QSEQoHc2Vzc2lvbhgBIAEoCUgAEj8KCWd1aWRfbGlzdBgCIAEoCzIqLml0ZXJtMi5TZXRQcm9maWxlUHJvcGVydHlSZXF1ZXN0Lkd1aWRMaXN0SAASCwoDa2V5GAMgASgJEhIKCmpzb25fdmFsdWUYBCABKAkSQQoLYXNzaWdubWVudHMYBSADKAsyLC5pdGVybTIuU2V0UHJvZmlsZVByb3BlcnR5UmVxdWVzdC5Bc3NpZ25tZW50GhkKCEd1aWRMaXN0Eg0KBWd1aWRzGAEgAygJGi0KCkFzc2lnbm1lbnQSCwoDa2V5GAEgASgJEhIKCmpzb25fdmFsdWUYAiABKAlCCAoGdGFyZ2V0IqkBChpTZXRQcm9maWxlUHJvcGVydHlSZXNwb25zZRI9CgZzdGF0dXMYASABKA4yKS5pdGVybTIuU2V0UHJvZmlsZVByb3BlcnR5UmVzcG9uc2UuU3RhdHVzOgJPSyJMCgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABEhUKEVJFUVVFU1RfTUFMRk9STUVEEAISDAoIQkFEX0dVSUQQAyIjChJUcmFuc2FjdGlvblJlcXVlc3QSDQoFYmVnaW4YASABKAgijwEKE1RyYW5zYWN0aW9uUmVzcG9uc2USNgoGc3RhdHVzGAEgASgOMiIuaXRlcm0yLlRyYW5zYWN0aW9uUmVzcG9uc2UuU3RhdHVzOgJPSyJACgZTdGF0dXMSBgoCT0sQABISCg5OT19UUkFOU0FDVElPThABEhoKFkFMUkVBRFlfSU5fVFJBTlNBQ1RJT04QAiJ7CglMaW5lUmFuZ2USHAoUc2NyZWVuX2NvbnRlbnRzX29ubHkYASABKAgSFgoOdHJhaWxpbmdfbGluZXMYAiABKAUSOAoUd2luZG93ZWRfY29vcmRfcmFuZ2UYAyABKAsyGi5pdGVybTIuV2luZG93ZWRDb29yZFJhbmdlIikKBVJhbmdlEhAKCGxvY2F0aW9uGAEgASgDEg4KBmxlbmd0aBgCIAEoAyJGCgpDb29yZFJhbmdlEhwKBXN0YXJ0GAEgASgLMg0uaXRlcm0yLkNvb3JkEhoKA2VuZBgCIAEoCzINLml0ZXJtMi5Db29yZCIdCgVDb29yZBIJCgF4GAEgASgFEgkKAXkYAiABKAMiNAoIUkdCQ29sb3ISCwoDcmVkGAEgASgNEg0KBWdyZWVuGAIgASgNEgwKBGJsdWUYAyABKA0iJgoDVVJMEgsKA3VybBgBIAEoCRISCgppZGVudGlmaWVyGAIgASgJIuEECglDZWxsU3R5bGUSFAoKZmdTdGFuZGFyZBgBIAEoDUgAEi0KC2ZnQWx0ZXJuYXRlGAIgASgOMhYuaXRlcm0yLkFsdGVybmF0ZUNvbG9ySAASIQoFZmdSZ2IYAyABKAsyEC5pdGVybTIuUkdCQ29sb3JIABIfChVmZ0FsdGVybmF0ZVBsYWNlbWVudFgYBCABKA1IABIUCgpiZ1N0YW5kYXJkGAUgASgNSAESLQoLYmdBbHRlcm5hdGUYBiABKA4yFi5pdGVybTIuQWx0ZXJuYXRlQ29sb3JIARIhCgViZ1JnYhgHIAEoCzIQLml0ZXJtMi5SR0JDb2xvckgBEh8KFWJnQWx0ZXJuYXRlUGxhY2VtZW50WRgIIAEoDUgBEgwKBGJvbGQYCSABKAgSDQoFZmFpbnQYCiABKAgSDgoGaXRhbGljGAsgASgIEg0KBWJsaW5rGAwgASgIEhEKCXVuZGVybGluZRgNIAEoCBIVCg1zdHJpa2V0aHJvdWdoGA4gASgIEhEKCWludmlzaWJsZRgPIAEoCBIPCgdpbnZlcnNlGBAgASgIEg8KB2d1YXJkZWQYESABKAgSKwoFaW1hZ2UYEiABKA4yHC5pdGVybTIuSW1hZ2VQbGFjZWhvbGRlclR5cGUSKAoOdW5kZXJsaW5lQ29sb3IYEyABKAsyEC5pdGVybTIuUkdCQ29sb3ISDwoHYmxvY2tJRBgUIAEoCRIYCgN1cmwYFSABKAsyCy5pdGVybTIuVVJMEg8KB3JlcGVhdHMYFiABKA1CCQoHZmdDb2xvckIJCgdiZ0NvbG9yIo0CCgxMaW5lQ29udGVudHMSDAoEdGV4dBgBIAEoCRI3ChRjb2RlX3BvaW50c19wZXJfY2VsbBgCIAMoCzIZLml0ZXJtMi5Db2RlUG9pbnRzUGVyQ2VsbBJOCgxjb250aW51YXRpb24YAyABKA4yIS5pdGVybTIuTGluZUNvbnRlbnRzLkNvbnRpbnVhdGlvbjoVQ09OVElOVUFUSU9OX0hBUkRfRU9MEiAKBXN0eWxlGAQgAygLMhEuaXRlcm0yLkNlbGxTdHlsZSJECgxDb250aW51YXRpb24SGQoVQ09OVElOVUFUSU9OX0hBUkRfRU9MEAESGQoVQ09OVElOVUFUSU9OX1NPRlRfRU9MEAIiQAoRQ29kZVBvaW50c1BlckNlbGwSGgoPbnVtX2NvZGVfcG9pbnRzGAEgASgFOgExEg8KB3JlcGVhdHMYAiABKAUiFQoTTGlzdFNlc3Npb25zUmVxdWVzdCJMCg9TZW5kVGV4dFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIMCgR0ZXh0GAIgASgJEhoKEnN1cHByZXNzX2Jyb2FkY2FzdBgDIAEoCCJsChBTZW5kVGV4dFJlc3BvbnNlEi8KBnN0YXR1cxgBIAEoDjIfLml0ZXJtMi5TZW5kVGV4dFJlc3BvbnNlLlN0YXR1cyInCgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABIiUKBFNpemUSDQoFd2lkdGgYASABKAUSDgoGaGVpZ2h0GAIgASgFIh0KBVBvaW50EgkKAXgYASABKAUSCQoBeRgCIAEoBSJCCgVGcmFtZRIdCgZvcmlnaW4YASABKAsyDS5pdGVybTIuUG9pbnQSGgoEc2l6ZRgCIAEoCzIMLml0ZXJtMi5TaXplInkKDlNlc3Npb25TdW1tYXJ5EhkKEXVuaXF1ZV9pZGVudGlmaWVyGAEgASgJEhwKBWZyYW1lGAIgASgLMg0uaXRlcm0yLkZyYW1lEh8KCWdyaWRfc2l6ZRgDIAEoCzIMLml0ZXJtMi5TaXplEg0KBXRpdGxlGAQgASgJIsEBCg1TcGxpdFRyZWVOb2RlEhAKCHZlcnRpY2FsGAEgASgIEjIKBWxpbmtzGAIgAygLMiMuaXRlcm0yLlNwbGl0VHJlZU5vZGUuU3BsaXRUcmVlTGluaxpqCg1TcGxpdFRyZWVMaW5rEikKB3Nlc3Npb24YASABKAsyFi5pdGVybTIuU2Vzc2lvblN1bW1hcnlIABIlCgRub2RlGAIgASgLMhUuaXRlcm0yLlNwbGl0VHJlZU5vZGVIAEIHCgVjaGlsZCKdAwoUTGlzdFNlc3Npb25zUmVzcG9uc2USNAoHd2luZG93cxgBIAMoCzIjLml0ZXJtMi5MaXN0U2Vzc2lvbnNSZXNwb25zZS5XaW5kb3cSLwoPYnVyaWVkX3Nlc3Npb25zGAIgAygLMhYuaXRlcm0yLlNlc3Npb25TdW1tYXJ5GnkKBldpbmRvdxIuCgR0YWJzGAEgAygLMiAuaXRlcm0yLkxpc3RTZXNzaW9uc1Jlc3BvbnNlLlRhYhIRCgl3aW5kb3dfaWQYAiABKAkSHAoFZnJhbWUYAyABKAsyDS5pdGVybTIuRnJhbWUSDgoGbnVtYmVyGAQgASgFGqIBCgNUYWISIwoEcm9vdBgDIAEoCzIVLml0ZXJtMi5TcGxpdFRyZWVOb2RlEg4KBnRhYl9pZBgCIAEoCRIWCg50bXV4X3dpbmRvd19pZBgEIAEoCRIaChJ0bXV4X2Nvbm5lY3Rpb25faWQYBSABKAkSMgoSbWluaW1pemVkX3Nlc3Npb25zGAYgAygLMhYuaXRlcm0yLlNlc3Npb25TdW1tYXJ5Ip8BChBDcmVhdGVUYWJSZXF1ZXN0EhQKDHByb2ZpbGVfbmFtZRgBIAEoCRIRCgl3aW5kb3dfaWQYAiABKAkSEQoJdGFiX2luZGV4GAMgASgNEhMKB2NvbW1hbmQYBCABKAlCAhgBEjoKGWN1c3RvbV9wcm9maWxlX3Byb3BlcnRpZXMYBSADKAsyFy5pdGVybTIuUHJvZmlsZVByb3BlcnR5IvABChFDcmVhdGVUYWJSZXNwb25zZRIwCgZzdGF0dXMYASABKA4yIC5pdGVybTIuQ3JlYXRlVGFiUmVzcG9uc2UuU3RhdHVzEhEKCXdpbmRvd19pZBgCIAEoCRIOCgZ0YWJfaWQYAyABKAUSEgoKc2Vzc2lvbl9pZBgEIAEoCSJyCgZTdGF0dXMSBgoCT0sQABIYChRJTlZBTElEX1BST0ZJTEVfTkFNRRABEhUKEUlOVkFMSURfV0lORE9XX0lEEAISFQoRSU5WQUxJRF9UQUJfSU5ERVgQAxIYChRNSVNTSU5HX1NVQlNUSVRVVElPThAEIv4BChBTcGxpdFBhbmVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSQAoPc3BsaXRfZGlyZWN0aW9uGAIgASgOMicuaXRlcm0yLlNwbGl0UGFuZVJlcXVlc3QuU3BsaXREaXJlY3Rpb24SFQoGYmVmb3JlGAMgASgIOgVmYWxzZRIUCgxwcm9maWxlX25hbWUYBCABKAkSOgoZY3VzdG9tX3Byb2ZpbGVfcHJvcGVydGllcxgFIAMoCzIXLml0ZXJtMi5Qcm9maWxlUHJvcGVydHkiLgoOU3BsaXREaXJlY3Rpb24SDAoIVkVSVElDQUwQABIOCgpIT1JJWk9OVEFMEAEi1QEKEVNwbGl0UGFuZVJlc3BvbnNlEjAKBnN0YXR1cxgBIAEoDjIgLml0ZXJtMi5TcGxpdFBhbmVSZXNwb25zZS5TdGF0dXMSEgoKc2Vzc2lvbl9pZBgCIAMoCSJ6CgZTdGF0dXMSBgoCT0sQABIVChFTRVNTSU9OX05PVF9GT1VORBABEhgKFElOVkFMSURfUFJPRklMRV9OQU1FEAISEAoMQ0FOTk9UX1NQTElUEAMSJQohTUFMRk9STUVEX0NVU1RPTV9QUk9GSUxFX1BST1BFUlRZEAQqVgoNU2VsZWN0aW9uTW9kZRINCglDSEFSQUNURVIQABIICgRXT1JEEAESCAoETElORRACEgkKBVNNQVJUEAMSBwoDQk9YEAQSDgoKV0hPTEVfTElORRAFKrQDChBOb3RpZmljYXRpb25UeXBlEhcKE05PVElGWV9PTl9LRVlTVFJPS0UQARIbChdOT1RJRllfT05fU0NSRUVOX1VQREFURRACEhQKEE5PVElGWV9PTl9QUk9NUFQQAxIhChlOT1RJRllfT05fTE9DQVRJT05fQ0hBTkdFEAQaAggBEiQKIE5PVElGWV9PTl9DVVNUT01fRVNDQVBFX1NFUVVFTkNFEAUSHQoZTk9USUZZX09OX1ZBUklBQkxFX0NIQU5HRRAMEhQKEEtFWVNUUk9LRV9GSUxURVIQDhIZChVOT1RJRllfT05fTkVXX1NFU1NJT04QBhIfChtOT1RJRllfT05fVEVSTUlOQVRFX1NFU1NJT04QBxIbChdOT1RJRllfT05fTEFZT1VUX0NIQU5HRRAIEhoKFk5PVElGWV9PTl9GT0NVU19DSEFOR0UQCRIjCh9OT1RJRllfT05fU0VSVkVSX09SSUdJTkFURURfUlBDEAoSHgoaTk9USUZZX09OX0JST0FEQ0FTVF9DSEFOR0UQCxIcChhOT1RJRllfT05fUFJPRklMRV9DSEFOR0UQDSpWCglNb2RpZmllcnMSCwoHQ09OVFJPTBABEgoKBk9QVElPThACEgsKB0NPTU1BTkQQAxIJCgVTSElGVBAEEgwKCEZVTkNUSU9OEAUSCgoGTlVNUEFEEAYqOgoNVmFyaWFibGVTY29wZRILCgdTRVNTSU9OEAESBwoDVEFCEAISCgoGV0lORE9XEAMSBwoDQVBQEAQqQwoRUHJvbXB0TW9uaXRvck1vZGUSCgoGUFJPTVBUEAESEQoNQ09NTUFORF9TVEFSVBACEg8KC0NPTU1BTkRfRU5EEAMqRwoOQWx0ZXJuYXRlQ29sb3ISCwoHREVGQVVMVBAAEhQKEFJFVkVSU0VEX0RFRkFVTFQQAxISCg5TWVNURU1fTUVTU0FHRRAEKjcKFEltYWdlUGxhY2Vob2xkZXJUeXBlEggKBE5PTkUQABIKCgZJVEVSTTIQARIJCgVLSVRUWRACQgaiAgNJVE0");
71
+ var ClientOriginatedMessageSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 0);
72
+ var ServerOriginatedMessageSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 1);
73
+ var CloseRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 4);
74
+ var CloseRequest_CloseTabsSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 4, 0);
75
+ var CloseRequest_CloseSessionsSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 4, 1);
76
+ var CloseRequest_CloseWindowsSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 4, 2);
77
+ var RestartSessionRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 30);
78
+ var ListProfilesRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 34);
79
+ var FocusRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 36);
80
+ var VariableRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 40);
81
+ var VariableRequest_SetSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 40, 0);
82
+ var ActivateRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 42);
83
+ var InjectRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 44);
84
+ var GetPropertyRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 46);
85
+ var SetPropertyRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 48);
86
+ var NotificationRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 59);
87
+ var GetBufferRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 79);
88
+ var GetProfilePropertyRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 85);
89
+ var SetProfilePropertyRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 88);
90
+ var LineRangeSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 92);
91
+ var ListSessionsRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 101);
92
+ var SendTextRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 102);
93
+ var CreateTabRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 110);
94
+ var SplitPaneRequestSchema = /* @__PURE__ */ codegenv2.messageDesc(file_api, 112);
95
+ var UNIX_SOCKET_PATH = path.join(
96
+ os.homedir(),
97
+ "Library",
98
+ "Application Support",
99
+ "iTerm2",
100
+ "private",
101
+ "socket"
102
+ );
103
+ var TCP_URL = "ws://localhost:1912";
104
+ var resolveTransport = () => {
105
+ if (fs.existsSync(UNIX_SOCKET_PATH)) {
106
+ return {
107
+ url: "ws://localhost",
108
+ socketPath: UNIX_SOCKET_PATH
109
+ };
110
+ }
111
+ return { url: TCP_URL };
112
+ };
113
+
114
+ // src/connection/connection.ts
115
+ var Connection = class _Connection {
116
+ ws = null;
117
+ nextId = 1;
118
+ pending = /* @__PURE__ */ new Map();
119
+ notificationHandlers = /* @__PURE__ */ new Set();
120
+ closed = false;
121
+ static async create(options = {}) {
122
+ const conn = new _Connection();
123
+ await conn.connect(options);
124
+ return conn;
125
+ }
126
+ async connect(options) {
127
+ const transport = options.transport ?? resolveTransport();
128
+ const headers = options.headers ?? buildHeaders(options.advisoryName ?? "iterm2-ts", options.disableAuthUi);
129
+ return new Promise((resolve, reject) => {
130
+ const { socketPath } = transport;
131
+ const wsOptions = {
132
+ headers: { ...headers },
133
+ ...socketPath ? { createConnection: () => net__default.default.connect(socketPath) } : {}
134
+ };
135
+ this.ws = new WebSocket__default.default(transport.url, ["api.iterm2.com"], wsOptions);
136
+ this.ws.binaryType = "nodebuffer";
137
+ this.ws.on("open", () => resolve());
138
+ this.ws.on("error", (err) => {
139
+ if (!this.ws || this.ws.readyState === WebSocket__default.default.CONNECTING) {
140
+ reject(err);
141
+ }
142
+ this.rejectAllPending(err);
143
+ });
144
+ this.ws.on("close", () => {
145
+ this.closed = true;
146
+ this.rejectAllPending(new Error("Connection closed"));
147
+ });
148
+ this.ws.on("message", (data) => {
149
+ this.handleMessage(data);
150
+ });
151
+ });
152
+ }
153
+ send(submessage) {
154
+ if (this.closed || !this.ws) {
155
+ return Promise.reject(new Error("Connection is closed"));
156
+ }
157
+ const id = this.nextId++;
158
+ const request = protobuf.create(ClientOriginatedMessageSchema, {
159
+ id: BigInt(id),
160
+ submessage
161
+ });
162
+ const encoded = protobuf.toBinary(ClientOriginatedMessageSchema, request);
163
+ this.ws.send(encoded);
164
+ return new Promise((resolve, reject) => {
165
+ this.pending.set(id, { resolve, reject });
166
+ });
167
+ }
168
+ onNotification(handler) {
169
+ this.notificationHandlers.add(handler);
170
+ return () => {
171
+ this.notificationHandlers.delete(handler);
172
+ };
173
+ }
174
+ close() {
175
+ this.closed = true;
176
+ if (this.ws) {
177
+ this.ws.close();
178
+ this.ws = null;
179
+ }
180
+ this.rejectAllPending(new Error("Connection closed by client"));
181
+ }
182
+ get isConnected() {
183
+ return !this.closed && this.ws?.readyState === WebSocket__default.default.OPEN;
184
+ }
185
+ handleMessage(data) {
186
+ const message = protobuf.fromBinary(ServerOriginatedMessageSchema, new Uint8Array(data));
187
+ if (message.submessage.case === "notification") {
188
+ for (const handler of this.notificationHandlers) {
189
+ handler(message.submessage.value);
190
+ }
191
+ return;
192
+ }
193
+ const id = message.id;
194
+ if (id === 0n) return;
195
+ const idNum = Number(id);
196
+ const pending = this.pending.get(idNum);
197
+ if (pending) {
198
+ this.pending.delete(idNum);
199
+ if (message.submessage.case === "error") {
200
+ pending.reject(new Error(`iTerm2 error: ${message.submessage.value}`));
201
+ } else {
202
+ pending.resolve(message);
203
+ }
204
+ }
205
+ }
206
+ rejectAllPending(err) {
207
+ const error = err instanceof Error ? err : new Error(String(err));
208
+ for (const [id, pending] of this.pending) {
209
+ pending.reject(error);
210
+ this.pending.delete(id);
211
+ }
212
+ }
213
+ };
214
+
215
+ // src/events/emitter.ts
216
+ var TypedEmitter = class {
217
+ handlers = /* @__PURE__ */ new Map();
218
+ on(event, handler) {
219
+ let set = this.handlers.get(event);
220
+ if (!set) {
221
+ set = /* @__PURE__ */ new Set();
222
+ this.handlers.set(event, set);
223
+ }
224
+ set.add(handler);
225
+ return () => this.off(event, handler);
226
+ }
227
+ off(event, handler) {
228
+ const set = this.handlers.get(event);
229
+ if (set) {
230
+ set.delete(handler);
231
+ if (set.size === 0) {
232
+ this.handlers.delete(event);
233
+ }
234
+ }
235
+ }
236
+ emit(event, data) {
237
+ const set = this.handlers.get(event);
238
+ if (set) {
239
+ for (const handler of set) {
240
+ handler(data);
241
+ }
242
+ }
243
+ }
244
+ hasListeners(event) {
245
+ return (this.handlers.get(event)?.size ?? 0) > 0;
246
+ }
247
+ removeAllListeners() {
248
+ this.handlers.clear();
249
+ }
250
+ };
251
+ var NOTIFICATION_MAPPINGS = [
252
+ ["newSessionNotification", "sessionCreated"],
253
+ ["terminateSessionNotification", "sessionTerminated"],
254
+ ["layoutChangedNotification", "layoutChanged"],
255
+ ["focusChangedNotification", "focusChanged"],
256
+ ["screenUpdateNotification", "screenUpdated"],
257
+ ["keystrokeNotification", "keystroke"],
258
+ ["customEscapeSequenceNotification", "customEscapeSequence"],
259
+ ["variableChangedNotification", "variableChanged"],
260
+ ["profileChangedNotification", "profileChanged"],
261
+ ["broadcastDomainsChanged", "broadcastDomainsChanged"],
262
+ ["promptNotification", "prompt"]
263
+ ];
264
+ var dispatchNotification = (emitter, notification) => {
265
+ for (const [key, event] of NOTIFICATION_MAPPINGS) {
266
+ const value = notification[key];
267
+ if (value) {
268
+ emitter.emit(event, value);
269
+ }
270
+ }
271
+ };
272
+
273
+ // src/events/iterator.ts
274
+ var createAsyncIterator = (emitter, event) => {
275
+ const buffer = [];
276
+ let resolve = null;
277
+ let done = false;
278
+ const handler = (data) => {
279
+ if (resolve) {
280
+ const r = resolve;
281
+ resolve = null;
282
+ r({ value: data, done: false });
283
+ } else {
284
+ buffer.push(data);
285
+ }
286
+ };
287
+ const cleanup = emitter.on(event, handler);
288
+ return {
289
+ next() {
290
+ if (done) {
291
+ return Promise.resolve({ value: void 0, done: true });
292
+ }
293
+ const buffered = buffer.shift();
294
+ if (buffered !== void 0) {
295
+ return Promise.resolve({ value: buffered, done: false });
296
+ }
297
+ return new Promise((r) => {
298
+ resolve = r;
299
+ });
300
+ },
301
+ return() {
302
+ done = true;
303
+ cleanup();
304
+ if (resolve) {
305
+ resolve({ value: void 0, done: true });
306
+ resolve = null;
307
+ }
308
+ return Promise.resolve({ value: void 0, done: true });
309
+ },
310
+ [Symbol.asyncIterator]() {
311
+ return this;
312
+ }
313
+ };
314
+ };
315
+ var EVENT_TO_NOTIFICATION_TYPE = {
316
+ sessionCreated: 6 /* NOTIFY_ON_NEW_SESSION */,
317
+ sessionTerminated: 7 /* NOTIFY_ON_TERMINATE_SESSION */,
318
+ layoutChanged: 8 /* NOTIFY_ON_LAYOUT_CHANGE */,
319
+ focusChanged: 9 /* NOTIFY_ON_FOCUS_CHANGE */,
320
+ screenUpdated: 2 /* NOTIFY_ON_SCREEN_UPDATE */,
321
+ keystroke: 1 /* NOTIFY_ON_KEYSTROKE */,
322
+ customEscapeSequence: 5 /* NOTIFY_ON_CUSTOM_ESCAPE_SEQUENCE */,
323
+ variableChanged: 12 /* NOTIFY_ON_VARIABLE_CHANGE */,
324
+ profileChanged: 13 /* NOTIFY_ON_PROFILE_CHANGE */,
325
+ broadcastDomainsChanged: 11 /* NOTIFY_ON_BROADCAST_CHANGE */,
326
+ prompt: 3 /* NOTIFY_ON_PROMPT */
327
+ };
328
+ var subscribe = async (conn, event, sessionId) => {
329
+ const notificationType = EVENT_TO_NOTIFICATION_TYPE[event];
330
+ const response = await conn.send({
331
+ case: "notificationRequest",
332
+ value: protobuf.create(NotificationRequestSchema, {
333
+ subscribe: true,
334
+ notificationType,
335
+ session: sessionId
336
+ })
337
+ });
338
+ if (response.submessage.case === "notificationResponse") {
339
+ const status = response.submessage.value.status;
340
+ if (status !== 0 /* OK */ && status !== 4 /* ALREADY_SUBSCRIBED */) {
341
+ throw new Error(`subscribe to ${event} failed: status ${status}`);
342
+ }
343
+ }
344
+ };
345
+ var unsubscribe = async (conn, event, sessionId) => {
346
+ const notificationType = EVENT_TO_NOTIFICATION_TYPE[event];
347
+ const response = await conn.send({
348
+ case: "notificationRequest",
349
+ value: protobuf.create(NotificationRequestSchema, {
350
+ subscribe: false,
351
+ notificationType,
352
+ session: sessionId
353
+ })
354
+ });
355
+ if (response.submessage.case === "notificationResponse") {
356
+ const status = response.submessage.value.status;
357
+ if (status !== 0 /* OK */ && status !== 3 /* NOT_SUBSCRIBED */) {
358
+ throw new Error(`unsubscribe from ${event} failed: status ${status}`);
359
+ }
360
+ }
361
+ };
362
+
363
+ // src/models/common.ts
364
+ var pointFromProto = (p) => ({
365
+ x: p?.x ?? 0,
366
+ y: p?.y ?? 0
367
+ });
368
+ var sizeFromProto = (s) => ({
369
+ width: s?.width ?? 0,
370
+ height: s?.height ?? 0
371
+ });
372
+ var frameFromProto = (f) => ({
373
+ origin: pointFromProto(f?.origin),
374
+ size: sizeFromProto(f?.size)
375
+ });
376
+ var profilePropertyFromProto = (p) => ({
377
+ key: p.key ?? "",
378
+ value: p.jsonValue ? JSON.parse(p.jsonValue) : null
379
+ });
380
+
381
+ // src/models/session.ts
382
+ var sessionFromProto = (s) => ({
383
+ id: s.uniqueIdentifier ?? "",
384
+ name: s.title ?? "",
385
+ frame: s.frame ? frameFromProto(s.frame) : void 0,
386
+ gridSize: s.gridSize ? sizeFromProto(s.gridSize) : void 0
387
+ });
388
+
389
+ // src/models/tab.ts
390
+ var collectSessions = (node) => {
391
+ if (!node?.links) return [];
392
+ const sessions = [];
393
+ for (const link of node.links) {
394
+ if (link.child.case === "session") {
395
+ sessions.push(sessionFromProto(link.child.value));
396
+ }
397
+ if (link.child.case === "node") {
398
+ sessions.push(...collectSessions(link.child.value));
399
+ }
400
+ }
401
+ return sessions;
402
+ };
403
+ var tabFromProto = (t) => ({
404
+ id: t.tabId ?? "",
405
+ sessions: collectSessions(t.root)
406
+ });
407
+
408
+ // src/models/window.ts
409
+ var windowFromProto = (w) => ({
410
+ id: w.windowId ?? "",
411
+ tabs: (w.tabs ?? []).map(tabFromProto),
412
+ frame: w.frame ? frameFromProto(w.frame) : void 0,
413
+ number: w.number ?? void 0
414
+ });
415
+
416
+ // src/models/app.ts
417
+ var appFromProto = (response) => ({
418
+ windows: (response.windows ?? []).map(windowFromProto),
419
+ buriedSessions: (response.buriedSessions ?? []).map(sessionFromProto)
420
+ });
421
+ var listProfiles = async (conn, properties, guids) => {
422
+ const response = await conn.send({
423
+ case: "listProfilesRequest",
424
+ value: protobuf.create(ListProfilesRequestSchema, {
425
+ properties: properties ? [...properties] : [],
426
+ guids: guids ? [...guids] : []
427
+ })
428
+ });
429
+ if (response.submessage.case !== "listProfilesResponse") {
430
+ return [];
431
+ }
432
+ const profiles = response.submessage.value.profiles;
433
+ return profiles.map((p) => {
434
+ const props = p.properties.map(profilePropertyFromProto);
435
+ const guidProp = props.find((prop) => prop.key === "Guid");
436
+ const nameProp = props.find((prop) => prop.key === "Name");
437
+ return {
438
+ guid: guidProp?.value ?? "",
439
+ name: nameProp?.value ?? "",
440
+ properties: props
441
+ };
442
+ });
443
+ };
444
+ var getProfileProperty = async (conn, sessionId, key) => {
445
+ const response = await conn.send({
446
+ case: "getProfilePropertyRequest",
447
+ value: protobuf.create(GetProfilePropertyRequestSchema, {
448
+ session: sessionId,
449
+ keys: [key]
450
+ })
451
+ });
452
+ if (response.submessage.case !== "getProfilePropertyResponse") {
453
+ return null;
454
+ }
455
+ const propResponse = response.submessage.value;
456
+ if (propResponse.status !== 0 /* OK */) {
457
+ throw new Error(`getProfileProperty failed: status ${propResponse.status}`);
458
+ }
459
+ const prop = propResponse.properties[0];
460
+ return prop?.jsonValue ? JSON.parse(prop.jsonValue) : null;
461
+ };
462
+ var setProfileProperty = async (conn, sessionId, key, value) => {
463
+ const response = await conn.send({
464
+ case: "setProfilePropertyRequest",
465
+ value: protobuf.create(SetProfilePropertyRequestSchema, {
466
+ target: { case: "session", value: sessionId },
467
+ key,
468
+ jsonValue: JSON.stringify(value)
469
+ })
470
+ });
471
+ if (response.submessage.case === "setProfilePropertyResponse" && response.submessage.value.status !== 0 /* OK */) {
472
+ throw new Error(`setProfileProperty failed: status ${response.submessage.value.status}`);
473
+ }
474
+ };
475
+ var sendText = async (conn, sessionId, text, suppressBroadcast) => {
476
+ const response = await conn.send({
477
+ case: "sendTextRequest",
478
+ value: protobuf.create(SendTextRequestSchema, {
479
+ session: sessionId,
480
+ text,
481
+ suppressBroadcast
482
+ })
483
+ });
484
+ if (response.submessage.case === "sendTextResponse" && response.submessage.value.status !== 0 /* OK */) {
485
+ throw new Error(`sendText failed: status ${response.submessage.value.status}`);
486
+ }
487
+ };
488
+ var splitPane = async (conn, sessionId, options = {}) => {
489
+ const direction = options.direction === "horizontal" ? 1 /* HORIZONTAL */ : 0 /* VERTICAL */;
490
+ const response = await conn.send({
491
+ case: "splitPaneRequest",
492
+ value: protobuf.create(SplitPaneRequestSchema, {
493
+ session: sessionId,
494
+ splitDirection: direction,
495
+ before: options.before,
496
+ profileName: options.profile
497
+ })
498
+ });
499
+ if (response.submessage.case !== "splitPaneResponse") {
500
+ throw new Error("splitPane: unexpected response");
501
+ }
502
+ const splitResponse = response.submessage.value;
503
+ if (splitResponse.status !== 0 /* OK */) {
504
+ throw new Error(`splitPane failed: status ${splitResponse.status}`);
505
+ }
506
+ const newSessionId = splitResponse.sessionId[0];
507
+ if (!newSessionId) {
508
+ throw new Error("splitPane: no session ID returned");
509
+ }
510
+ return { id: newSessionId, name: "" };
511
+ };
512
+ function expandCells(chars, offset, numCodePoints, repeats, parts) {
513
+ for (let i = 0; i < repeats; i++) {
514
+ if (numCodePoints === 0) {
515
+ parts.push(" ");
516
+ } else {
517
+ parts.push(chars.slice(offset, offset + numCodePoints).join(""));
518
+ offset += numCodePoints;
519
+ }
520
+ }
521
+ return offset;
522
+ }
523
+ function expandLineText(line) {
524
+ const text = line.text ?? "";
525
+ if (!line.codePointsPerCell || line.codePointsPerCell.length === 0)
526
+ return text.replaceAll("\0", " ");
527
+ const chars = [...text];
528
+ const parts = [];
529
+ let offset = 0;
530
+ for (const cppc of line.codePointsPerCell) {
531
+ offset = expandCells(chars, offset, cppc.numCodePoints, cppc.repeats || 1, parts);
532
+ }
533
+ return parts.join("").replaceAll("\0", " ");
534
+ }
535
+ var getScreenContents = async (conn, sessionId) => {
536
+ const response = await conn.send({
537
+ case: "getBufferRequest",
538
+ value: protobuf.create(GetBufferRequestSchema, {
539
+ session: sessionId,
540
+ lineRange: protobuf.create(LineRangeSchema, { screenContentsOnly: true })
541
+ })
542
+ });
543
+ if (response.submessage.case !== "getBufferResponse") {
544
+ throw new Error("getScreenContents: unexpected response");
545
+ }
546
+ const bufferResponse = response.submessage.value;
547
+ if (bufferResponse.status !== 0 /* OK */) {
548
+ throw new Error(`getScreenContents failed: status ${bufferResponse.status}`);
549
+ }
550
+ return bufferResponse.contents.map(expandLineText).join("\n");
551
+ };
552
+ var getBuffer = async (conn, sessionId, trailingLines) => {
553
+ const lineRange = trailingLines != null ? protobuf.create(LineRangeSchema, { trailingLines }) : protobuf.create(LineRangeSchema, { screenContentsOnly: true });
554
+ const response = await conn.send({
555
+ case: "getBufferRequest",
556
+ value: protobuf.create(GetBufferRequestSchema, {
557
+ session: sessionId,
558
+ lineRange
559
+ })
560
+ });
561
+ if (response.submessage.case !== "getBufferResponse") {
562
+ throw new Error("getBuffer: unexpected response");
563
+ }
564
+ const bufferResponse = response.submessage.value;
565
+ if (bufferResponse.status !== 0 /* OK */) {
566
+ throw new Error(`getBuffer failed: status ${bufferResponse.status}`);
567
+ }
568
+ return bufferResponse.contents.map((line) => ({
569
+ text: expandLineText(line),
570
+ continuation: line.continuation === 2 /* SOFT_EOL */ ? "soft" : "hard"
571
+ }));
572
+ };
573
+ var inject = async (conn, sessionId, data) => {
574
+ const response = await conn.send({
575
+ case: "injectRequest",
576
+ value: protobuf.create(InjectRequestSchema, {
577
+ sessionId: [sessionId],
578
+ data
579
+ })
580
+ });
581
+ if (response.submessage.case === "injectResponse") {
582
+ const status = response.submessage.value.status[0];
583
+ if (status != null && status !== 0 /* OK */) {
584
+ throw new Error(`inject failed: status ${status}`);
585
+ }
586
+ }
587
+ };
588
+ var restartSession = async (conn, sessionId, onlyIfExited) => {
589
+ const response = await conn.send({
590
+ case: "restartSessionRequest",
591
+ value: protobuf.create(RestartSessionRequestSchema, {
592
+ sessionId,
593
+ onlyIfExited
594
+ })
595
+ });
596
+ if (response.submessage.case === "restartSessionResponse" && response.submessage.value.status !== 0 /* OK */) {
597
+ throw new Error(`restartSession failed: status ${response.submessage.value.status}`);
598
+ }
599
+ };
600
+ var createTab = async (conn, windowId, profile) => {
601
+ const response = await conn.send({
602
+ case: "createTabRequest",
603
+ value: protobuf.create(CreateTabRequestSchema, {
604
+ windowId,
605
+ profileName: profile
606
+ })
607
+ });
608
+ if (response.submessage.case !== "createTabResponse") {
609
+ throw new Error("createTab: unexpected response");
610
+ }
611
+ const tabResponse = response.submessage.value;
612
+ if (tabResponse.status !== 0 /* OK */) {
613
+ throw new Error(`createTab failed: status ${tabResponse.status}`);
614
+ }
615
+ return {
616
+ windowId: tabResponse.windowId ?? "",
617
+ tabId: String(tabResponse.tabId ?? ""),
618
+ sessionId: tabResponse.sessionId ?? ""
619
+ };
620
+ };
621
+ var createWindow = async (conn, profile) => {
622
+ return createTab(conn, void 0, profile);
623
+ };
624
+ var activate = async (conn, target) => {
625
+ const identifierMap = {
626
+ session: "sessionId",
627
+ tab: "tabId",
628
+ window: "windowId"
629
+ };
630
+ const response = await conn.send({
631
+ case: "activateRequest",
632
+ value: protobuf.create(ActivateRequestSchema, {
633
+ orderWindowFront: true,
634
+ selectTab: true,
635
+ selectSession: true,
636
+ identifier: { case: identifierMap[target.type], value: target.id }
637
+ })
638
+ });
639
+ if (response.submessage.case === "activateResponse" && response.submessage.value.status !== 0 /* OK */) {
640
+ throw new Error(`activate failed: status ${response.submessage.value.status}`);
641
+ }
642
+ };
643
+ var close = async (conn, target, force) => {
644
+ let closeTarget;
645
+ switch (target.type) {
646
+ case "session":
647
+ closeTarget = {
648
+ case: "sessions",
649
+ value: protobuf.create(CloseRequest_CloseSessionsSchema, { sessionIds: [...target.ids] })
650
+ };
651
+ break;
652
+ case "tab":
653
+ closeTarget = {
654
+ case: "tabs",
655
+ value: protobuf.create(CloseRequest_CloseTabsSchema, { tabIds: [...target.ids] })
656
+ };
657
+ break;
658
+ case "window":
659
+ closeTarget = {
660
+ case: "windows",
661
+ value: protobuf.create(CloseRequest_CloseWindowsSchema, { windowIds: [...target.ids] })
662
+ };
663
+ break;
664
+ }
665
+ const response = await conn.send({
666
+ case: "closeRequest",
667
+ value: protobuf.create(CloseRequestSchema, {
668
+ force,
669
+ target: closeTarget
670
+ })
671
+ });
672
+ if (response.submessage.case === "closeResponse") {
673
+ for (const status of response.submessage.value.statuses) {
674
+ if (status !== 0 /* OK */) {
675
+ throw new Error(`close failed: status ${status}`);
676
+ }
677
+ }
678
+ }
679
+ };
680
+
681
+ // src/api/client.ts
682
+ var ITerm2 = class _ITerm2 {
683
+ conn;
684
+ emitter = new TypedEmitter();
685
+ subscriptions = /* @__PURE__ */ new Set();
686
+ cleanupNotificationHandler = null;
687
+ constructor(connection) {
688
+ this.conn = connection;
689
+ this.cleanupNotificationHandler = this.conn.onNotification(
690
+ (notification) => dispatchNotification(this.emitter, notification)
691
+ );
692
+ }
693
+ static async connect(options = {}) {
694
+ const conn = await Connection.create(options);
695
+ return new _ITerm2(conn);
696
+ }
697
+ get connection() {
698
+ return this.conn;
699
+ }
700
+ // --- App ---
701
+ async getApp() {
702
+ const response = await this.conn.send({
703
+ case: "listSessionsRequest",
704
+ value: protobuf.create(ListSessionsRequestSchema, {})
705
+ });
706
+ if (response.submessage.case !== "listSessionsResponse") {
707
+ throw new Error("getApp: no response");
708
+ }
709
+ return appFromProto(response.submessage.value);
710
+ }
711
+ // --- Sessions ---
712
+ async sendText(sessionId, text, suppressBroadcast) {
713
+ return sendText(this.conn, sessionId, text, suppressBroadcast);
714
+ }
715
+ async splitPane(sessionId, options) {
716
+ return splitPane(this.conn, sessionId, options);
717
+ }
718
+ async getScreenContents(sessionId) {
719
+ return getScreenContents(this.conn, sessionId);
720
+ }
721
+ async getBuffer(sessionId, trailingLines) {
722
+ return getBuffer(this.conn, sessionId, trailingLines);
723
+ }
724
+ async inject(sessionId, data) {
725
+ return inject(this.conn, sessionId, data);
726
+ }
727
+ async restartSession(sessionId, onlyIfExited) {
728
+ return restartSession(this.conn, sessionId, onlyIfExited);
729
+ }
730
+ // --- Windows & Tabs ---
731
+ async createTab(windowId, profile) {
732
+ return createTab(this.conn, windowId, profile);
733
+ }
734
+ async createWindow(profile) {
735
+ return createWindow(this.conn, profile);
736
+ }
737
+ async activate(target) {
738
+ return activate(this.conn, target);
739
+ }
740
+ async close(target, force) {
741
+ return close(this.conn, target, force);
742
+ }
743
+ // --- Profiles ---
744
+ async listProfiles(properties, guids) {
745
+ return listProfiles(this.conn, properties, guids);
746
+ }
747
+ async getProfileProperty(sessionId, key) {
748
+ return getProfileProperty(this.conn, sessionId, key);
749
+ }
750
+ async setProfileProperty(sessionId, key, value) {
751
+ return setProfileProperty(this.conn, sessionId, key, value);
752
+ }
753
+ // --- Variables ---
754
+ async setVariable(sessionId, name, value) {
755
+ const response = await this.conn.send({
756
+ case: "variableRequest",
757
+ value: protobuf.create(VariableRequestSchema, {
758
+ scope: { case: "sessionId", value: sessionId },
759
+ set: [protobuf.create(VariableRequest_SetSchema, { name, value: JSON.stringify(value) })]
760
+ })
761
+ });
762
+ if (response.submessage.case === "variableResponse" && response.submessage.value.status !== 0 /* OK */) {
763
+ throw new Error(`setVariable failed: status ${response.submessage.value.status}`);
764
+ }
765
+ }
766
+ async getVariable(sessionId, name) {
767
+ const response = await this.conn.send({
768
+ case: "variableRequest",
769
+ value: protobuf.create(VariableRequestSchema, {
770
+ scope: { case: "sessionId", value: sessionId },
771
+ get: [name]
772
+ })
773
+ });
774
+ if (response.submessage.case !== "variableResponse") {
775
+ return null;
776
+ }
777
+ const varResponse = response.submessage.value;
778
+ if (varResponse.status !== 0 /* OK */) {
779
+ throw new Error(`getVariable failed: status ${varResponse.status}`);
780
+ }
781
+ const val = varResponse.values[0];
782
+ return val ? JSON.parse(val) : null;
783
+ }
784
+ // --- Properties ---
785
+ async setProperty(name, windowId, value) {
786
+ const response = await this.conn.send({
787
+ case: "setPropertyRequest",
788
+ value: protobuf.create(SetPropertyRequestSchema, {
789
+ identifier: { case: "windowId", value: windowId },
790
+ name,
791
+ jsonValue: JSON.stringify(value)
792
+ })
793
+ });
794
+ if (response.submessage.case === "setPropertyResponse" && response.submessage.value.status !== 0 /* OK */) {
795
+ throw new Error(`setProperty failed: status ${response.submessage.value.status}`);
796
+ }
797
+ }
798
+ async getProperty(name, windowId) {
799
+ const response = await this.conn.send({
800
+ case: "getPropertyRequest",
801
+ value: protobuf.create(GetPropertyRequestSchema, {
802
+ identifier: { case: "windowId", value: windowId },
803
+ name
804
+ })
805
+ });
806
+ if (response.submessage.case !== "getPropertyResponse") {
807
+ return null;
808
+ }
809
+ const propResponse = response.submessage.value;
810
+ if (propResponse.status !== 0 /* OK */) {
811
+ throw new Error(`getProperty failed: status ${propResponse.status}`);
812
+ }
813
+ return propResponse.jsonValue ? JSON.parse(propResponse.jsonValue) : null;
814
+ }
815
+ // --- Focus ---
816
+ async focus() {
817
+ const response = await this.conn.send({
818
+ case: "focusRequest",
819
+ value: protobuf.create(FocusRequestSchema, {})
820
+ });
821
+ if (response.submessage.case !== "focusResponse") {
822
+ return [];
823
+ }
824
+ return response.submessage.value.notifications;
825
+ }
826
+ // --- Events ---
827
+ async on(event, handler, sessionId) {
828
+ const subKey = `${event}:${sessionId ?? ""}`;
829
+ if (!this.subscriptions.has(subKey)) {
830
+ await subscribe(this.conn, event, sessionId);
831
+ this.subscriptions.add(subKey);
832
+ }
833
+ const cleanup = this.emitter.on(event, handler);
834
+ return async () => {
835
+ cleanup();
836
+ if (!this.emitter.hasListeners(event)) {
837
+ this.subscriptions.delete(subKey);
838
+ await unsubscribe(this.conn, event, sessionId).catch(() => {
839
+ });
840
+ }
841
+ };
842
+ }
843
+ async *notifications(event, sessionId) {
844
+ const subKey = `${event}:${sessionId ?? ""}`;
845
+ if (!this.subscriptions.has(subKey)) {
846
+ await subscribe(this.conn, event, sessionId);
847
+ this.subscriptions.add(subKey);
848
+ }
849
+ const iterator = createAsyncIterator(this.emitter, event);
850
+ try {
851
+ yield* iterator;
852
+ } finally {
853
+ iterator.return?.();
854
+ if (!this.emitter.hasListeners(event)) {
855
+ this.subscriptions.delete(subKey);
856
+ await unsubscribe(this.conn, event, sessionId).catch(() => {
857
+ });
858
+ }
859
+ }
860
+ }
861
+ // --- Raw notification handler ---
862
+ onNotification(handler) {
863
+ return this.conn.onNotification(handler);
864
+ }
865
+ // --- Lifecycle ---
866
+ disconnect() {
867
+ this.emitter.removeAllListeners();
868
+ this.cleanupNotificationHandler?.();
869
+ this.cleanupNotificationHandler = null;
870
+ this.subscriptions.clear();
871
+ this.conn.close();
872
+ }
873
+ get isConnected() {
874
+ return this.conn.isConnected;
875
+ }
876
+ };
877
+
878
+ // src/index.ts
879
+ var connect = (options) => ITerm2.connect(options);
880
+
881
+ // src/cli/activate.ts
882
+ function registerActivate(program2) {
883
+ program2.command("activate").description("Activate (focus) a session, tab, or window").argument("<type>", "target type: session, tab, or window").argument("<id>", "target identifier").action(async (type, id) => {
884
+ if (!["session", "tab", "window"].includes(type)) {
885
+ console.error("Invalid target type. Must be one of: session, tab, window");
886
+ process.exit(1);
887
+ }
888
+ const target = {
889
+ type,
890
+ id
891
+ };
892
+ const iterm = await connect();
893
+ try {
894
+ await iterm.activate(target);
895
+ console.log(`Activated ${type} "${id}"`);
896
+ } catch (err) {
897
+ console.error(
898
+ `Failed to activate ${type} "${id}":`,
899
+ err instanceof Error ? err.message : err
900
+ );
901
+ process.exit(1);
902
+ } finally {
903
+ iterm.disconnect();
904
+ }
905
+ });
906
+ }
907
+ function getPsTable() {
908
+ const raw = child_process.execSync("ps -axo pid,ppid,comm", { encoding: "utf-8" });
909
+ const lines = raw.trim().split("\n").slice(1);
910
+ return lines.map((line) => {
911
+ const trimmed = line.trimStart();
912
+ const firstSpace = trimmed.indexOf(" ");
913
+ const rest = trimmed.slice(firstSpace + 1).trimStart();
914
+ const secondSpace = rest.indexOf(" ");
915
+ return {
916
+ pid: Number.parseInt(trimmed.slice(0, firstSpace), 10),
917
+ ppid: Number.parseInt(rest.slice(0, secondSpace), 10),
918
+ comm: rest.slice(secondSpace + 1).trim()
919
+ };
920
+ });
921
+ }
922
+ function buildProcessChain(pid, table) {
923
+ const byPid = /* @__PURE__ */ new Map();
924
+ for (const entry of table) {
925
+ byPid.set(entry.pid, entry);
926
+ }
927
+ const chain = [];
928
+ let current = pid;
929
+ const seen = /* @__PURE__ */ new Set();
930
+ while (!seen.has(current)) {
931
+ const entry = byPid.get(current);
932
+ if (!entry) break;
933
+ seen.add(current);
934
+ const name = entry.comm.split("/").pop() ?? entry.comm;
935
+ chain.unshift(name);
936
+ current = entry.ppid;
937
+ if (current <= 1) break;
938
+ }
939
+ return chain;
940
+ }
941
+ function flattenSessions(app) {
942
+ const result = [];
943
+ for (const window of app.windows) {
944
+ for (let tabIdx = 0; tabIdx < window.tabs.length; tabIdx++) {
945
+ const tab = window.tabs[tabIdx];
946
+ if (!tab) continue;
947
+ for (const session of tab.sessions) {
948
+ result.push({ session, windowNumber: window.number, tabIdx });
949
+ }
950
+ }
951
+ }
952
+ return result;
953
+ }
954
+ async function enrichSession(iterm, entry, psTable, lineCount) {
955
+ const { session, windowNumber, tabIdx } = entry;
956
+ const chain = await getProcessChain(iterm, session.id, psTable);
957
+ const cwd = await getCwd(iterm, session.id);
958
+ const bufferLines = await getBufferLines(iterm, session.id, lineCount);
959
+ const grid = session.gridSize ? `${session.gridSize.width}x${session.gridSize.height}` : "?";
960
+ return {
961
+ name: session.name,
962
+ id: session.id,
963
+ cwd,
964
+ windowNumber,
965
+ tabIdx,
966
+ grid,
967
+ chain,
968
+ bufferLines
969
+ };
970
+ }
971
+ async function getProcessChain(iterm, sessionId, psTable) {
972
+ try {
973
+ const jobPid = await iterm.getVariable(sessionId, "jobPid");
974
+ if (typeof jobPid === "number") {
975
+ return buildProcessChain(jobPid, psTable);
976
+ }
977
+ } catch {
978
+ }
979
+ return [];
980
+ }
981
+ async function getCwd(iterm, sessionId) {
982
+ try {
983
+ const path = await iterm.getVariable(sessionId, "path");
984
+ if (typeof path === "string") return path;
985
+ } catch {
986
+ }
987
+ return void 0;
988
+ }
989
+ async function getBufferLines(iterm, sessionId, lineCount) {
990
+ try {
991
+ const lines = await iterm.getBuffer(sessionId, lineCount);
992
+ return lines.map((l) => l.text);
993
+ } catch {
994
+ return [];
995
+ }
996
+ }
997
+ async function runList(opts) {
998
+ const lineCount = Number.parseInt(opts.lines, 10);
999
+ const filter = opts.filter ? new RegExp(opts.filter, "i") : void 0;
1000
+ const printer = opts.md ? printMd : printPlain;
1001
+ const iterm = await connect();
1002
+ try {
1003
+ const app = await iterm.getApp();
1004
+ const psTable = getPsTable();
1005
+ const entries = flattenSessions(app);
1006
+ let printed = 0;
1007
+ for (const entry of entries) {
1008
+ const s = await enrichSession(iterm, entry, psTable, lineCount);
1009
+ if (filter && !s.chain.some((name) => filter.test(name))) continue;
1010
+ printer(s, lineCount, printed);
1011
+ printed++;
1012
+ }
1013
+ if (printed === 0 && filter) {
1014
+ console.log(`No sessions matched filter "${opts.filter}".`);
1015
+ }
1016
+ } finally {
1017
+ iterm.disconnect();
1018
+ }
1019
+ }
1020
+ function registerList(program2) {
1021
+ program2.command("list").description("List sessions with process trees and buffer contents").option("--lines <n>", "trailing buffer lines per session", "20").option("--filter <pattern>", "regex filter on process names").option("--md", "markdown output for LLM consumption", false).action(runList);
1022
+ }
1023
+ function printPlain(s, _lineCount, index) {
1024
+ if (index > 0) console.log("\n---\n");
1025
+ console.log(`# Session: "${s.name}" (id: ${s.id})`);
1026
+ console.log(`Window: ${s.windowNumber ?? "?"} | Tab: ${s.tabIdx} | Grid: ${s.grid}`);
1027
+ if (s.cwd) console.log(`CWD: ${s.cwd}`);
1028
+ if (s.chain.length > 0) {
1029
+ console.log("\n## Process Tree");
1030
+ console.log(s.chain.join(" \u2192 "));
1031
+ }
1032
+ if (s.bufferLines.length > 0) {
1033
+ console.log(`
1034
+ ## Buffer (last ${s.bufferLines.length} lines)`);
1035
+ for (const line of s.bufferLines) {
1036
+ console.log(line);
1037
+ }
1038
+ } else {
1039
+ console.log("\n(buffer empty)");
1040
+ }
1041
+ }
1042
+ function printMd(s, lineCount, index) {
1043
+ if (index > 0) console.log("\n---\n");
1044
+ console.log(`# Session: "${s.name}"`);
1045
+ console.log(`Window: ${s.windowNumber ?? "?"} | Tab: ${s.tabIdx} | Grid: ${s.grid}`);
1046
+ if (s.cwd) console.log(`CWD: ${s.cwd}`);
1047
+ if (s.chain.length > 0) {
1048
+ console.log("\n## Process Tree");
1049
+ console.log(`\`${s.chain.join(" \u2192 ")}\``);
1050
+ }
1051
+ if (s.bufferLines.length > 0) {
1052
+ console.log(`
1053
+ ## Buffer (last ${lineCount} lines)`);
1054
+ console.log("```");
1055
+ for (const line of s.bufferLines) {
1056
+ console.log(line);
1057
+ }
1058
+ console.log("```");
1059
+ } else {
1060
+ console.log("\n(buffer empty)");
1061
+ }
1062
+ }
1063
+
1064
+ // src/cli/watch.ts
1065
+ var ALL_EVENTS = [
1066
+ "sessionCreated",
1067
+ "sessionTerminated",
1068
+ "layoutChanged",
1069
+ "focusChanged",
1070
+ "screenUpdated",
1071
+ "keystroke",
1072
+ "customEscapeSequence",
1073
+ "variableChanged",
1074
+ "profileChanged",
1075
+ "broadcastDomainsChanged",
1076
+ "prompt"
1077
+ ];
1078
+ function registerWatch(program2) {
1079
+ program2.command("watch").description("Subscribe to all events and log JSON").action(async () => {
1080
+ const iterm = await connect();
1081
+ console.log("Subscribing to all events...");
1082
+ const cleanups = [];
1083
+ for (const event of ALL_EVENTS) {
1084
+ try {
1085
+ const off = await iterm.on(event, (data) => {
1086
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
1087
+ console.log(`[${timestamp}] ${event}:`, JSON.stringify(data, null, 2));
1088
+ });
1089
+ cleanups.push(off);
1090
+ console.log(` + ${event}`);
1091
+ } catch (err) {
1092
+ console.log(` x ${event} - ${err instanceof Error ? err.message : err}`);
1093
+ }
1094
+ }
1095
+ console.log("\nListening for events... (Ctrl+C to stop)\n");
1096
+ process.on("SIGINT", () => {
1097
+ console.log("\nUnsubscribing...");
1098
+ for (const off of cleanups) {
1099
+ off();
1100
+ }
1101
+ iterm.disconnect();
1102
+ process.exit(0);
1103
+ });
1104
+ });
1105
+ }
1106
+
1107
+ // src/cli.ts
1108
+ var program = new commander.Command();
1109
+ program.name("it2").description("CLI for iTerm2").version("0.1.1");
1110
+ registerList(program);
1111
+ registerWatch(program);
1112
+ registerActivate(program);
1113
+ program.parse();
1114
+ //# sourceMappingURL=cli.cjs.map
1115
+ //# sourceMappingURL=cli.cjs.map