@omujs/omu 0.9.32 → 0.9.40

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/dts/api/asset/extension.d.ts +3 -3
  3. package/dist/dts/api/asset/index.d.ts +1 -1
  4. package/dist/dts/api/dashboard/extension.d.ts +13 -3
  5. package/dist/dts/api/dashboard/handler.d.ts +2 -1
  6. package/dist/dts/api/dashboard/index.d.ts +1 -1
  7. package/dist/dts/api/http/extension.d.ts +2 -135
  8. package/dist/dts/api/http/http.d.ts +36 -0
  9. package/dist/dts/api/http/websocket.d.ts +123 -0
  10. package/dist/dts/api/permission/extension.d.ts +1 -0
  11. package/dist/dts/index.d.ts +1 -3
  12. package/dist/dts/version.d.ts +2 -1
  13. package/dist/esm/api/asset/extension.js +43 -18
  14. package/dist/esm/api/asset/index.js +42 -17
  15. package/dist/esm/api/dashboard/extension.js +17 -13
  16. package/dist/esm/api/dashboard/index.js +17 -13
  17. package/dist/esm/api/endpoint/extension.js +3 -3
  18. package/dist/esm/api/extension.js +3 -3
  19. package/dist/esm/api/http/extension.js +262 -277
  20. package/dist/esm/api/http/http.js +442 -0
  21. package/dist/esm/api/http/index.js +262 -165
  22. package/dist/esm/api/http/websocket.js +220 -0
  23. package/dist/esm/api/i18n/extension.js +3 -3
  24. package/dist/esm/api/i18n/index.js +3 -3
  25. package/dist/esm/api/index.js +3 -3
  26. package/dist/esm/api/logger/extension.js +3 -3
  27. package/dist/esm/api/logger/index.js +3 -3
  28. package/dist/esm/api/permission/extension.js +6 -3
  29. package/dist/esm/api/plugin/extension.js +3 -3
  30. package/dist/esm/api/plugin/index.js +3 -3
  31. package/dist/esm/api/registry/extension.js +3 -3
  32. package/dist/esm/api/registry/index.js +3 -3
  33. package/dist/esm/api/server/extension.js +3 -3
  34. package/dist/esm/api/server/index.js +3 -3
  35. package/dist/esm/api/session/extension.js +3 -3
  36. package/dist/esm/api/session/index.js +3 -3
  37. package/dist/esm/api/signal/extension.js +3 -3
  38. package/dist/esm/api/table/extension.js +3 -3
  39. package/dist/esm/api/table/index.js +3 -3
  40. package/dist/esm/index.js +319 -189
  41. package/dist/esm/network/index.js +3 -3
  42. package/dist/esm/network/network.js +3 -3
  43. package/dist/esm/omu.js +318 -186
  44. package/dist/esm/version.js +5 -3
  45. package/package.json +1 -1
  46. package/src/api/asset/extension.ts +46 -12
  47. package/src/api/asset/index.ts +1 -2
  48. package/src/api/dashboard/extension.ts +29 -13
  49. package/src/api/dashboard/handler.ts +2 -1
  50. package/src/api/dashboard/index.ts +2 -0
  51. package/src/api/extension.ts +1 -1
  52. package/src/api/http/extension.ts +13 -364
  53. package/src/api/http/http.ts +79 -0
  54. package/src/api/http/websocket.ts +283 -0
  55. package/src/api/permission/extension.ts +4 -0
  56. package/src/index.ts +3 -5
  57. package/src/version.ts +2 -1
  58. package/tsconfig.tsbuildinfo +1 -1
package/dist/esm/omu.js CHANGED
@@ -280,7 +280,7 @@ class ExtensionType extends Identifier {
280
280
  this.create = create;
281
281
  }
282
282
  key() {
283
- return this.name;
283
+ return new Identifier("ext", this.name).key();
284
284
  }
285
285
  }
286
286
  // src/const.ts
@@ -802,44 +802,55 @@ var FILE_ARRAY_SERIALIZER = new Serializer((files) => {
802
802
  reader.finish();
803
803
  return files;
804
804
  });
805
- var ASSET_UPLOAD_PERMISSION_ID = ASSET_EXTENSION_TYPE.join("upload");
805
+ var ASSET_PERMISSION_ID = ASSET_EXTENSION_TYPE.join("permission");
806
806
  var ASSET_UPLOAD_ENDPOINT = EndpointType.createSerialized(ASSET_EXTENSION_TYPE, {
807
807
  name: "upload",
808
808
  requestSerializer: FILE_SERIALIZER,
809
809
  responseSerializer: Serializer.of(Identifier).toJson(),
810
- permissionId: ASSET_UPLOAD_PERMISSION_ID
810
+ permissionId: ASSET_PERMISSION_ID
811
811
  });
812
812
  var ASSET_UPLOAD_MANY_ENDPOINT = EndpointType.createSerialized(ASSET_EXTENSION_TYPE, {
813
813
  name: "upload_many",
814
814
  requestSerializer: FILE_ARRAY_SERIALIZER,
815
815
  responseSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),
816
- permissionId: ASSET_UPLOAD_PERMISSION_ID
816
+ permissionId: ASSET_PERMISSION_ID
817
817
  });
818
- var ASSET_DOWNLOAD_PERMISSION_ID = ASSET_EXTENSION_TYPE.join("download");
819
818
  var ASSET_DOWNLOAD_ENDPOINT = EndpointType.createSerialized(ASSET_EXTENSION_TYPE, {
820
819
  name: "download",
821
820
  requestSerializer: Serializer.of(Identifier).pipe(Serializer.json()),
822
821
  responseSerializer: FILE_SERIALIZER,
823
- permissionId: ASSET_DOWNLOAD_PERMISSION_ID
822
+ permissionId: ASSET_PERMISSION_ID
824
823
  });
825
824
  var ASSET_DOWNLOAD_MANY_ENDPOINT = EndpointType.createSerialized(ASSET_EXTENSION_TYPE, {
826
825
  name: "download_many",
827
826
  requestSerializer: Serializer.of(Identifier).toArray().pipe(Serializer.json()),
828
827
  responseSerializer: FILE_ARRAY_SERIALIZER,
829
- permissionId: ASSET_DOWNLOAD_PERMISSION_ID
828
+ permissionId: ASSET_PERMISSION_ID
830
829
  });
831
- var ASSET_DELETE_PERMISSION_ID = ASSET_EXTENSION_TYPE.join("delete");
832
830
  var ASSET_DELETE_ENDPOINT = EndpointType.createJson(ASSET_EXTENSION_TYPE, {
833
831
  name: "delete",
834
832
  requestSerializer: Identifier,
835
- permissionId: ASSET_DELETE_PERMISSION_ID
833
+ permissionId: ASSET_PERMISSION_ID
834
+ });
835
+ var ASSET_GENERATE_TOKEN_ENDPOINT = EndpointType.createJson(ASSET_EXTENSION_TYPE, {
836
+ name: "token_generate",
837
+ permissionId: ASSET_PERMISSION_ID
836
838
  });
837
839
 
838
840
  class AssetExtension {
839
841
  omu;
840
842
  type = ASSET_EXTENSION_TYPE;
843
+ assetToken = undefined;
841
844
  constructor(omu) {
842
845
  this.omu = omu;
846
+ omu.network.event.disconnected.listen(() => {
847
+ this.assetToken = undefined;
848
+ });
849
+ omu.onReady(async () => {
850
+ if (omu.permissions.required(ASSET_PERMISSION_ID)) {
851
+ await this.requestGenerateAssetToken();
852
+ }
853
+ });
843
854
  }
844
855
  async upload(identifier, buffer) {
845
856
  const assetIdentifier = await this.omu.endpoints.call(ASSET_UPLOAD_ENDPOINT, {
@@ -865,19 +876,35 @@ class AssetExtension {
865
876
  const id = Identifier.from(identifier);
866
877
  await this.omu.endpoints.call(ASSET_DELETE_ENDPOINT, id);
867
878
  }
879
+ async requestGenerateAssetToken() {
880
+ const result = await this.omu.endpoints.call(ASSET_GENERATE_TOKEN_ENDPOINT, {});
881
+ this.assetToken = result.token;
882
+ }
868
883
  url(id, options) {
884
+ if (!this.assetToken) {
885
+ throw new Error("Asset token is not set");
886
+ }
869
887
  const key = Identifier.from(id).key();
870
888
  const address = this.omu.network.address;
871
889
  const protocol = address.secure ? "https" : "http";
890
+ const url = new URL(`${protocol}://${address.host}:${address.port}/asset`);
891
+ url.searchParams.set("asset_token", this.assetToken);
892
+ url.searchParams.set("id", key);
872
893
  if (options?.cache === "no-cache") {
873
- return `${protocol}://${address.host}:${address.port}/asset?id=${encodeURIComponent(key)}&t=${Date.now()}`;
894
+ url.searchParams.set("t", Date.now().toString());
874
895
  }
875
- return `${protocol}://${address.host}:${address.port}/asset?id=${encodeURIComponent(key)}`;
896
+ return url.toString();
876
897
  }
877
898
  proxy(url) {
899
+ if (!this.assetToken) {
900
+ throw new Error("Asset token is not set");
901
+ }
878
902
  const address = this.omu.network.address;
879
903
  const protocol = address.secure ? "https" : "http";
880
- return `${protocol}://${address.host}:${address.port}/proxy?url=${encodeURIComponent(url)}`;
904
+ const proxyUrl = new URL(`${protocol}://${address.host}:${address.port}/proxy`);
905
+ proxyUrl.searchParams.set("asset_token", this.assetToken);
906
+ proxyUrl.searchParams.set("url", url);
907
+ return proxyUrl.toString();
881
908
  }
882
909
  }
883
910
 
@@ -1095,10 +1122,10 @@ var DASHBOARD_WEBVIEW_EVENT_PACKET = PacketType.createJson(DASHBOARD_EXTENSION_T
1095
1122
  name: "webview_event",
1096
1123
  serializer: Serializer.noop().field("id", Identifier).field("target", Identifier)
1097
1124
  });
1098
- var DASHBOARD_ALLOWED_HOSTS = TableType.createJson(DASHBOARD_EXTENSION_TYPE, {
1099
- name: "hosts",
1100
- key: (entry) => entry.host,
1101
- serializer: Serializer.noop().field("apps", Serializer.of(Identifier).toArray())
1125
+ var DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson(DASHBOARD_EXTENSION_TYPE, {
1126
+ name: "allowed_webview_hosts",
1127
+ key: (entry) => entry.id,
1128
+ permissions: { all: DASHBOARD_SET_PERMISSION_ID }
1102
1129
  });
1103
1130
  var DASHBOARD_HOST_REQUEST = EndpointType.createJson(DASHBOARD_EXTENSION_TYPE, {
1104
1131
  name: "host_request",
@@ -1178,7 +1205,7 @@ class DashboardExtension {
1178
1205
  return;
1179
1206
  handle.emit(packet.event);
1180
1207
  });
1181
- this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_HOSTS);
1208
+ this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);
1182
1209
  this.speechRecognition = omu.registries.get(DASHBOARD_SPEECH_RECOGNITION);
1183
1210
  }
1184
1211
  async executeRequestForDashboard(request) {
@@ -1194,6 +1221,8 @@ class DashboardExtension {
1194
1221
  return await dashboard.handleUpdateApp(request);
1195
1222
  case "index/install":
1196
1223
  return await dashboard.handleIndexInstall(request);
1224
+ case "http/port":
1225
+ return await dashboard.handleHttpPortRequest(request);
1197
1226
  default:
1198
1227
  throw new Error(`Unknown prompt requested: ${JSON.stringify(request)}`);
1199
1228
  }
@@ -1238,8 +1267,9 @@ class DashboardExtension {
1238
1267
  this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params) => {
1239
1268
  const { url } = request;
1240
1269
  const { hostname } = new URL(url);
1241
- const allowedHost = await this.allowedHosts.get(hostname) ?? { host: hostname, apps: [] };
1242
- const allowed = allowedHost.apps.some((host) => host.isEqual(params.caller));
1270
+ const id = params.caller.key();
1271
+ const allowedHost = await this.allowedHosts.get(id) ?? { id, hosts: [] };
1272
+ const allowed = allowedHost.hosts.includes(hostname);
1243
1273
  if (!allowed) {
1244
1274
  return {
1245
1275
  type: "cancelled"
@@ -1249,8 +1279,9 @@ class DashboardExtension {
1249
1279
  });
1250
1280
  this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params) => {
1251
1281
  const { host } = request;
1252
- const hostEntry = await this.allowedHosts.get(host) ?? { host, apps: [] };
1253
- const allowed = hostEntry.apps.some((host2) => host2.isEqual(params.caller));
1282
+ const id = params.caller.key();
1283
+ const hostEntry = await this.allowedHosts.get(id) ?? { id, hosts: [] };
1284
+ const allowed = hostEntry.hosts.includes(host);
1254
1285
  if (allowed) {
1255
1286
  return {
1256
1287
  type: "ok",
@@ -1259,7 +1290,7 @@ class DashboardExtension {
1259
1290
  }
1260
1291
  const result = await dashboard.hostRequested(request, params);
1261
1292
  if (result.type === "ok") {
1262
- hostEntry.apps.push(params.caller);
1293
+ hostEntry.hosts.push(host);
1263
1294
  await this.allowedHosts.update(hostEntry);
1264
1295
  }
1265
1296
  return result;
@@ -1722,13 +1753,7 @@ var ENDPOINT_RESPONSE_PACKET = PacketType.createSerialized(ENDPOINT_EXTENSION_TY
1722
1753
  serializer: EndpointResponsePacket
1723
1754
  });
1724
1755
 
1725
- // src/api/http/extension.ts
1726
- var HTTP_EXTENSION_TYPE = new ExtensionType("http", (omu) => new HttpExtension(omu));
1727
- var HTTP_REQUEST_PERMISSION_ID = HTTP_EXTENSION_TYPE.join("request");
1728
- var REQUEST_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
1729
- name: "request_create"
1730
- });
1731
-
1756
+ // src/api/http/http.ts
1732
1757
  class DataChunk {
1733
1758
  meta;
1734
1759
  body;
@@ -1749,6 +1774,248 @@ class DataChunk {
1749
1774
  return new DataChunk(meta, body);
1750
1775
  }
1751
1776
  }
1777
+
1778
+ class OmuResponse {
1779
+ headers;
1780
+ ok;
1781
+ redirected;
1782
+ status;
1783
+ statusText;
1784
+ type;
1785
+ url;
1786
+ body;
1787
+ bodyUsed;
1788
+ constructor(headers, ok, redirected, status, statusText, type, url, body, bodyUsed) {
1789
+ this.headers = headers;
1790
+ this.ok = ok;
1791
+ this.redirected = redirected;
1792
+ this.status = status;
1793
+ this.statusText = statusText;
1794
+ this.type = type;
1795
+ this.url = url;
1796
+ this.body = body;
1797
+ this.bodyUsed = bodyUsed;
1798
+ }
1799
+ clone() {
1800
+ return new OmuResponse(this.headers, this.ok, this.redirected, this.status, this.statusText, this.type, this.url, this.body, this.bodyUsed);
1801
+ }
1802
+ async arrayBuffer() {
1803
+ return await new Response(this.body).arrayBuffer();
1804
+ }
1805
+ blob() {
1806
+ return new Response(this.body).blob();
1807
+ }
1808
+ bytes() {
1809
+ return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));
1810
+ }
1811
+ formData() {
1812
+ return new Response(this.body).formData();
1813
+ }
1814
+ json() {
1815
+ return new Response(this.body).json();
1816
+ }
1817
+ text() {
1818
+ return new Response(this.body).text();
1819
+ }
1820
+ }
1821
+
1822
+ // src/api/http/websocket.ts
1823
+ var WSMsgType = {
1824
+ CONTINUATION: 0,
1825
+ TEXT: 1,
1826
+ BINARY: 2,
1827
+ PING: 9,
1828
+ PONG: 10,
1829
+ CLOSE: 8
1830
+ };
1831
+ class OmuWS {
1832
+ addQueue;
1833
+ dispose;
1834
+ receiveQueue;
1835
+ receiveResolve;
1836
+ status;
1837
+ constructor(addQueue, dispose, receiveQueue = [], receiveResolve = undefined, status = "connecting") {
1838
+ this.addQueue = addQueue;
1839
+ this.dispose = dispose;
1840
+ this.receiveQueue = receiveQueue;
1841
+ this.receiveResolve = receiveResolve;
1842
+ this.status = status;
1843
+ }
1844
+ toWebSocket() {
1845
+ return new OmuWebSocket(this);
1846
+ }
1847
+ static create(options) {
1848
+ const ws = new OmuWS(options.addQueue, options.dispose);
1849
+ return {
1850
+ ws,
1851
+ open: (response) => {
1852
+ ws.receiveQueue.push({
1853
+ type: "open",
1854
+ data: response
1855
+ });
1856
+ ws.receiveResolve?.();
1857
+ },
1858
+ dispatch: (data) => {
1859
+ if (data.meta.type === WSMsgType.BINARY) {
1860
+ ws.receiveQueue.push({
1861
+ type: "binary",
1862
+ data: data.body
1863
+ });
1864
+ } else {
1865
+ ws.receiveQueue.push({
1866
+ type: "text",
1867
+ data: textDecoder.decode(data.body)
1868
+ });
1869
+ }
1870
+ ws.receiveResolve?.();
1871
+ },
1872
+ close: (response) => {
1873
+ ws.receiveQueue.push({
1874
+ type: "close",
1875
+ data: response
1876
+ });
1877
+ ws.receiveResolve?.();
1878
+ },
1879
+ error: (response) => {
1880
+ ws.receiveQueue.push({
1881
+ type: "error",
1882
+ data: response
1883
+ });
1884
+ ws.receiveResolve?.();
1885
+ }
1886
+ };
1887
+ }
1888
+ send(data) {
1889
+ this.addQueue(data);
1890
+ }
1891
+ close(code, reason) {
1892
+ this.dispose({ code, reason });
1893
+ }
1894
+ async receive() {
1895
+ if (this.receiveResolve) {
1896
+ throw new Error("Already receiving from another async call");
1897
+ }
1898
+ while (this.status !== "closed") {
1899
+ const data = this.receiveQueue.shift();
1900
+ if (!data) {
1901
+ await new Promise((resolve) => this.receiveResolve = resolve);
1902
+ continue;
1903
+ }
1904
+ if (data.type === "close") {
1905
+ this.status = "closed";
1906
+ }
1907
+ if (data.type === "open") {
1908
+ this.status = "open";
1909
+ }
1910
+ this.receiveResolve = undefined;
1911
+ return data;
1912
+ }
1913
+ throw new Error("Receiving on already closed socket");
1914
+ }
1915
+ protocol = "";
1916
+ url = "";
1917
+ }
1918
+
1919
+ class OmuWebSocket {
1920
+ ws;
1921
+ eventListeners;
1922
+ CONNECTING = 0;
1923
+ OPEN = 1;
1924
+ CLOSING = 2;
1925
+ CLOSED = 3;
1926
+ binaryType = "blob";
1927
+ bufferedAmount = 0;
1928
+ extensions = "";
1929
+ onclose = null;
1930
+ onerror = null;
1931
+ onmessage = null;
1932
+ onopen = null;
1933
+ protocol = "";
1934
+ readyState = 0;
1935
+ url = "";
1936
+ constructor(ws, eventListeners = {
1937
+ close: [],
1938
+ error: [],
1939
+ message: [],
1940
+ open: []
1941
+ }) {
1942
+ this.ws = ws;
1943
+ this.eventListeners = eventListeners;
1944
+ this.receiveLoop();
1945
+ }
1946
+ async receiveLoop() {
1947
+ while (this.readyState === WebSocket.CLOSED) {
1948
+ const { data, type } = await this.ws.receive();
1949
+ switch (type) {
1950
+ case "close":
1951
+ this.dispatchEvent(new CloseEvent("close", {
1952
+ code: data.code,
1953
+ reason: data.reason ?? undefined
1954
+ }));
1955
+ break;
1956
+ case "open":
1957
+ this.url = data.url;
1958
+ this.protocol = data.protocol ?? "";
1959
+ this.dispatchEvent(new Event("open", {}));
1960
+ break;
1961
+ case "error":
1962
+ this.dispatchEvent(new ErrorEvent("error", {
1963
+ error: data.type,
1964
+ message: data.reason ?? undefined
1965
+ }));
1966
+ break;
1967
+ case "text":
1968
+ case "binary":
1969
+ this.dispatchEvent(new MessageEvent("message", {
1970
+ data
1971
+ }));
1972
+ break;
1973
+ }
1974
+ }
1975
+ }
1976
+ dispatchEvent(event) {
1977
+ const listeners = this.eventListeners[event.type];
1978
+ for (const listener of listeners) {
1979
+ listener(event);
1980
+ }
1981
+ if (event.type === "open") {
1982
+ this.onopen?.(event);
1983
+ }
1984
+ if (event.type === "error") {
1985
+ this.onerror?.(event);
1986
+ }
1987
+ if (event.type === "message") {
1988
+ this.onmessage?.(event);
1989
+ }
1990
+ if (event.type === "close") {
1991
+ this.onclose?.(event);
1992
+ }
1993
+ return true;
1994
+ }
1995
+ send(data) {
1996
+ this.ws.send(data);
1997
+ }
1998
+ close(code, reason) {
1999
+ this.ws.close(code, reason);
2000
+ }
2001
+ addEventListener(type, listener) {
2002
+ this.eventListeners[type].push(listener);
2003
+ }
2004
+ removeEventListener(type, listener) {
2005
+ const listeners = this.eventListeners[type];
2006
+ const index = listeners.indexOf(listener);
2007
+ if (index !== -1) {
2008
+ listeners.splice(index, 1);
2009
+ }
2010
+ }
2011
+ }
2012
+
2013
+ // src/api/http/extension.ts
2014
+ var HTTP_EXTENSION_TYPE = new ExtensionType("http", (omu) => new HttpExtension(omu));
2015
+ var HTTP_REQUEST_PERMISSION_ID = HTTP_EXTENSION_TYPE.join("request");
2016
+ var REQUEST_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
2017
+ name: "request_create"
2018
+ });
1752
2019
  var REQUEST_SEND = PacketType.createSerialized(HTTP_EXTENSION_TYPE, {
1753
2020
  name: "request_send",
1754
2021
  serializer: DataChunk
@@ -1766,14 +2033,6 @@ var RESPONSE_CHUNK = PacketType.createSerialized(HTTP_EXTENSION_TYPE, {
1766
2033
  var RESPONSE_CLOSE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
1767
2034
  name: "response_close"
1768
2035
  });
1769
- var WSMsgType = {
1770
- CONTINUATION: 0,
1771
- TEXT: 1,
1772
- BINARY: 2,
1773
- PING: 9,
1774
- PONG: 10,
1775
- CLOSE: 8
1776
- };
1777
2036
  var WEBSOCKET_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
1778
2037
  name: "ws_create"
1779
2038
  });
@@ -2019,14 +2278,22 @@ class HttpExtension {
2019
2278
  async ws(input, options) {
2020
2279
  const request = new Request(input, options);
2021
2280
  const id = this.generateId();
2022
- const handle = OmuWS.create(this.omu, id, (data) => {
2023
- this.wsSendQueue.push({
2024
- id: id.key(),
2025
- data
2026
- });
2027
- this.wsSendWaitResolve();
2028
- }, () => {
2029
- delete this.wsHandles[id.key()];
2281
+ const handle = OmuWS.create({
2282
+ addQueue: (data) => {
2283
+ this.wsSendQueue.push({
2284
+ id: id.key(),
2285
+ data
2286
+ });
2287
+ this.wsSendWaitResolve();
2288
+ },
2289
+ dispose: (options2) => {
2290
+ this.omu.send(WEBSOCKET_CLOSE, {
2291
+ id: id.key(),
2292
+ code: options2.code,
2293
+ reason: options2.reason
2294
+ });
2295
+ delete this.wsHandles[id.key()];
2296
+ }
2030
2297
  });
2031
2298
  this.wsHandles[id.key()] = {
2032
2299
  type: "created",
@@ -2042,144 +2309,6 @@ class HttpExtension {
2042
2309
  return handle.ws;
2043
2310
  }
2044
2311
  }
2045
-
2046
- class OmuResponse {
2047
- headers;
2048
- ok;
2049
- redirected;
2050
- status;
2051
- statusText;
2052
- type;
2053
- url;
2054
- body;
2055
- bodyUsed;
2056
- constructor(headers, ok, redirected, status, statusText, type, url, body, bodyUsed) {
2057
- this.headers = headers;
2058
- this.ok = ok;
2059
- this.redirected = redirected;
2060
- this.status = status;
2061
- this.statusText = statusText;
2062
- this.type = type;
2063
- this.url = url;
2064
- this.body = body;
2065
- this.bodyUsed = bodyUsed;
2066
- }
2067
- clone() {
2068
- return new OmuResponse(this.headers, this.ok, this.redirected, this.status, this.statusText, this.type, this.url, this.body, this.bodyUsed);
2069
- }
2070
- async arrayBuffer() {
2071
- return await new Response(this.body).arrayBuffer();
2072
- }
2073
- blob() {
2074
- return new Response(this.body).blob();
2075
- }
2076
- bytes() {
2077
- return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));
2078
- }
2079
- formData() {
2080
- return new Response(this.body).formData();
2081
- }
2082
- json() {
2083
- return new Response(this.body).json();
2084
- }
2085
- text() {
2086
- return new Response(this.body).text();
2087
- }
2088
- }
2089
-
2090
- class OmuWS {
2091
- omu;
2092
- id;
2093
- addQueue;
2094
- dispose;
2095
- receiveQueue;
2096
- receiveResolve;
2097
- status;
2098
- constructor(omu, id, addQueue, dispose, receiveQueue = [], receiveResolve = undefined, status = "connecting") {
2099
- this.omu = omu;
2100
- this.id = id;
2101
- this.addQueue = addQueue;
2102
- this.dispose = dispose;
2103
- this.receiveQueue = receiveQueue;
2104
- this.receiveResolve = receiveResolve;
2105
- this.status = status;
2106
- }
2107
- static create(omu, id, addQueue, dispose) {
2108
- const ws = new OmuWS(omu, id, addQueue, dispose);
2109
- return {
2110
- ws,
2111
- open: (response) => {
2112
- ws.receiveQueue.push({
2113
- type: "open",
2114
- data: response
2115
- });
2116
- ws.receiveResolve?.();
2117
- },
2118
- dispatch: (data) => {
2119
- if (data.meta.type === WSMsgType.BINARY) {
2120
- ws.receiveQueue.push({
2121
- type: "binary",
2122
- data: data.body
2123
- });
2124
- } else {
2125
- ws.receiveQueue.push({
2126
- type: "text",
2127
- data: textDecoder.decode(data.body)
2128
- });
2129
- }
2130
- ws.receiveResolve?.();
2131
- },
2132
- close: (response) => {
2133
- ws.receiveQueue.push({
2134
- type: "close",
2135
- data: response
2136
- });
2137
- ws.receiveResolve?.();
2138
- },
2139
- error: (response) => {
2140
- ws.receiveQueue.push({
2141
- type: "error",
2142
- data: response
2143
- });
2144
- ws.receiveResolve?.();
2145
- }
2146
- };
2147
- }
2148
- send(data) {
2149
- this.addQueue(data);
2150
- }
2151
- close(code, reason) {
2152
- this.omu.send(WEBSOCKET_CLOSE, {
2153
- id: this.id.key(),
2154
- code,
2155
- reason
2156
- });
2157
- this.dispose();
2158
- }
2159
- async receive() {
2160
- if (this.receiveResolve) {
2161
- throw new Error("Already receiving from another async call");
2162
- }
2163
- while (this.status !== "closed") {
2164
- const data = this.receiveQueue.shift();
2165
- if (!data) {
2166
- await new Promise((resolve) => this.receiveResolve = resolve);
2167
- continue;
2168
- }
2169
- if (data.type === "close") {
2170
- this.status = "closed";
2171
- }
2172
- if (data.type === "open") {
2173
- this.status = "open";
2174
- }
2175
- this.receiveResolve = undefined;
2176
- return data;
2177
- }
2178
- throw new Error("Receiving on already closed socket");
2179
- }
2180
- protocol = "";
2181
- url = "";
2182
- }
2183
2312
  async function toUint8Array(data) {
2184
2313
  if (typeof data === "string") {
2185
2314
  return textEncoder.encode(data);
@@ -2736,6 +2865,9 @@ class PermissionExtension {
2736
2865
  has(permissionIdentifier) {
2737
2866
  return this.permissions.has(permissionIdentifier);
2738
2867
  }
2868
+ required(permissionIdentifier) {
2869
+ return this.requiredPermissions.has(permissionIdentifier);
2870
+ }
2739
2871
  }
2740
2872
 
2741
2873
  // src/api/plugin/extension.ts
@@ -3967,7 +4099,7 @@ class InternalError extends DisconnectReason {
3967
4099
  }
3968
4100
 
3969
4101
  // src/version.ts
3970
- var VERSION = "0.9.31";
4102
+ var VERSION = "0.9.40";
3971
4103
 
3972
4104
  // src/network/connection.ts
3973
4105
  class PacketMapper {
@@ -4664,5 +4796,5 @@ export {
4664
4796
  Omu
4665
4797
  };
4666
4798
 
4667
- //# debugId=B2EF3B0BDCB9070464756E2164756E21
4668
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9zcmMvYXBpL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvYXNzZXQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9yZWdpc3RyeS50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3RhYmxlLnRzIiwgIi4uLy4uL3NyYy9hcGkvZGFzaGJvYXJkL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2V2ZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9sb2NrLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL2kxOG4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvbG9nZ2VyL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9wZXJtaXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGVybWlzc2lvbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9wbHVnaW4vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NlcnZlci9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXNzaW9uL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2lnbmFsL3NpZ25hbC50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2Vycm9ycy50cyIsICIuLi8uLi9zcmMvdmVyc2lvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9jb25uZWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2VuY3J5cHRpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvbmV0d29yay50cyIsICIuLi8uLi9zcmMvbmV0d29yay93ZWJzb2NrZXQtdHJhbnNwb3J0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXIudHMiLCAiLi4vLi4vc3JjL3Rva2VuLnRzIiwgIi4uLy4uL3NyYy9vbXUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBFeHRlbnNpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHJlZ2lzdGVyPFQgZXh0ZW5kcyBFeHRlbnNpb24+KHR5cGU6IEV4dGVuc2lvblR5cGU8VD4pOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uTWFwLmhhcyh0eXBlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVuc2lvbiB0eXBlICR7dHlwZS5uYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0eXBlLmNyZWF0ZSh0aGlzLm9tdSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uTWFwLnNldCh0eXBlLm5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIHJldHVybiBleHRlbnNpb247XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5cbmNvbnN0IE5BTUVTUEFDRV9SRUdFWCA9IC9eKFxcLlteLzouXXxbXFx3LV0pKyQvO1xuY29uc3QgTkFNRV9SRUdFWCA9IC9eW14vOl0rJC87XG5cbmV4cG9ydCB0eXBlIEludG9JZCA9IElkZW50aWZpZXIgfCBzdHJpbmcgfCBFeHRlbnNpb25UeXBlIHwgQXBwO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllciB7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgLi4ucGF0aDogc3RyaW5nW11cbiAgICApIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tKGlkOiBJbnRvSWQpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgQXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gaW5mZXJcbiAgICAgICAgICAgIC8vIFZpdGUgZG9lcyBub3QgcHJlc2VydmUgY2xhc3MgaW5mb3JtYXRpb24gd2hlbiBpbXBvcnRpbmcgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXNcbiAgICAgICAgICAgIGNvbnN0IGlkQ2FzdGVkID0gaWQgYXMgeyBuYW1lc3BhY2U6IHN0cmluZzsgcGF0aDogc3RyaW5nW10gfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaWRDYXN0ZWQubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaWRDYXN0ZWQucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBpZENhc3RlZC5wYXRoLmV2ZXJ5KChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoaWRDYXN0ZWQubmFtZXNwYWNlLCAuLi5pZENhc3RlZC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkV2l0aElkID0gaWQgYXMgeyBpZDogSW50b0lkIHwgdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkV2l0aElkLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWRXaXRoSWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCB0byBJZGVudGlmaWVyOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT3B0aW9uYWwoaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB8IG51bGwpOiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlKG5hbWVzcGFjZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdGg6IFBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOQU1FU1BBQ0VfUkVHRVgudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgbXVzdCBtYXRjaCAke05BTUVTUEFDRV9SRUdFWH1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0aCkge1xuICAgICAgICAgICAgaWYgKCFOQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aDogTmFtZSBtdXN0IG1hdGNoICR7TkFNRV9SRUdFWH0gYnV0IGdvdCAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ybWF0KG5hbWVzcGFjZTogc3RyaW5nLCAuLi5wYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRoLmpvaW4oJy8nKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tS2V5KGtleTogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGtleS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBObyBzZXBhcmF0b3IgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCc6Jywgc2VwYXJhdG9yICsgMSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBNdWx0aXBsZSBzZXBhcmF0b3JzIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCAhcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleTogTmFtZXNwYWNlIGFuZCBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGguc3BsaXQoJy8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gSWRlbnRpZmllci5uYW1lc3BhY2VGcm9tVXJsKHBhcnNlZFVybC5ocmVmKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKS5zcGxpdCgnLycpO1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5hbWVzcGFjZUZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKCkuam9pbignLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZm9ybWF0KHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpID09PSBvdGhlci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOYW1lc3BhY2VFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgPT09IG90aGVyLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWJwYXRoT2Yob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlICE9PSBvdGhlci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXRoLmxlbmd0aCA8IG90aGVyLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlci5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXRoW2ldICE9PSBvdGhlci5wYXRoW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGg6IHN0cmluZ1tdKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoLCAuLi5wYXRoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyTWFwPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcDogTWFwPHN0cmluZywgVD4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudHJpZXM/OiBJdGVyYWJsZTxbSWRlbnRpZmllciwgVF0+LFxuICAgICkge1xuICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoaWQua2V5KCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLnNldChpZGVudGlmaWVyLmtleSgpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtJZGVudGlmaWVyLmZyb21LZXkoa2V5KSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyU2V0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmFkZChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICAgICAgeWllbGQgW2lkZW50aWZpZXIsIGlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uL29tdSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uIHtcbiAgICByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHlwZTxUIGV4dGVuZHMgRXh0ZW5zaW9uID0gRXh0ZW5zaW9uPiBleHRlbmRzIElkZW50aWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlOiAob211OiBPbXUpID0+IFQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCdleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBKc29uVHlwZSwgdHlwZSBTZXJpYWxpemFibGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRUeXBlPFJlcSA9IHVua25vd24sIFJlcyA9IHVua25vd24+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25JZD86IElkZW50aWZpZXIgfCB1bmRlZmluZWQsXG4gICAgKSB7IH1cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFJlcSwgUmVzLCBSZXFEYXRhIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZSwgUmVzRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVxLCBSZXFEYXRhPjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxSZXMsIFJlc0RhdGE+O1xuICAgICAgICAgICAgcGVybWlzc2lvbklkPzogSW50b0lkO1xuICAgICAgICB9LFxuICAgICk6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4ge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXEsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXF1ZXN0U2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFJlcywgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KHJlc3BvbnNlU2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkID8gSWRlbnRpZmllci5mcm9tKHBlcm1pc3Npb25JZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8UmVxLCBSZXM+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXEsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVzLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcixcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8QXNzZXRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2Fzc2V0JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBBc3NldEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IHR5cGUgQXNzZXQgPSB7XG4gICAgaWRlbnRpZmllcjogSWRlbnRpZmllcjtcbiAgICBidWZmZXI6IFVpbnQ4QXJyYXk7XG59O1xuXG5jb25zdCBGSUxFX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldCwgVWludDhBcnJheT4oXG4gICAgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGZpbGUuaWRlbnRpZmllci5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZmlsZS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH0sXG4gICAgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHsgaWRlbnRpZmllciwgYnVmZmVyIH07XG4gICAgfSxcbik7XG5jb25zdCBGSUxFX0FSUkFZX1NFUklBTElaRVIgPSBuZXcgU2VyaWFsaXplcjxBc3NldFtdLCBVaW50OEFycmF5PihcbiAgICAoZmlsZXMpID0+IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChmaWxlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhmaWxlLmlkZW50aWZpZXIua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShmaWxlLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmaWxlczogQXNzZXRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgaWRlbnRpZmllciwgYnVmZmVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCd1cGxvYWQnKTtcbmNvbnN0IEFTU0VUX1VQTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0LCBJZGVudGlmaWVyPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfVVBMT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0W10sIElkZW50aWZpZXJbXT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBsb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1VQTE9BRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuZXhwb3J0IGNvbnN0IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkb3dubG9hZCcpO1xuY29uc3QgQVNTRVRfRE9XTkxPQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyLCBBc3NldD4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZG93bmxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS5waXBlKFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBGSUxFX1NFUklBTElaRVIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfRE9XTkxPQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RPV05MT0FEX01BTllfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxJZGVudGlmaWVyW10sIEFzc2V0W10+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2Rvd25sb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RPV05MT0FEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5leHBvcnQgY29uc3QgQVNTRVRfREVMRVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdkZWxldGUnKTtcbmNvbnN0IEFTU0VUX0RFTEVURV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIG51bGw+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX0RFTEVURV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXRFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEFzc2V0RXh0ZW5zaW9uPiA9IEFTU0VUX0VYVEVOU0lPTl9UWVBFO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoaWRlbnRpZmllcjogSW50b0lkLCBidWZmZXI6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPElkZW50aWZpZXI+IHtcbiAgICAgICAgY29uc3QgYXNzZXRJZGVudGlmaWVyID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfVVBMT0FEX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBidWZmZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXNzZXRJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRNYW55KC4uLmZpbGVzOiBBc3NldFtdKTogUHJvbWlzZTxJZGVudGlmaWVyW10+IHtcbiAgICAgICAgY29uc3QgdXBsb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCwgZmlsZXMpO1xuICAgICAgICByZXR1cm4gdXBsb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkKGlkZW50aWZpZXI6IEludG9JZCk6IFByb21pc2U8QXNzZXQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ET1dOTE9BRF9FTkRQT0lOVCwgaWQpO1xuICAgICAgICByZXR1cm4gZG93bmxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRNYW55KC4uLmlkZW50aWZpZXJzOiBJbnRvSWRbXSk6IFByb21pc2U8QXNzZXRbXT4ge1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5ULFxuICAgICAgICAgICAgaWRlbnRpZmllcnMubWFwKChpZCkgPT4gSWRlbnRpZmllci5mcm9tKGlkKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkb3dubG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoaWRlbnRpZmllcjogSW50b0lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ERUxFVEVfRU5EUE9JTlQsIGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKFxuICAgICAgICBpZDogSW50b0lkLFxuICAgICAgICBvcHRpb25zPzogeyBjYWNoZT86ICduby1jYWNoZScgfSxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgaWYgKG9wdGlvbnM/LmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHthZGRyZXNzLmhvc3R9OiR7YWRkcmVzcy5wb3J0fS9hc3NldD9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfSZ0PSR7RGF0ZS5ub3coKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2FkZHJlc3MuaG9zdH06JHthZGRyZXNzLnBvcnR9L2Fzc2V0P2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7YWRkcmVzcy5ob3N0fToke2FkZHJlc3MucG9ydH0vcHJveHk/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICByZWFkPzogc3RyaW5nO1xuICAgIHdyaXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5UGVybWlzc2lvbnMge1xuICAgIGFsbD86IEludG9JZDtcbiAgICByZWFkPzogSW50b0lkO1xuICAgIHdyaXRlPzogSW50b0lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSW50b0lkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogVDtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIHBlcm1pc3Npb25zPzogUmVnaXN0cnlQZXJtaXNzaW9ucztcbiAgICB9KTogUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA/PyB7fSxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnk8VD4ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPjtcbiAgICByZWFkb25seSB2YWx1ZTogVDtcbiAgICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgICBzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIGxpc3RlbihmbjogKHZhbHVlOiBUKSA9PiB2b2lkKTogVW5saXN0ZW47XG5cbiAgICBjb21wYXRTdmVsdGUoKTogV3JpdGFibGU8VD47XG59XG5cbmV4cG9ydCB0eXBlIFN1YnNjcmliZXI8VD4gPSAodmFsdWU6IFQpID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlciA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZXI8VD4gPSAodmFsdWU6IFQpID0+IFQ7XG5cbmV4cG9ydCB0eXBlIFN0YXJ0U3RvcE5vdGlmaWVyPFQ+ID0gKFxuICAgIHNldDogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICAgIHVwZGF0ZTogKGZuOiBVcGRhdGVyPFQ+KSA9PiB2b2lkXG4pID0+IHZvaWQgfCAoKCkgPT4gdm9pZCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZGFibGU8VD4ge1xuICAgIHN1YnNjcmliZSh0aGlzOiB2b2lkLCBydW46IFN1YnNjcmliZXI8VD4pOiBVbnN1YnNjcmliZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGFibGU8VD4gZXh0ZW5kcyBSZWFkYWJsZTxUPiB7XG4gICAgc2V0KHRoaXM6IHZvaWQsIHZhbHVlOiBUKTogdm9pZDtcbiAgICB1cGRhdGUodGhpczogdm9pZCwgdXBkYXRlcjogVXBkYXRlcjxUPik6IHZvaWQ7XG4gICAgd2FpdCgpOiBQcm9taXNlPFQ+O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1pdHRlciwgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgVGFibGVDb25maWcgPSB7XG4gICAgY2FjaGVfc2l6ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZTxUPiB7XG4gICAgcmVhZG9ubHkgY2FjaGU6IFJlYWRvbmx5TWFwPHN0cmluZywgVD47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IFRhYmxlRXZlbnRzPFQ+O1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgZ2V0TWFueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGFkZCguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZSguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaGFzTWFueTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KC4uLmtleXM6IChrZXlvZiBUKVtdKTogUHJvbWlzZTx7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfT47XG4gICAgaGFzQWxsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNBbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgZmV0Y2hJdGVtcyh7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgY3Vyc29yLFxuICAgIH06IHtcbiAgICAgICAgbGltaXQ6IG51bWJlcjtcbiAgICAgICAgYmFja3dhcmQ/OiBib29sZWFuO1xuICAgICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoUmFuZ2UoeyBzdGFydCwgZW5kIH06IHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoQWxsKCk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGl0ZXJhdGUoeyBiYWNrd2FyZCwgY3Vyc29yIH06IHsgYmFja3dhcmQ/OiBib29sZWFuOyBjdXJzb3I/OiBzdHJpbmcgfSk6IEFzeW5jSXRlcmFibGU8VD47XG4gICAgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj47XG5cbiAgICBwcm94eShwcm94eTogKGl0ZW06IFQpID0+IFQgfCB1bmRlZmluZWQpOiBVbmxpc3RlbjtcbiAgICBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZDtcbiAgICBzZXRDb25maWcoY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQ7XG4gICAgc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnM6IFRhYmxlUGVybWlzc2lvbnMpOiB2b2lkO1xuXG4gICAgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuO1xufVxuXG5leHBvcnQgdHlwZSBUYWJsZUV2ZW50czxUPiA9IHtcbiAgICBhZGQ6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICB1cGRhdGU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICByZW1vdmU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICBjbGVhcjogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICBjYWNoZVVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVQZXJtaXNzaW9ucyA9IHtcbiAgICBhbGw/OiBJZGVudGlmaWVyO1xuICAgIHJlYWQ/OiBJZGVudGlmaWVyO1xuICAgIHdyaXRlPzogSWRlbnRpZmllcjtcbiAgICByZW1vdmU/OiBJZGVudGlmaWVyO1xuICAgIHByb3h5PzogSWRlbnRpZmllcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyBrZXlGdW5jdGlvbjogKGl0ZW06IFQpID0+IHN0cmluZyxcbiAgICAgICAgcHVibGljIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucyB8IHVuZGVmaW5lZCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICB9LFxuICAgICk6IFRhYmxlVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIEFwcEluc3RhbGxSZXNwb25zZSA9IHtcbiAgICBhY2NlcHRlZDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wRmlsZSA9IHtcbiAgICB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5JztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BQb3NpdGlvbiA9IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0VudGVyID0ge1xuICAgIHR5cGU6ICdlbnRlcic7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGZpbGVzOiBEcmFnRHJvcEZpbGVbXTtcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdPdmVyID0ge1xuICAgIHR5cGU6ICdvdmVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcCA9IHtcbiAgICB0eXBlOiAnZHJvcCc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xuICAgIGZpbGVzOiBEcmFnRHJvcEZpbGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdMZWF2ZSA9IHtcbiAgICB0eXBlOiAnbGVhdmUnO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdTdGF0ZSA9IERyYWdFbnRlciB8IERyYWdPdmVyIHwgRHJhZ0Ryb3AgfCBEcmFnTGVhdmU7XG5cbmV4cG9ydCB0eXBlIEZpbGVEcmFnUGFja2V0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBhcHA6IEFwcDtcbiAgICBzdGF0ZTogRHJhZ1N0YXRlO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZWFkUmVxdWVzdCA9IHtcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRNZXRhID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IHJlYWRvbmx5IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZURhdGEgPSB7XG4gICAgZmlsZTogRHJhZ0Ryb3BGaWxlO1xuICAgIGJ1ZmZlcjogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCBjbGFzcyBEcmFnRHJvcFJlYWRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBEcmFnRHJvcFJlYWRNZXRhLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZXM6IFJlY29yZDxzdHJpbmcsIEZpbGVEYXRhPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IG51bWJlciA9IDEsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChkYXRhLnZlcnNpb24pO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoZGF0YS5tZXRhKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgoT2JqZWN0LmtleXMoZGF0YS5maWxlcykubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHsgZmlsZSwgYnVmZmVyIH1dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsZXMpKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShmaWxlKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBtZXRhOiBEcmFnRHJvcFJlYWRNZXRhID0gSlNPTi5wYXJzZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXM6IFJlY29yZDxzdHJpbmcsIEZpbGVEYXRhPiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgZmlsZTogRHJhZ0Ryb3BGaWxlID0gSlNPTi5wYXJzZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgZmlsZXNba2V5XSA9IHsgZmlsZSwgYnVmZmVyIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IERyYWdEcm9wUmVhZFJlc3BvbnNlKFxuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdCA9IG9iamVjdDtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBhcHA6IEFwcEpzb247XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZSA9IHtcbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgb2s6IGJvb2xlYW47XG59O1xuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlSnNvbiB9IGZyb20gJy4uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5qcyc7XG5pbXBvcnQgeyBQYWNrYWdlSW5mbyB9IGZyb20gJy4uL3BsdWdpbi9wYWNrYWdlLWluZm8uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5L3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IEFwcEluZGV4UmVnaXN0cnlNZXRhIH0gZnJvbSAnLi4vc2VydmVyL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuaW1wb3J0IHsgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZEhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXIuanMnO1xuaW1wb3J0IHsgQXBwSW5zdGFsbFJlc3BvbnNlLCBEcmFnRHJvcCwgRHJhZ0Ryb3BSZWFkUmVxdWVzdCwgRHJhZ0Ryb3BSZWFkUmVxdWVzdERhc2hib2FyZCwgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsIERyYWdEcm9wUmVxdWVzdCwgRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkLCBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZSwgRHJhZ0VudGVyLCBEcmFnTGVhdmUsIERyYWdPdmVyLCBGaWxlRHJhZ1BhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdkYXNoYm9hcmQnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IERhc2hib2FyZEV4dGVuc2lvbihvbXUpLFxuKTtcblxudHlwZSBEYXNoYm9hcmRTZXRSZXNwb25zZSA9IHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xufTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc2V0Jyk7XG5jb25zdCBEQVNIQk9BUkRfU0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllciwgRGFzaGJvYXJkU2V0UmVzcG9uc2U+KFxuICAgIERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdzZXQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogSWRlbnRpZmllcixcbiAgICAgICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ29wZW4nKTtcbmNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEFwcCwgdm9pZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ29wZW5fYXBwJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogQXBwLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248QXBwPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb3Blbl9hcHAnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbn0pO1xuZXhwb3J0IGNvbnN0IERBU0hPQkFSRF9BUFBfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgREFTSE9CQVJEX0FQUF9FRElUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ2VkaXQnKTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfQVBQX0lOU1RBTExfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnaW5zdGFsbCcpO1xuY29uc3QgREFTSEJPQVJEX0FQUF9JTlNUQUxMX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248QXBwLCBBcHBJbnN0YWxsUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnN0YWxsX2FwcCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IEFwcCxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lELFxufSk7XG5leHBvcnQgY29uc3QgREFTaEJPQVJEX0RSQUdfRFJPUF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2RyYWdfZHJvcCcpO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RmlsZURyYWdQYWNrZXQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3Bfc3RhdGUnLFxuICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxGaWxlRHJhZ1BhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2FwcCcsIEFwcCksXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPERyYWdEcm9wUmVhZFJlcXVlc3QsIERyYWdEcm9wUmVhZFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWQnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IERyYWdEcm9wUmVhZFJlc3BvbnNlLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZWFkUmVxdWVzdERhc2hib2FyZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkX3JlcXVlc3QnLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERyYWdEcm9wUmVhZFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWRfcmVzcG9uc2UnLFxuICAgIHNlcmlhbGl6ZXI6IERyYWdEcm9wUmVhZFJlc3BvbnNlLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3QsIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3QnLFxuICAgIHBlcm1pc3Npb25JZDogREFTaEJPQVJEX0RSQUdfRFJPUF9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdERhc2hib2FyZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0Jyxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0FQUFJPVkFMX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3RSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0X2FwcHJvdmFsJyxcbn0pO1xuXG50eXBlIERyYWdEcm9wSGFuZGxlciA9IHtcbiAgICBvbkVudGVyKGZuOiAoZXZlbnQ6IERyYWdFbnRlcikgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25PdmVyKGZuOiAoZXZlbnQ6IERyYWdPdmVyKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbkRyb3AoZm46IChldmVudDogRHJhZ0Ryb3ApID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uTGVhdmUoZm46IChldmVudDogRHJhZ0xlYXZlKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICByZWFkKGlkOiBzdHJpbmcpOiBQcm9taXNlPERyYWdEcm9wUmVhZFJlc3BvbnNlPjtcbn07XG5cbmV4cG9ydCB0eXBlIENvb2tpZSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdSZXF1ZXN0ID0ge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHNjcmlwdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld1BhY2tldCA9IHtcbiAgICBpZDogSWRlbnRpZmllcjtcbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJSZXNwb25zZTxUID0gdW5kZWZpbmVkPiA9IHtcbiAgICB0eXBlOiAnb2snO1xuICAgIHZhbHVlOiBUO1xufSB8IHtcbiAgICB0eXBlOiAnYmxvY2tlZCc7XG59IHwge1xuICAgIHR5cGU6ICdjYW5jZWxsZWQnO1xufTtcbmV4cG9ydCBjbGFzcyBVc2VyUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlc3VsdDoge1xuICAgICAgICAgICAgdHlwZTogJ29rJztcbiAgICAgICAgICAgIHZhbHVlOiBUO1xuICAgICAgICB9IHwge1xuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrZWQnO1xuICAgICAgICB9IHwge1xuICAgICAgICAgICAgdHlwZTogJ2NhbmNlbGxlZCc7XG4gICAgICAgIH0sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHVud3JhcCgpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0LnR5cGUgPT09ICdvaycpIHJldHVybiB0aGlzLnJlc3VsdC52YWx1ZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1bndyYXAgYSAke3RoaXMucmVzdWx0LnR5cGV9IHJlc3VsdGApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgV2Vidmlld1Jlc3BvbnNlID0gVXNlclJlc3BvbnNlICYgV2Vidmlld1BhY2tldDtcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignd2VidmlldycpO1xuXG5leHBvcnQgdHlwZSBIb3N0UmVxdWVzdCA9IHtcbiAgICBob3N0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZXRDb29raWVzUmVxdWVzdCA9IHtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9DT09LSUVTX0dFVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEdldENvb2tpZXNSZXF1ZXN0LCBVc2VyUmVzcG9uc2U8Q29va2llW10+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnY29va2llc19nZXQnLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248V2Vidmlld1JlcXVlc3QsIFdlYnZpZXdSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfcmVxdWVzdCcsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1Jlc3BvbnNlPigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3UGFja2V0LCBXZWJ2aWV3UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X2Nsb3NlJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdSZXNwb25zZT4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudCA9IHtcbiAgICB0eXBlOiAnY2xvc2VkJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc2l6ZSc7XG4gICAgZGltZW50aW9uczoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICB9O1xufSB8IHtcbiAgICB0eXBlOiAnY29va2llJztcbiAgICBjb29raWVzOiBDb29raWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudExpc3RlbmVycyA9IHtcbiAgICBbSyBpbiBXZWJ2aWV3RXZlbnRbJ3R5cGUnXV0/OiBBcnJheTwoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IEsgfT4pID0+IHZvaWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50UGFja2V0ID0ge1xuICAgIGlkOiBJZGVudGlmaWVyO1xuICAgIHRhcmdldDogSWRlbnRpZmllcjtcbiAgICBldmVudDogV2Vidmlld0V2ZW50O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0hhbmRsZSA9IHtcbiAgICByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgICBnZXRDb29raWVzKCk6IFByb21pc2U8Q29va2llW10+O1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgb248VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkO1xuICAgIGpvaW4oKTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudEVtaXQgPSA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9PikgPT4gdm9pZDtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfRVZFTlRfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdFdmVudFBhY2tldD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfZXZlbnQnLFxuICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3RXZlbnRQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpXG4gICAgICAgIC5maWVsZCgndGFyZ2V0JywgSWRlbnRpZmllciksXG59KTtcblxudHlwZSBBbGxvd2VkSG9zdCA9IHtcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgYXBwczogSWRlbnRpZmllcltdO1xufTtcblxuY29uc3QgREFTSEJPQVJEX0FMTE9XRURfSE9TVFMgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbjxBbGxvd2VkSG9zdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2hvc3RzJyxcbiAgICBrZXk6IChlbnRyeSkgPT4gZW50cnkuaG9zdCxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8QWxsb3dlZEhvc3Q+KClcbiAgICAgICAgLmZpZWxkKCdhcHBzJywgU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkpLFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9IT1NUX1JFUVVFU1QgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjx7XG4gICAgaG9zdDogc3RyaW5nO1xufSwgVXNlclJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaG9zdF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdzcGVlY2hfcmVjb2duaXRpb24nKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNjcmlwdFNlZ21lbnQgPSB7XG4gICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgIHRyYW5zY3JpcHQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRTdGF0dXMgPSB7XG4gICAgdHlwZTogJ2lkbGUnO1xufSB8IHtcbiAgICB0eXBlOiAncmVzdWx0JztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBzZWdtZW50czogVHJhbnNjcmlwdFNlZ21lbnRbXTtcbn0gfCB7XG4gICAgdHlwZTogJ2ZpbmFsJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBzZWdtZW50czogVHJhbnNjcmlwdFNlZ21lbnRbXTtcbn0gfCB7XG4gICAgdHlwZTogJ2F1ZGlvX3N0YXJ0ZWQnO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xufSB8IHtcbiAgICB0eXBlOiAnYXVkaW9fZW5kZWQnO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xufTtcblxuY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTiA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFRyYW5zY3JpcHRTdGF0dXM+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzcGVlY2hfcmVjb2duaXRpb24nLFxuICAgIGRlZmF1bHRWYWx1ZTogeyB0eXBlOiAnaWRsZScgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHdyaXRlOiBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBTcGVlY2hSZWNvZ25pdGlvblN0YXJ0ID0ge1xuICAgIHR5cGU6ICdzdGFydCc7XG59O1xuXG5jb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1NUQVJUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248U3BlZWNoUmVjb2duaXRpb25TdGFydCwgVXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzcGVlY2hfcmVjb2duaXRpb25fc3RhcnQnLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxufSk7XG5cbmludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QmFzZTxUIGV4dGVuZHMgc3RyaW5nPiB7XG4gICAga2luZDogVDtcbiAgICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBQZXJtaXNzaW9ucyBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdhcHAvcGVybWlzc2lvbnMnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uVHlwZUpzb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwUGx1Z2lucyBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdhcHAvcGx1Z2lucyc+IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgcGFja2FnZXM6IFBhY2thZ2VJbmZvW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcEluc3RhbGwgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL2luc3RhbGwnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgQXBwSnNvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFVwZGF0ZSBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdhcHAvdXBkYXRlJz4ge1xuICAgIG9sZF9hcHA6IEFwcEpzb247XG4gICAgbmV3X2FwcDogQXBwSnNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2luZGV4L2luc3RhbGwnPiB7XG4gICAgaW5kZXhfdXJsOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXF1ZXN0ID0gKFxuICAgIFByb21wdFJlcXVlc3RBcHBQZXJtaXNzaW9uc1xuICAgIHwgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnNcbiAgICB8IFByb21wdFJlcXVlc3RBcHBJbnN0YWxsXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwVXBkYXRlXG4gICAgfCBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsXG4pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVxdWVzdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXF1ZXN0Jyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXN1bHQgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdibG9jayc7XG5cbmludGVyZmFjZSBQcm9tcHRSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBraW5kOiBzdHJpbmc7XG4gICAgcmVzdWx0OiBQcm9tcHRSZXN1bHQ7XG59XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfcmVzcG9uc2UnLFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPG51bGwsIG51bGw+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfY2xlYXJfYmxvY2tlZCcsXG59KTtcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGRhc2hib2FyZDogRGFzaGJvYXJkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZHJhZ0Ryb3BIYW5kbGVyOiBEcmFnRHJvcEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wTGlzdGVuZXJzID0ge1xuICAgICAgICBlbnRlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRW50ZXIpID0+IHVua25vd24+LFxuICAgICAgICBvdmVyOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdPdmVyKSA9PiB1bmtub3duPixcbiAgICAgICAgZHJvcDogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRHJvcCkgPT4gdW5rbm93bj4sXG4gICAgICAgIGxlYXZlOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdMZWF2ZSkgPT4gdW5rbm93bj4sXG4gICAgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dlZEhvc3RzOiBUYWJsZTxBbGxvd2VkSG9zdD47XG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWVjaFJlY29nbml0aW9uOiBSZWdpc3RyeTxUcmFuc2NyaXB0U3RhdHVzPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdIYW5kbGVzOiBJZGVudGlmaWVyTWFwPHsgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlOyBlbWl0OiBXZWJ2aWV3RXZlbnRFbWl0IH0+ID0gbmV3IElkZW50aWZpZXJNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9QUk9NUFRfUkVRVUVTVCwgKHJlcXVlc3QpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21wdFJlcXVlc3QocmVxdWVzdCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCwgKGFwcCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3BlbkFwcChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmVudGVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Zlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5vdmVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZHJvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5kcm9wLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMubGVhdmUuZm9yRWFjaCgoZm4pID0+IGZuKHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud2Vidmlld0hhbmRsZXMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgICAgICAgICAgaGFuZGxlLmVtaXQocGFja2V0LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhvc3RzID0gb211LnRhYmxlcy5nZXQoREFTSEJPQVJEX0FMTE9XRURfSE9TVFMpO1xuICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uID0gb211LnJlZ2lzdHJpZXMuZ2V0KERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVJlcXVlc3RGb3JEYXNoYm9hcmQocmVxdWVzdDogUHJvbXB0UmVxdWVzdCk6IFByb21pc2U8UHJvbXB0UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIHN3aXRjaCAocmVxdWVzdC5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlUGVybWlzc2lvblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQbHVnaW5SZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL2luc3RhbGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlSW5zdGFsbEFwcChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC91cGRhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlVXBkYXRlQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnaW5kZXgvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbmRleEluc3RhbGwocmVxdWVzdCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9tcHQgcmVxdWVzdGVkOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3Q6IFByb21wdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0Rm9yRGFzaGJvYXJkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UsIHtcbiAgICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLFxuICAgICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPcGVuQXBwKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVPcGVuQXBwKGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULCB7XG4gICAgICAgICAgICBvazogYWNjZXB0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0LnJlcXVlc3RfaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0OiBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkKCk6IERhc2hib2FyZEhhbmRsZXIge1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9DT09LSUVTX0dFVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPENvb2tpZVtdPj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSG9zdCA9IGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLmdldChob3N0bmFtZSkgPz8geyBob3N0OiBob3N0bmFtZSwgYXBwczogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhbGxvd2VkSG9zdC5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5nZXRDb29raWVzKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX0hPU1RfUkVRVUVTVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3QgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCBob3N0RW50cnkgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaG9zdCkgPz8geyBob3N0LCBhcHBzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGhvc3RFbnRyeS5hcHBzLnNvbWUoKGhvc3QpID0+IGhvc3QuaXNFcXVhbChwYXJhbXMuY2FsbGVyKSk7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5ob3N0UmVxdWVzdGVkKHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICBob3N0RW50cnkuYXBwcy5wdXNoKHBhcmFtcy5jYWxsZXIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLnVwZGF0ZShob3N0RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdCA9IGFzeW5jIChldmVudDogV2Vidmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyYW1zLmNhbGxlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuY3JlYXRlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMsIGVtaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuZ2V0V2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZGFzaGJvYXJkLmNsb3NlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5zcGVlY2hSZWNvZ25pdGlvblN0YXJ0KHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCxcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0IGRhc2hib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEhvc3Qob3B0aW9uczogeyBob3N0OiBzdHJpbmcgfSk6IFByb21pc2U8VXNlclJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9IT1NUX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0V2VidmlldyhvcHRpb25zOiBXZWJ2aWV3UmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxXZWJ2aWV3SGFuZGxlPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdvaycpIHJldHVybiBuZXcgVXNlclJlc3VsdChyZXN1bHQpO1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgY29uc3QgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsXG4gICAgICAgICAgICAgICAgICAgIHsgaWQgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvb2tpZXM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVzID0gKGF3YWl0IHRoaXMuZ2V0Q29va2llcyh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgfSkpLnVud3JhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1trZXldITtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgam9pbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5vbignY2xvc2VkJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vidmlld0hhbmRsZXMuc2V0KGlkLCB7XG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICBlbWl0OiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9Pik6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoe1xuICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgIHZhbHVlOiBoYW5kbGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb29raWVzKG9wdGlvbnM6IEdldENvb2tpZXNSZXF1ZXN0KTogUHJvbWlzZTxVc2VyUmVzdWx0PENvb2tpZVtdPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfQ09PS0lFU19HRVQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5ULCBhcHApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbnN0YWxsQXBwKGFwcDogQXBwKTogUHJvbWlzZTxBcHBJbnN0YWxsUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXJCbG9ja2VkUHJvbXB0cygpOiBQcm9taXNlPG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVpcmVEcmFnRHJvcCgpOiBQcm9taXNlPERyYWdEcm9wSGFuZGxlcj4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfRU5EUE9JTlQsIHt9KTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5kcmFnRHJvcExpc3RlbmVycztcbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5vbXU7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyID0ge1xuICAgICAgICAgICAgb25FbnRlcihmbikgeyBsaXN0ZW5lcnMuZW50ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbk92ZXIoZm4pIHsgbGlzdGVuZXJzLm92ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkRyb3AoZm4pIHsgbGlzdGVuZXJzLmRyb3AucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkxlYXZlKGZuKSB7IGxpc3RlbmVycy5sZWF2ZS5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIGFzeW5jIHJlYWQoaWQpIHsgcmV0dXJuIGF3YWl0IGNsaWVudC5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfRU5EUE9JTlQsIHsgZHJhZ19pZDogaWQgfSk7IH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wSGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbm90aWZ5RHJvcERyYWdTdGF0ZShwYWNrZXQ6IEZpbGVEcmFnUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNwZWVjaFJlY29nbml0aW9uU3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fU1RBUlQsIHsgdHlwZTogJ3N0YXJ0JyB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZS9zZXJpYWxpemVyLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldC5qcyc7XG5cbmNvbnN0IElERU5USUZJRVIgPSBuZXcgSWRlbnRpZmllcignY29yZScsICdwYWNrZXQnKTtcblxudHlwZSBQcm90b2NvbEluZm8gPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudHlwZSBSU0FOdW1iZXJzID0ge1xuICAgIGU6IHN0cmluZztcbiAgICBuOiBzdHJpbmc7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXF1ZXN0ID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVzcG9uc2UgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG4gICAgYWVzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJNZXRhID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlcXVlc3QgfCBudWxsO1xuICAgIGhhc2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbnR5cGUgQ29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBhcHA6IEFwcEpzb247XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIENvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHA6IEFwcDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdG9rZW46IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuYXBwID0gb3B0aW9ucy5hcHA7XG4gICAgICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuICAgICAgICB0aGlzLmVuY3J5cHRpb24gPSBvcHRpb25zLmVuY3J5cHRpb24gPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXRKc29uKTogQ29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLmRlc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0KTogQ29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBEaXNjb25uZWN0VHlwZSB7XG4gICAgSU5WQUxJRF9UT0tFTiA9ICdpbnZhbGlkX3Rva2VuJyxcbiAgICBJTlZBTElEX09SSUdJTiA9ICdpbnZhbGlkX29yaWdpbicsXG4gICAgSU5WQUxJRF9WRVJTSU9OID0gJ2ludmFsaWRfdmVyc2lvbicsXG4gICAgSU5WQUxJRF9QQUNLRVRfVFlQRSA9ICdpbnZhbGlkX3BhY2tldF90eXBlJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9EQVRBID0gJ2ludmFsaWRfcGFja2V0X2RhdGEnLFxuICAgIElOVkFMSURfUEFDS0VUID0gJ2ludmFsaWRfcGFja2V0JyxcbiAgICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgQU5PVEhFUl9DT05ORUNUSU9OID0gJ2Fub3RoZXJfY29ubmVjdGlvbicsXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbl9kZW5pZWQnLFxuICAgIEFQUF9SRU1PVkVEID0gJ2FwcF9yZW1vdmVkJyxcbiAgICBTRVJWRVJfUkVTVEFSVCA9ICdzZXJ2ZXJfcmVzdGFydCcsXG4gICAgU0hVVERPV04gPSAnc2h1dGRvd24nLFxuICAgIENMT1NFID0gJ2Nsb3NlJyxcbn1cblxudHlwZSBEaXNjb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2UgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0KTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4gZGF0YS50b0pzb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBEaXNjb25uZWN0UGFja2V0LmZyb21Kc29uKGRhdGEpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSnNvbihkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IERpc2Nvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b0pzb24oKTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBBQ0tFVF9UWVBFUzoge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlPFNlcnZlck1ldGE+O1xuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGU8Q29ubmVjdFBhY2tldD47XG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZTxEaXNjb25uZWN0UGFja2V0PjtcbiAgICBUT0tFTjogUGFja2V0VHlwZTxzdHJpbmc+O1xuICAgIFJFQURZOiBQYWNrZXRUeXBlPHVuZGVmaW5lZD47XG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZTxVaW50OEFycmF5Pjtcbn0gPSB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxTZXJ2ZXJNZXRhPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdzZXJ2ZXJfbWV0YScsXG4gICAgfSksXG4gICAgQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPENvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBDb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEaXNjb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdkaXNjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogRGlzY29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBUT0tFTjogUGFja2V0VHlwZS5jcmVhdGVKc29uPHN0cmluZz4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAndG9rZW4nLFxuICAgIH0pLFxuICAgIFJFQURZOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248dW5kZWZpbmVkPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdyZWFkeScsXG4gICAgfSksXG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFVpbnQ4QXJyYXk+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2UnLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3AoKSxcbiAgICB9KSxcbn07XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZWdpc3RlclBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmRwb2ludHM6IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChpdGVtLmVuZHBvaW50cy5zaXplKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlbS5lbmRwb2ludHMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHZhbHVlPy5rZXkoKSA/PyAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGVuZHBvaW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KGVuZHBvaW50cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlZFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNhbGxlcjogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBJbnZva2VkUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAgY2FsbGVyOiBpdGVtLmNhbGxlci5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlZFBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBjYWxsZXI6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VkUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuY2FsbGVyKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEludm9rZWRQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VkUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludEludm9rZWRQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEludm9rZWRQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlZFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IEludm9rZWRQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW52b2tlZFBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEludm9rZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBkYXRhLmtleSxcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRJbnZva2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50SW52b2tlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhJbnZva2VQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSW52b2tlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEludm9rZVBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVycm9yOiBzdHJpbmcgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBSZXNwb25zZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgICAgICBlcnJvcjogaXRlbS5lcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBSZXNwb25zZVBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IG51bWJlcjtcbiAgICAgICAgICAgIGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICAgICAgZGF0YS5lcnJvcixcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IFJlc3BvbnNlUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhSZXNwb25zZVBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlc3BvbnNlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFbmRwb2ludEludm9rZWRQYWNrZXQsIEVuZHBvaW50SW52b2tlUGFja2V0LCBFbmRwb2ludFJlZ2lzdGVyUGFja2V0LCBFbmRwb2ludFJlc3BvbnNlUGFja2V0LCBJbnZva2VkUGFyYW1zLCBJbnZva2VQYXJhbXMsIFJlc3BvbnNlUGFyYW1zIH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEVuZHBvaW50RXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdlbmRwb2ludCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgRW5kcG9pbnRFeHRlbnNpb24ob211KSxcbik7XG5cbnR5cGUgQ2FsbFByb21pc2UgPSB7XG4gICAgcmVzb2x2ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxudHlwZSBFbmRwb2ludEhhbmRsZXIgPSB7XG4gICAgdHlwZTogRW5kcG9pbnRUeXBlO1xuICAgIGhhbmRsZXI6IChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkgPT4gUHJvbWlzZTxVaW50OEFycmF5Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RW5kcG9pbnRFeHRlbnNpb24+ID0gRU5EUE9JTlRfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBib3VuZEVuZHBvaW50cyA9IG5ldyBJZGVudGlmaWVyTWFwPEVuZHBvaW50SGFuZGxlcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlUHJvbWlzZXM6IE1hcDxudW1iZXIsIENhbGxQcm9taXNlPiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGNhbGxJZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmNhbGxJZCA9IE1hdGguZmxvb3IoKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxMDAwKTtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBFTkRQT0lOVF9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9JTlZPS0VfUEFDS0VULFxuICAgICAgICAgICAgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSW52b2tlZChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZ2V0KHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFJlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIGtleSAke3BhY2tldC5wYXJhbXMua2V5fSAoJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSlgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZGVsZXRlKHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmIChwYWNrZXQucGFyYW1zLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHBhY2tldC5wYXJhbXMuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9taXNlLnJlc29sdmUocGFja2V0LmJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlSW52b2tlZChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkge1xuICAgICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYm91bmRFbmRwb2ludHMuZ2V0KHBhY2tldC5wYXJhbXMuaWQpO1xuICAgICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY2VpdmVkIGludm9jYXRpb24gZm9yIHVua25vd24gZW5kcG9pbnQgJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSAoJHtwYWNrZXQucGFyYW1zLmtleX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVuZHBvaW50LmhhbmRsZXIocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULCBuZXcgRW5kcG9pbnRSZXNwb25zZVBhY2tldChcbiAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VQYXJhbXMocGFja2V0LnBhcmFtcy5pZCwgcGFja2V0LnBhcmFtcy5rZXksIG51bGwpLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KFxuICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVBhcmFtcyhwYWNrZXQucGFyYW1zLmlkLCBwYWNrZXQucGFyYW1zLmtleSwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKSxcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSgpLFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbmRwb2ludF0gb2YgdGhpcy5ib3VuZEVuZHBvaW50cykge1xuICAgICAgICAgICAgZW5kcG9pbnRzLnNldChrZXksIGVuZHBvaW50LnR5cGUucGVybWlzc2lvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgRW5kcG9pbnRSZWdpc3RlclBhY2tldChlbmRwb2ludHMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYmluZDxSZXEsIFJlcz4oXG4gICAgICAgIHR5cGU6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4sXG4gICAgICAgIGhhbmRsZXI6IChkYXRhOiBSZXEsIHBhcmFtczogSW52b2tlZFBhcmFtcykgPT4gUHJvbWlzZTxSZXM+LFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgZW5kcG9pbnRzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3VuZEVuZHBvaW50cy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW5kcG9pbnQgd2l0aCBpZCAke3R5cGUuaWQua2V5KCl9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmRFbmRwb2ludHMuc2V0KHR5cGUuaWQsIHsgdHlwZSwgaGFuZGxlcjogYXN5bmMgKHsgYnVmZmVyLCBwYXJhbXMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxID0gdHlwZS5yZXF1ZXN0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihyZXEsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5yZXNwb25zZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJlc3VsdCk7XG4gICAgICAgIH0gfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGw8UmVxLCBSZXM+KGVuZHBvaW50OiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+LCBkYXRhOiBSZXEpOiBQcm9taXNlPFJlcz4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNhbGxJZCsrO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VWludDhBcnJheT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVByb21pc2VzLnNldChrZXksIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9JTlZPS0VfUEFDS0VULCBuZXcgRW5kcG9pbnRJbnZva2VQYWNrZXQoXG4gICAgICAgICAgICBuZXcgSW52b2tlUGFyYW1zKGVuZHBvaW50LmlkLCBrZXkpLFxuICAgICAgICAgICAgZW5kcG9pbnQucmVxdWVzdFNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICApKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICByZXR1cm4gZW5kcG9pbnQucmVzcG9uc2VTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlKTtcbiAgICB9XG59XG5cbmNvbnN0IEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlZ2lzdGVyUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludEludm9rZVBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW52b2tlJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZVBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRJbnZva2VkUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnZva2VkJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZWRQYWNrZXQsXG59KTtcbmNvbnN0IEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlc3BvbnNlUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZScsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZXNwb25zZVBhY2tldCxcbn0pO1xuIiwKICAgICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi8uLi9jb25zdCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIsIEpzb25UeXBlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbic7XG5cbmV4cG9ydCBjb25zdCBIVFRQX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEh0dHBFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2h0dHAnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IEh0dHBFeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjb25zdCBIVFRQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEhUVFBfRVhURU5TSU9OX1RZUEUuam9pbigncmVxdWVzdCcpO1xuXG50eXBlIFJlcXVlc3RIYW5kbGUgPSB7XG4gICAgaWQ6IHN0cmluZztcbn07XG5cbnR5cGUgSHR0cFJlcXVlc3QgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICByZWRpcmVjdDogUmVxdWVzdFJlZGlyZWN0O1xuICAgIHVybDogc3RyaW5nO1xufTtcblxuY29uc3QgUkVRVUVTVF9DUkVBVEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlcXVlc3Q+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9jcmVhdGUnLFxufSk7XG5cbmNsYXNzIERhdGFDaHVuazxUIGV4dGVuZHMgSnNvblR5cGU+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IFQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZTxUIGV4dGVuZHMgSnNvblR5cGU+KGRhdGE6IERhdGFDaHVuazxUPik6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVKU09OKGRhdGEubWV0YSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZGF0YS5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplPFQgZXh0ZW5kcyBKc29uVHlwZT4oZGF0YTogVWludDhBcnJheSk6IERhdGFDaHVuazxUPiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IG1ldGEgPSByZWFkZXIucmVhZEpTT048VD4oKTtcbiAgICAgICAgY29uc3QgYm9keSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFDaHVuayhtZXRhLCBib2R5KTtcbiAgICB9XG59XG5cbmNvbnN0IFJFUVVFU1RfU0VORCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8UmVxdWVzdEhhbmRsZT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9zZW5kJyxcbiAgICBzZXJpYWxpemVyOiBEYXRhQ2h1bmssXG59KTtcblxudHlwZSBIdHRwUmVxdWVzdENsb3NlID0gUmVxdWVzdEhhbmRsZTtcblxuY29uc3QgUkVRVUVTVF9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdENsb3NlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3RfY2xvc2UnLFxufSk7XG5cbnR5cGUgSHR0cFJlc3BvbnNlID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBoZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIGhpc3Rvcnk6IEh0dHBSZXNwb25zZVtdO1xuICAgIHJlZGlyZWN0ZWQ6IGJvb2xlYW47XG59O1xuXG5jb25zdCBSRVNQT05TRV9DUkVBVEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlc3BvbnNlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2NyZWF0ZScsXG59KTtcblxuY29uc3QgUkVTUE9OU0VfQ0hVTksgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFJlcXVlc3RIYW5kbGU+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2NodW5rJyxcbiAgICBzZXJpYWxpemVyOiBEYXRhQ2h1bmssXG59KTtcblxuY29uc3QgUkVTUE9OU0VfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVxdWVzdEhhbmRsZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jbG9zZScsXG59KTtcblxudHlwZSBIYW5kbGVTdGF0ZVJlY2VpdmluZyA9IHtcbiAgICB0eXBlOiAncmVjZWl2aW5nJztcbiAgICByZWNlaXZlKGRhdGE6IFVpbnQ4QXJyYXkpOiB2b2lkO1xuICAgIGNsb3NlKCk6IHZvaWQ7XG59O1xuXG50eXBlIEhhbmRsZVN0YXRlQ3JlYXRlZCA9IHtcbiAgICB0eXBlOiAnY3JlYXRlZCc7XG4gICAgc2V0UmVzcG9uc2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZSk6IHZvaWQ7XG59O1xuXG50eXBlIEhhbmRsZVN0YXRlID0gSGFuZGxlU3RhdGVDcmVhdGVkIHwgSGFuZGxlU3RhdGVSZWNlaXZpbmc7XG5cbnR5cGUgV1NEYXRhID0gc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldztcblxuZXhwb3J0IGNvbnN0IFdTTXNnVHlwZSA9IHtcbiAgICBDT05USU5VQVRJT046IDB4MCxcbiAgICBURVhUOiAweDEsXG4gICAgQklOQVJZOiAweDIsXG4gICAgUElORzogMHg5LFxuICAgIFBPTkc6IDB4QSxcbiAgICBDTE9TRTogMHg4LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFdTQ2xvc2VDb2RlID0ge1xuICAgIE9LOiAxMDAwLFxuICAgIEdPSU5HX0FXQVk6IDEwMDEsXG4gICAgUFJPVE9DT0xfRVJST1I6IDEwMDIsXG4gICAgVU5TVVBQT1JURURfREFUQTogMTAwMyxcbiAgICBBQk5PUk1BTF9DTE9TVVJFOiAxMDA2LFxuICAgIElOVkFMSURfVEVYVDogMTAwNyxcbiAgICBQT0xJQ1lfVklPTEFUSU9OOiAxMDA4LFxuICAgIE1FU1NBR0VfVE9PX0JJRzogMTAwOSxcbiAgICBNQU5EQVRPUllfRVhURU5TSU9OOiAxMDEwLFxuICAgIElOVEVSTkFMX0VSUk9SOiAxMDExLFxuICAgIFNFUlZJQ0VfUkVTVEFSVDogMTAxMixcbiAgICBUUllfQUdBSU5fTEFURVI6IDEwMTMsXG4gICAgQkFEX0dBVEVXQVk6IDEwMTQsXG59IGFzIGNvbnN0O1xuXG50eXBlIFdlYlNvY2tldE9wZW4gPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcbn07XG50eXBlIFdlYlNvY2tldENsb3NlID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFdlYlNvY2tldEhhbmRsZSA9IHtcbiAgICB3czogT211V1M7XG4gICAgb3BlbjogKHJlc3BvbnNlOiBXZWJTb2NrZXRPcGVuKSA9PiB2b2lkO1xuICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KSA9PiB2b2lkO1xuICAgIGNsb3NlOiAocmVzcG9uc2U6IFdlYlNvY2tldENsb3NlKSA9PiB2b2lkO1xuICAgIGVycm9yOiAocmVzcG9uc2U6IFdlYlNvY2tldEVycm9yKSA9PiB2b2lkO1xufTtcblxudHlwZSBXU0RhdGFNZXRhID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTpcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlRFWFRcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLkJJTkFSWVxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUElOR1xuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUE9ORztcbn07XG5cbnR5cGUgV1NIYW5kbGVTdGF0ZSA9IHtcbiAgICB0eXBlOiAnY3JlYXRlZCcgfCAncmVjZWl2aW5nJztcbiAgICBoYW5kbGU6IFdlYlNvY2tldEhhbmRsZTtcbn07XG5cbmNvbnN0IFdFQlNPQ0tFVF9DUkVBVEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlcXVlc3Q+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfT1BFTiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRPcGVuPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX29wZW4nLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9EQVRBID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxXU0RhdGFNZXRhPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19kYXRhJyxcbiAgICBzZXJpYWxpemVyOiBEYXRhQ2h1bmssXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldENsb3NlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2Nsb3NlJyxcbn0pO1xuXG50eXBlIFdlYlNvY2tldEVycm9yID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICB0eXBlOiAnQ29ubmVjdGlvblJlZnVzZWQnO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBXRUJTT0NLRVRfRVJST1IgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0RXJyb3I+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfZXJyb3InLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1dHVyZTxUPigpOiB7XG4gICAgcHJvbWlzZTogUHJvbWlzZTxUPjtcbiAgICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZDtcbn0ge1xuICAgIGxldCByZXNvbHZlOiAoKHZhbHVlOiBUKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVqZWN0OiAoKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZSB8fCAhcmVqZWN0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgZnV0dXJlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0LFxuICAgIH07XG59XG5cbnR5cGUgV1NTZW5kVGFzayA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRhdGE6IFdTRGF0YTtcbn07XG5cbmV4cG9ydCBjbGFzcyBIdHRwRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxFeHRlbnNpb24+ID0gSFRUUF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlcXVlc3RDb3VudDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cEhhbmRsZXM6IFJlY29yZDxzdHJpbmcsIEhhbmRsZVN0YXRlIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd3NIYW5kbGVzOiBSZWNvcmQ8c3RyaW5nLCBXU0hhbmRsZVN0YXRlPiA9IHt9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd3NTZW5kUXVldWU6IFdTU2VuZFRhc2tbXSA9IFtdO1xuICAgIHByaXZhdGUgd3NTZW5kV2FpdFJlc29sdmU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFUVVFU1RfQ1JFQVRFLFxuICAgICAgICAgICAgUkVRVUVTVF9TRU5ELFxuICAgICAgICAgICAgUkVRVUVTVF9DTE9TRSxcbiAgICAgICAgICAgIFJFU1BPTlNFX0NSRUFURSxcbiAgICAgICAgICAgIFJFU1BPTlNFX0NIVU5LLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ0xPU0UsXG4gICAgICAgICAgICBXRUJTT0NLRVRfQ0xPU0UsXG4gICAgICAgICAgICBXRUJTT0NLRVRfQ1JFQVRFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0RBVEEsXG4gICAgICAgICAgICBXRUJTT0NLRVRfT1BFTixcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9FUlJPUixcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DUkVBVEUsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIGFscmVhZHkgaGFuZGxlZCByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuc2V0UmVzcG9uc2UocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ0hVTkssIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0Lm1ldGEuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAncmVjZWl2aW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgY2h1bmsgZm9yIG5vbi1yZWNlaXZpbmcgcmVxdWVzdCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUucmVjZWl2ZShwYWNrZXQuYm9keSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NMT1NFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAncmVjZWl2aW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgY2h1bmsgZm9yIG5vbi1yZWNlaXZpbmcgcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihXRUJTT0NLRVRfT1BFTiwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgYWxyZWFkeSBoYW5kbGVkIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5vcGVuKHBhY2tldCk7XG4gICAgICAgICAgICBoYW5kbGUudHlwZSA9ICdyZWNlaXZpbmcnO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihXRUJTT0NLRVRfREFUQSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0Lm1ldGEuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyBzb2NrZXQnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5kaXNwYXRjaChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihXRUJTT0NLRVRfQ0xPU0UsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmNsb3NlKHBhY2tldCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihXRUJTT0NLRVRfRVJST1IsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmVycm9yKHBhY2tldCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICB9KTtcbiAgICAgICAgb211LmV2ZW50LnJlYWR5Lmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndzU2VuZExvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3c1NlbmRMb29wKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgY29uc3Qgc2VuZCA9IHRoaXMud3NTZW5kUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChzZW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBhd2FpdCB0b1VpbnQ4QXJyYXkoc2VuZC5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHNlbmQuZGF0YSA9PT0gJ3N0cmluZycgPyBXU01zZ1R5cGUuVEVYVCA6IFdTTXNnVHlwZS5CSU5BUlk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfREFUQSwgbmV3IERhdGFDaHVuayh7IGlkOiBzZW5kLmlkLCB0eXBlIH0sIGFycmF5KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kV2FpdFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUhlYWRlcnMocmVxdWVzdDogUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3Qga2V5czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBzZXQgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEtleSA9IGtleXNbbG93ZXJLZXldO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsS2V5KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbb3JpZ2luYWxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICBrZXlzW2xvd2VyS2V5XSA9IGtleTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbml0Py5oZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgICAgICAgICAgIGluaXQuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbml0LmhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGluaXQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGluaXQuaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJZCgpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LmFwcC5pZC5qb2luKGAke3BlcmZvcm1hbmNlLnRpbWVPcmlnaW59LSR7dGhpcy5yZXF1ZXN0Q291bnQrK31gKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdChpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPHsgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTsgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSB9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCkua2V5KCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9DUkVBVEUsIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0LCBpbml0KSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSByZXF1ZXN0LmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFJFUVVFU1RfU0VORCwge1xuICAgICAgICAgICAgICAgICAgICBtZXRhOiB7IGlkIH0sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFUVVFU1RfQ0xPU0UsIHsgaWQgfSk7XG4gICAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRnV0dXJlID0gY3JlYXRlRnV0dXJlPEh0dHBSZXNwb25zZT4oKTtcbiAgICAgICAgbGV0IGNodW5rRXZlbnQgPSBjcmVhdGVGdXR1cmU8Ym9vbGVhbj4oKTtcbiAgICAgICAgY29uc3Qgc2V0UmVzcG9uc2UgPSAocmVzcG9uc2U6IEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmh0dHBIYW5kbGVzW2lkXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVjZWl2aW5nJyxcbiAgICAgICAgICAgICAgICByZWNlaXZlKGRhdGE6IFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPikge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50ID0gY3JlYXRlRnV0dXJlPGJvb2xlYW4+KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5odHRwSGFuZGxlc1tpZF0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlZCcsXG4gICAgICAgICAgICBzZXRSZXNwb25zZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZUZ1dHVyZS5wcm9taXNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICBzdHJlYW06IG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICAgICAgICAgICAgYXN5bmMgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgY2h1bmtFdmVudC5wcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaHVuaykgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoKGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8T211UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgeyByZXNwb25zZSwgc3RyZWFtIH0gPSBhd2FpdCB0aGlzLnJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgICByZXR1cm4gbmV3IE9tdVJlc3BvbnNlKFxuICAgICAgICAgICAgbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVyKSxcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwLFxuICAgICAgICAgICAgcmVzcG9uc2UucmVkaXJlY3RlZCxcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAnYmFzaWMnLFxuICAgICAgICAgICAgcmVzcG9uc2UudXJsLFxuICAgICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdzKGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIG9wdGlvbnM/OiB7XG4gICAgICAgIG1ldGhvZD86IHN0cmluZztcbiAgICAgICAgYXV0b2Nsb3NlPzogYm9vbGVhbjtcbiAgICAgICAgYXV0b3Bpbmc/OiBib29sZWFuO1xuICAgICAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB9KTogUHJvbWlzZTxPbXVXUz4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVJZCgpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBPbXVXUy5jcmVhdGUoXG4gICAgICAgICAgICB0aGlzLm9tdSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy53c0hhbmRsZXNbaWQua2V5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy53c0hhbmRsZXNbaWQua2V5KCldID0ge1xuICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZWQnLFxuICAgICAgICAgICAgaGFuZGxlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9DUkVBVEUsIHtcbiAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy5nZW5lcmF0ZUhlYWRlcnMocmVxdWVzdCwgb3B0aW9ucyksXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZS53cztcbiAgICB9XG59XG5cbmNsYXNzIE9tdVJlc3BvbnNlIGltcGxlbWVudHMgUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9rOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVkaXJlY3RlZDogYm9vbGVhbixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzVGV4dDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUmVzcG9uc2VUeXBlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PEFycmF5QnVmZmVyPj4gfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keVVzZWQ6IGJvb2xlYW4sXG4gICAgKSB7fVxuXG4gICAgY2xvbmUoKTogT211UmVzcG9uc2Uge1xuICAgICAgICByZXR1cm4gbmV3IE9tdVJlc3BvbnNlKFxuICAgICAgICAgICAgdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgdGhpcy5vayxcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RlZCxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgdGhpcy50eXBlLFxuICAgICAgICAgICAgdGhpcy51cmwsXG4gICAgICAgICAgICB0aGlzLmJvZHksXG4gICAgICAgICAgICB0aGlzLmJvZHlVc2VkLFxuICAgICAgICApO1xuICAgIH1cbiAgICBhc3luYyBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cbiAgICBibG9iKCk6IFByb21pc2U8QmxvYj4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuYmxvYigpO1xuICAgIH1cbiAgICBieXRlcygpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5hcnJheUJ1ZmZlcigpLnRoZW4oKGJ1ZikgPT4gbmV3IFVpbnQ4QXJyYXkoYnVmKSk7XG4gICAgfVxuICAgIGZvcm1EYXRhKCk6IFByb21pc2U8Rm9ybURhdGE+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmZvcm1EYXRhKCk7XG4gICAgfVxuICAgIGpzb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmpzb24oKTtcbiAgICB9XG4gICAgdGV4dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkudGV4dCgpO1xuICAgIH1cbn1cblxudHlwZSBFdmVudExpc3RlbmVyTWFwPFQ+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiAoKGV2ZW50OiBUW0tdKSA9PiB1bmtub3duKVtdXG59O1xuXG5leHBvcnQgdHlwZSBXU01zZyA9IHtcbiAgICB0eXBlOiAnb3Blbic7XG4gICAgZGF0YTogV2ViU29ja2V0T3Blbjtcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBkYXRhOiBXZWJTb2NrZXRFcnJvcjtcbn0gfCB7XG4gICAgdHlwZTogJ3RleHQnO1xuICAgIGRhdGE6IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2JpbmFyeSc7XG4gICAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gICAgdHlwZTogJ2Nsb3NlJztcbiAgICBkYXRhOiBXZWJTb2NrZXRDbG9zZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBPbXVXUyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWRkUXVldWU6IChkYXRhOiBXU0RhdGEpID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NlOiAoKSA9PiB2b2lkLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjZWl2ZVF1ZXVlOiBXU01zZ1tdID0gW10sXG4gICAgICAgIHByaXZhdGUgcmVjZWl2ZVJlc29sdmU6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBzdGF0dXM6ICdjb25uZWN0aW5nJyB8ICdvcGVuJyB8ICdjbG9zZWQnID0gJ2Nvbm5lY3RpbmcnLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvbXU6IE9tdSwgaWQ6IElkZW50aWZpZXIsIGFkZFF1ZXVlOiAoZGF0YTogV1NEYXRhKSA9PiB2b2lkLCBkaXNwb3NlOiAoKSA9PiB2b2lkKTogV2ViU29ja2V0SGFuZGxlIHtcbiAgICAgICAgY29uc3Qgd3MgPSBuZXcgT211V1Mob211LCBpZCwgYWRkUXVldWUsIGRpc3Bvc2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICBvcGVuOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVuJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubWV0YS50eXBlID09PSBXU01zZ1R5cGUuQklOQVJZKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaW5hcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YS5ib2R5LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YS5ib2R5KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZChkYXRhOiBXU0RhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRRdWV1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0NMT1NFLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZC5rZXkoKSxcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZSgpOiBQcm9taXNlPFdTTXNnPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVSZXNvbHZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nIGZyb20gYW5vdGhlciBhc3luYyBjYWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdHVzICE9PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdvcGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmluZyBvbiBhbHJlYWR5IGNsb3NlZCBzb2NrZXQnKTtcbiAgICB9XG5cbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcbn1cblxuZXhwb3J0IGNsYXNzIE9tdVdlYlNvY2tldCBpbXBsZW1lbnRzIFdlYlNvY2tldCB7XG4gICAgcHVibGljIENPTk5FQ1RJTkcgPSAwIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBPUEVOID0gMSBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0lORyA9IDIgYXMgY29uc3Q7XG4gICAgcHVibGljIENMT1NFRCA9IDMgYXMgY29uc3Q7XG5cbiAgICBiaW5hcnlUeXBlOiBCaW5hcnlUeXBlID0gJ2Jsb2InO1xuICAgIGJ1ZmZlcmVkQW1vdW50OiBudW1iZXIgPSAwO1xuICAgIGV4dGVuc2lvbnM6IHN0cmluZyA9ICcnO1xuICAgIG9uY2xvc2U6ICgodGhpczogV2ViU29ja2V0LCBldjogQ2xvc2VFdmVudCkgPT4gYW55KSB8IG51bGwgPSBudWxsO1xuICAgIG9uZXJyb3I6ICgodGhpczogV2ViU29ja2V0LCBldjogRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBvbm1lc3NhZ2U6ICgodGhpczogV2ViU29ja2V0LCBldjogTWVzc2FnZUV2ZW50KSA9PiBhbnkpIHwgbnVsbCA9IG51bGw7XG4gICAgb25vcGVuOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiBhbnkpIHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdG9jb2w6IHN0cmluZyA9ICcnO1xuICAgIHJlYWR5U3RhdGU6IDAgfCAyIHwgMSB8IDMgPSAwO1xuICAgIHVybDogc3RyaW5nID0gJyc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdzOiBPbXVXUyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogRXZlbnRMaXN0ZW5lck1hcDxXZWJTb2NrZXRFdmVudE1hcD4gPSB7XG4gICAgICAgICAgICBjbG9zZTogW10sXG4gICAgICAgICAgICBlcnJvcjogW10sXG4gICAgICAgICAgICBtZXNzYWdlOiBbXSxcbiAgICAgICAgICAgIG9wZW46IFtdLFxuICAgICAgICB9LFxuICAgICkge1xuICAgICAgICB0aGlzLnJlY2VpdmVMb29wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWNlaXZlTG9vcCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCB0eXBlIH0gPSBhd2FpdCB0aGlzLndzLnJlY2VpdmUoKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGRhdGEuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogZGF0YS5yZWFzb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sID0gZGF0YS5wcm90b2NvbCA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnb3BlbicsIHt9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFcnJvckV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkYXRhLnJlYXNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBNZXNzYWdlRXZlbnQoJ21lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcGF0Y2hFdmVudChldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldmVudC50eXBlXTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgICB0aGlzLm9ub3Blbj8uKGV2ZW50IGFzIE1lc3NhZ2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHRoaXMub25lcnJvcj8uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICB0aGlzLm9ubWVzc2FnZT8uKGV2ZW50IGFzIE1lc3NhZ2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgIHRoaXMub25jbG9zZT8uKGV2ZW50IGFzIENsb3NlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlbmQoZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldyk6IHZvaWQge1xuICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3MuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICBhZGRFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KHR5cGU6IEssIGxpc3RlbmVyOiAodGhpczogV2ViU29ja2V0LCBldjogV2ViU29ja2V0RXZlbnRNYXBbS10pID0+IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRvVWludDhBcnJheShkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogUHJvbWlzZTxVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT4+IHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0ZXh0RW5jb2Rlci5lbmNvZGUoZGF0YSk7XG4gICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGRhdGEuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSBhcyBBcnJheUJ1ZmZlckxpa2UpO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgVW5saXN0ZW4gPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFAgZXh0ZW5kcyBBcnJheTxhbnk+PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PCguLi5hcmdzOiBQKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI6ICguLi5hcmdzOiBQKSA9PiBhbnkpOiBVbmxpc3RlbiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdCguLi5hcmdzOiBQKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubGlzdGVuZXJzXSkge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgIlxudHlwZSBUYXNrID0gKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIExvY2sge1xuICAgIHByaXZhdGUgdGFza3M6IChUYXNrKVtdID0gW107XG4gICAgcHJpdmF0ZSB3YWl0ZXI6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgd2FpdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMud2FpdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53YWl0ZXIgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVuVGFza3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMudGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud2FpdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcnVuVGFza3MoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXNlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXdhaXQgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFJlZ2lzdHJ5UGVybWlzc2lvbnMsIFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OIH0gZnJvbSAnLi9yZWdpc3RyeSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBVaW50OEFycmF5IHwgbnVsbCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBSZWdpc3RyeVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlQm9vbGVhbihwYWNrZXQudmFsdWUgIT09IG51bGwpO1xuICAgICAgICBpZiAocGFja2V0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHBhY2tldC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBSZWdpc3RyeVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJlYWRlci5yZWFkQm9vbGVhbigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV4aXN0aW5nID8gcmVhZGVyLnJlYWRVaW50OEFycmF5KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5UGFja2V0KGlkLCB2YWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9uc0pTT047XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlclBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogUmVnaXN0ZXJQYWNrZXQpOiBSZWdpc3RlclBhY2tldEpTT04ge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gcGFja2V0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhY2tldC5pZC5rZXkoKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWFkOiBwZXJtcy5yZWFkID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLnJlYWQpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHdyaXRlOiBwZXJtcy53cml0ZSA/IElkZW50aWZpZXIuZnJvbShwZXJtcy53cml0ZSkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogUmVnaXN0ZXJQYWNrZXRKU09OKTogUmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShkYXRhLmlkKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlYWQ6IHBlcm1zLnJlYWQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMucmVhZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd3JpdGU6IHBlcm1zLndyaXRlID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLndyaXRlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgTG9jayB9IGZyb20gJy4uLy4uL2xvY2suanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBKc29uVHlwZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyB0eXBlIEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7IFJlZ2lzdGVyUGFja2V0LCBSZWdpc3RyeVBhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZ2lzdHJ5LCBSZWdpc3RyeVR5cGUsIFdyaXRhYmxlIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8UmVnaXN0cnlFeHRlbnNpb24+ID0gUkVHSVNUUllfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyaWVzID0gbmV3IElkZW50aWZpZXJNYXA8UmVnaXN0cnk8dW5rbm93bj4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVHSVNUUllfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVSZWdpc3RyeTxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cmllcy5oYXMocmVnaXN0cnlUeXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIGlkZW50aWZpZXIgJyR7cmVnaXN0cnlUeXBlLmlkfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5SW1wbCh0aGlzLm9tdSwgcmVnaXN0cnlUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHJlZ2lzdHJ5VHlwZTogUmVnaXN0cnlUeXBlPFQ+KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcmVnaXN0cnlUeXBlLmlkO1xuICAgICAgICBsZXQgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJpZXMuZ2V0KGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVnaXN0cnkgPSB0aGlzLmNyZWF0ZVJlZ2lzdHJ5KHJlZ2lzdHJ5VHlwZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJpZXMuc2V0KGlkZW50aWZpZXIsIHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVnaXN0cnkgYXMgUmVnaXN0cnk8VD47XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBkZWZhdWx0OiBUOyBzZXJpYWxpemVyPzogU2VyaWFsaXplcjxULCBEPiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBkZWZhdWx0OiBUOyBzZXJpYWxpemVyOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IH0pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLm9tdS5hcHAuaWQuam9pbihuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cmllcy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBuYW1lICcke25hbWV9JyBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlVHlwZSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9wdGlvbnMuZGVmYXVsdCxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IG9wdGlvbnMuc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlZ2lzdHJ5KHRhYmxlVHlwZSk7XG4gICAgfVxufVxuXG5jbGFzcyBSZWdpc3RyeUltcGw8VD4gaW1wbGVtZW50cyBSZWdpc3RyeTxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxbVF0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jazogTG9jayA9IG5ldyBMb2NrKCk7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgdmFsdWU6IFQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFR0lTVFJZX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVVwZGF0ZShwYWNrZXQpLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIGFzeW5jICNnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFJFR0lTVFJZX0dFVF9FTkRQT0lOVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgI3NldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX1VQREFURV9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldCgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI2dldCgpKTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4gdGhpcy4jc2V0KHZhbHVlKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZm46ICh2YWx1ZTogVCkgPT4gUHJvbWlzZUxpa2U8VD4gfCBUKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuI2dldCgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhd2FpdCBmbih2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNzZXQobmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW9kaWZ5KGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuaW5nICYmIHRoaXMub211LnJlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXIubGlzdGVuKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlKGRhdGE6IFJlZ2lzdHJ5UGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0YS5pZC5pc0VxdWFsKHRoaXMudHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50eXBlLmlkLmlzU3VicGF0aE9mKHRoaXMub211LmFwcC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnR5cGUucGVybWlzc2lvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXRTdmVsdGUoKTogV3JpdGFibGU8VD4ge1xuICAgICAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZhbHVlOiBUID0gdGhpcy52YWx1ZTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbmV3IFNldDwodmFsdWU6IFQpID0+IHZvaWQ+KCk7XG4gICAgICAgIHRoaXMubGlzdGVuKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChydW4pID0+IHtcbiAgICAgICAgICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0OiAodmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgJHt0aGlzLnR5cGUuaWQua2V5KCl9IGlzIG5vdCByZWFkeWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Vic2NyaWJlOiAocnVuKSA9PiB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChydW4pO1xuICAgICAgICAgICAgICAgIHJ1bih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShydW4pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlOiAoZm4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgJHt0aGlzLnR5cGUuaWQua2V5KCl9IGlzIG5vdCByZWFkeWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShmbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2FpdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxSZWdpc3RyeUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncmVnaXN0cnknLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IFJlZ2lzdHJ5RXh0ZW5zaW9uKG9tdSksXG4pO1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRS5qb2luKCdwZXJtaXNzaW9uJyk7XG5jb25zdCBSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVnaXN0ZXJQYWNrZXQ+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxSZWdpc3RyeVBhY2tldD4oXG4gICAgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlJyxcbiAgICAgICAgc2VyaWFsaXplcjogUmVnaXN0cnlQYWNrZXQsXG4gICAgfSxcbik7XG5jb25zdCBSRUdJU1RSWV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgUkVHSVNUUllfR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgUmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2dldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvSnNvbigpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgdHlwZSB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFJlZ2lzdHJ5VHlwZSwgdHlwZSBSZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNvbnN0IEkxOE5fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8STE4bkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnaTE4bicsIChjbGllbnQpID0+IG5ldyBJMThuRXh0ZW5zaW9uKGNsaWVudCkpO1xuXG5leHBvcnQgY29uc3QgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSTE4Tl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2NhbGVzJywgJ3NldCcpO1xuZXhwb3J0IGNvbnN0IEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdnZXQnKTtcbmNvbnN0IEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248TG9jYWxlW10+KEkxOE5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9jYWxlcycsXG4gICAgZGVmYXVsdFZhbHVlOiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IFtdIDogd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgYXMgTG9jYWxlW10sXG59KTtcblxuZXhwb3J0IGNsYXNzIEkxOG5FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gSTE4Tl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlc1JlZ2lzdHJ5OiBSZWdpc3RyeTxMb2NhbGVbXT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMubG9jYWxlc1JlZ2lzdHJ5ID0gb211LnJlZ2lzdHJpZXMuZ2V0KEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5sb2NhbGVzUmVnaXN0cnkudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxpemVkVGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5zZWxlY3RCZXN0VHJhbnNsYXRpb24obG9jYWxlcywgbG9jYWxpemVkVGV4dCk7XG4gICAgICAgIGlmICghdHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGxvY2FsaXplZFRleHQpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0QmVzdFRyYW5zbGF0aW9uKFxuICAgICAgICBsb2NhbGVzOiByZWFkb25seSBMb2NhbGVbXSxcbiAgICAgICAgbG9jYWxpemVkVGV4dDogTG9jYWxpemVkVGV4dCxcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZExvY2FsZXMgPSBsb2NhbGVzLnJlZHVjZSgoYWNjLCBsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGwuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCctJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdHJhbnNmb3JtZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tsXTtcbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzUmVnaXN0cnkuc2V0KGxvY2FsZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XG4gICAgRVJST1IgPSAnZXJyb3InLFxuICAgIFdBUk5JTkcgPSAnd2FybmluZycsXG4gICAgSU5GTyA9ICdpbmZvJyxcbiAgICBERUJVRyA9ICdkZWJ1ZycsXG59XG5cbmV4cG9ydCB0eXBlIExvZ01lc3NhZ2UgPSB7XG4gICAgdHlwZTogTG9nVHlwZTtcbiAgICB0ZXh0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogTG9nTWVzc2FnZSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBMb2dQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0uaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnRleHQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IExvZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IGlkID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCkgYXMgTG9nVHlwZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHR5cGUsIHRleHQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dQYWNrZXQoSWRlbnRpZmllci5mcm9tS2V5KGlkKSwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgTG9nTWVzc2FnZSB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBMb2dQYWNrZXQsIExvZ1R5cGUgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnbG9nZ2VyJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgTG9nZ2VyRXh0ZW5zaW9uKGNsaWVudCksXG4pO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gTE9HR0VSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvZycpO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QQUNLRVQ6IFBhY2tldFR5cGU8TG9nUGFja2V0PiA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxMb2dQYWNrZXQ+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsb2cnLFxuICAgIHNlcmlhbGl6ZXI6IExvZ1BhY2tldCxcbn0pO1xuZXhwb3J0IGNvbnN0IExPR0dFUl9MSVNURU5fUEFDS0VUOiBQYWNrZXRUeXBlPElkZW50aWZpZXI+ID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcblxudHlwZSBMb2dMaXN0ZW5lciA9IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IGNsYXNzIExvZ2dlckV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8TG9nZ2VyRXh0ZW5zaW9uPiA9IExPR0dFUl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogSWRlbnRpZmllck1hcDxMb2dMaXN0ZW5lcltdPiA9IG5ldyBJZGVudGlmaWVyTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KExPR0dFUl9MT0dfUEFDS0VULCBMT0dHRVJfTElTVEVOX1BBQ0tFVCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoTE9HR0VSX0xPR19QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5mb3JFYWNoKChpdCkgPT4gaXQocGFja2V0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZyhtZXNzYWdlOiBMb2dNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMb2dQYWNrZXQodGhpcy5vbXUuYXBwLmlkLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTE9HX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXJyb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5FUlJPUiwgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybmluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLldBUk5JTkcsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm8odGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5JTkZPLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1Zyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLkRFQlVHLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaWQ6IElkZW50aWZpZXIsIGxpc3RlbmVyOiBMb2dMaXN0ZW5lcik6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKExPR0dFUl9MSVNURU5fUEFDS0VULCBpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKSA/PyBbXTtcbiAgICAgICAgbGlzdC5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkxldmVsID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbk1ldGFkYXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZT86IExvY2FsaXplZFRleHQ7XG4gICAgbGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbn07XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25UeXBlSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblR5cGUge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IFBlcm1pc3Npb25NZXRhZGF0YTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgaWQ6IElkZW50aWZpZXI7IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGEgfSkge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IFBlcm1pc3Npb25UeXBlKTogUGVybWlzc2lvblR5cGVKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBQZXJtaXNzaW9uVHlwZUpzb24pOiBQZXJtaXNzaW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvblR5cGUoe1xuICAgICAgICAgICAgaWQ6IElkZW50aWZpZXIuZnJvbUtleShqc29uLmlkKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBqc29uLm1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAsIElkZW50aWZpZXJTZXQsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUGVybWlzc2lvblR5cGUgfSBmcm9tICcuL3Blcm1pc3Npb24uanMnO1xuXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdwZXJtaXNzaW9uJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgUGVybWlzc2lvbkV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmNvbnN0IFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFBlcm1pc3Npb25UeXBlW10+KFxuICAgIFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcltdLCB2b2lkPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3QnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dyYW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG59KTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBlcm1pc3Npb25FeHRlbnNpb24+ID0gUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RlcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllck1hcDxQZXJtaXNzaW9uVHlwZT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULCAocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VULFxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocGVybWlzc2lvbjogUGVybWlzc2lvblR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsIFtwZXJtaXNzaW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLnBlcm1pc3Npb25JZHM6IEludG9JZFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBlcm1pc3Npb25JZHMubWFwKElkZW50aWZpZXIuZnJvbSk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBpZHMuZmlsdGVyKChpZCkgPT4gIXRoaXMucGVybWlzc2lvbnMuaGFzKGlkKSk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJtaXNzaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoLi4ucGVybWlzc2lvbklkczogSWRlbnRpZmllcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCwgcGVybWlzc2lvbklkcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwZXJtaXNzaW9uSWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGx1Z2luJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBQbHVnaW5FeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBQTFVHSU5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBsdWdpbnM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChQTFVHSU5fUkVRVUlSRV9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd2VkUGFja2FnZXMoKTogVGFibGU8UGx1Z2luUGFja2FnZUluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LnRhYmxlcy5nZXQoUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChvcHRpb25zOiBSZWxvYWRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUExVR0lOX1JFUVVJUkVfUEFDS0VULCBPYmplY3QuZnJvbUVudHJpZXModGhpcy5yZXF1aXJlZFBsdWdpbnMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZShwbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5zIG11c3QgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2lucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQbHVnaW5zLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgUExVR0lOX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+PihcbiAgICBQTFVHSU5fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgfSxcbik7XG5leHBvcnQgY2xhc3MgUGx1Z2luUGFja2FnZUluZm8ge1xuICAgIHB1YmxpYyBwYWNrYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKF9wYWNrYWdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnBhY2thZ2UgPSBfcGFja2FnZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQbHVnaW5QYWNrYWdlSW5mbyk6IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KTogUGx1Z2luUGFja2FnZUluZm8ge1xuICAgICAgICByZXR1cm4gUGx1Z2luUGFja2FnZUluZm8uZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBuZXcgUGx1Z2luUGFja2FnZUluZm8oanNvbi5wYWNrYWdlLCBqc29uLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHsgcGFja2FnZTogdGhpcy5wYWNrYWdlLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAnbWFuYWdlJyk7XG5cbmNvbnN0IFBMVUdJTl9BTExPV0VEX1BBQ0tBR0VfVEFCTEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF9wYWNrYWdlJyxcbiAgICBzZXJpYWxpemVyOiBQbHVnaW5QYWNrYWdlSW5mbyxcbiAgICBrZXk6IChpdGVtKSA9PiBpdGVtLmtleSgpLFxufSk7XG5cbnR5cGUgUmVsb2FkT3B0aW9ucyA9IHtcbiAgICBwYWNrYWdlczogc3RyaW5nW10gfCBudWxsO1xufTtcblxudHlwZSBSZWxvYWRSZXN1bHQgPSB7XG4gICAgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5jb25zdCBQTFVHSU5fUkVMT0FEX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZWxvYWRPcHRpb25zLCBSZWxvYWRSZXN1bHQ+KFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIHBlcm1pc3Npb25JZDogUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhZGRlZF9hdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBJbmRleCB7XG4gICAgaW5kZXhlczogUmVjb3JkPHN0cmluZywgQXBwSW5kZXhFbnRyeT47XG59O1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcHMnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICd3cml0ZScpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignaW5kZXgnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUdJU1RSWV9UWVBFOiBSZWdpc3RyeVR5cGU8QXBwSW5kZXg+ID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248QXBwSW5kZXg+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbmRleCcsXG4gICAgZGVmYXVsdFZhbHVlOiB7ICdpbmRleGVzJzoge30gfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICB3cml0ZTogU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgcmVhZDogU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5jb25zdCBBUFBfVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdhcHBzJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgYWxsOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignc2h1dGRvd24nKTtcbmNvbnN0IFNIVVRET1dOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxib29sZWFuLCBib29sZWFuPihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2h1dGRvd24nLFxuICAgIHBlcm1pc3Npb25JZDogU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbigndHJ1c3RlZF9vcmlnaW5zJywgJ2dldCcpO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnc2V0Jyk7XG5jb25zdCBUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAndHJ1c3RlZF9ob3N0cycsXG4gICAgZGVmYXVsdFZhbHVlOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHdyaXRlOiBUUlVTVEVEX09SSUdJTlNfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHBzOiBUYWJsZTxBcHA+O1xuICAgIHB1YmxpYyByZWFkb25seSBpbmRleDogUmVnaXN0cnk8QXBwSW5kZXg+O1xuICAgIHB1YmxpYyByZWFkb25seSB0cnVzdGVkSG9zdHM6IFJlZ2lzdHJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmFwcHMgPSBvbXUudGFibGVzLmdldChBUFBfVEFCTEVfVFlQRSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvbXUucmVnaXN0cmllcy5nZXQoU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEUpO1xuICAgICAgICB0aGlzLnRydXN0ZWRIb3N0cyA9IG9tdS5yZWdpc3RyaWVzLmdldChUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihyZXN0YXJ0PzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChTSFVURE9XTl9FTkRQT0lOVF9UWVBFLCByZXN0YXJ0ID8/IGZhbHNlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5vbXUubmV0d29yay5ldmVudC5kaXNjb25uZWN0ZWQubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uQ29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRpc2Nvbm5lY3RDYWxsYmFja3M6IEFycmF5PChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgb25Db25uZWN0KGNhbGxiYWNrOiAoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Db25uZWN0Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBBcHBJbmRleFJlZ2lzdHJ5TWV0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU6IExvY2FsaXplZFRleHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4UmVnaXN0cnlKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhcHBzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEluZGV4UmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBhcHBzOiBJZGVudGlmaWVyTWFwPEFwcD4sXG4gICAgICAgIHB1YmxpYyBtZXRhOiBBcHBJbmRleFJlZ2lzdHJ5TWV0YSB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBBcHBJbmRleFJlZ2lzdHJ5SlNPTik6IEFwcEluZGV4UmVnaXN0cnkge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShqc29uWydpZCddKTtcbiAgICAgICAgY29uc3QgYXBwcyA9IG5ldyBJZGVudGlmaWVyTWFwPEFwcD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBbaWRTdHIsIGFwcEpTT05dIG9mIE9iamVjdC5lbnRyaWVzKGpzb25bJ2FwcHMnXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGlkU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcCA9IEFwcC5kZXNlcmlhbGl6ZShhcHBKU09OKTtcbiAgICAgICAgICAgIGlmICghaWQuaXNOYW1lc3BhY2VFcXVhbChhcHAuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHAgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIElEIGluIHRoZSBpbmRleC4gJHthcHAuaWR9ICE9ICR7aWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBzLnNldChpZCwgYXBwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFwcEluZGV4UmVnaXN0cnkoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGFwcHMsXG4gICAgICAgICAgICBqc29uLm1ldGEsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCwgSWRlbnRpZmllclNldCwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNlc3Npb25PYnNlcnZlciB9IGZyb20gJy4uL3NlcnZlci9leHRlbnNpb24nO1xuaW1wb3J0IHsgVGFibGUsIFRhYmxlVHlwZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFU1NJT05fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnc2Vzc2lvbnMnLCAob211OiBPbXUpID0+IG5ldyBTZXNzaW9uRXh0ZW5zaW9uKG9tdSkpO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZWFkJyk7XG5jb25zdCBTRVNTSU9OX1RBQkxFX1RZUEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25zJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb2JzZXJ2ZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5jb25zdCBTRVNTSU9OX0RJU0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxBcHA+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbl9kaXNjb25uZWN0ZWQnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbn0pO1xuXG50eXBlIFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkID0ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbGFuX2lwOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZW1vdGVfYXBwJywgJ3JlcXVlc3QnKTtcblxuY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZW1vdGVBcHBSZXF1ZXN0UGF5bG9hZCwgUmVxdWVzdFJlbW90ZUFwcFJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlbW90ZV9hcHBfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZVRva2VuUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2dlbmVyYXRlX3Rva2VuJyk7XG5cbnR5cGUgR2VuZXJhdGVUb2tlblBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxHZW5lcmF0ZVRva2VuUGF5bG9hZCwgR2VuZXJhdGVUb2tlblJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dlbmVyYXRlX3Rva2VuJyxcbiAgICBwZXJtaXNzaW9uSWQ6IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlc3Npb25FeHRlbnNpb24+ID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbnM6IFRhYmxlPEFwcD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uT2JzZXJ2ZXJzID0gbmV3IElkZW50aWZpZXJNYXA8U2Vzc2lvbk9ic2VydmVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZWRBcHBzID0gbmV3IElkZW50aWZpZXJTZXQoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLCAoYXBwKSA9PiB0aGlzLmhhbmRsZVNlc3Npb25EaXNjb25uZWN0KGFwcCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSBvbXUudGFibGVzLmdldChTRVNTSU9OX1RBQkxFX1RZUEUpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgICAgICBvbXUub25SZWFkeSgoKSA9PiB0aGlzLm9uUmVhZHkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhpZDogSW50b0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlc3Npb25zLmhhcyhJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2JzZXJ2ZShhcHBJZDogSW50b0lkLCB7XG4gICAgICAgIG9uQ29ubmVjdCxcbiAgICAgICAgb25EaXNjb25uZWN0LFxuICAgIH06IHtcbiAgICAgICAgb25Db25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICAgICAgb25EaXNjb25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICB9KTogU2Vzc2lvbk9ic2VydmVyIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oYXBwSWQpO1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIFtpZF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmdldChpZCkgPz8gbmV3IFNlc3Npb25PYnNlcnZlcihbXSwgW10pO1xuICAgICAgICBvYnNlcnZlci5vbkNvbm5lY3Qob25Db25uZWN0KTtcbiAgICAgICAgb2JzZXJ2ZXIub25EaXNjb25uZWN0KG9uRGlzY29ubmVjdCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zZXQoaWQsIG9ic2VydmVyKTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uQ29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uRGlzY29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLmFwcElkczogSW50b0lkW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlcXVpcmUgYXBwcyBhZnRlciB0aGUgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhcHBJZCBvZiBhcHBJZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRBcHBzLmFkZChJZGVudGlmaWVyLmZyb20oYXBwSWQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25UYXNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEFwcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMucmVxdWlyZWRBcHBzLnZhbHVlcygpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25PYnNlcnZlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5rZXlzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0UmVtb3RlQXBwKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgeyBhcHAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghYXBwLnVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIGEgVVJMIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwLnR5cGUgIT09ICdyZW1vdGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGJlIGEgcmVtb3RlIGFwcCB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcHAubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgaGF2ZSBtZXRhZGF0YSB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFJFTU9URV9BUFBfUkVRVUVTVF9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVUb2tlbihvcHRpb25zOiB7XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICBwZXJtaXNzaW9uczogSW50b0lkW107XG4gICAgfSk6IFByb21pc2U8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChHRU5FUkFURV9UT0tFTl9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgeyBTaWduYWxQZXJtaXNzaW9ucywgU2lnbmFsUGVybWlzc2lvbnNKU09OIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNpZ25hbFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsUGFja2V0KGlkLCBib2R5KTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpZ25hbFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2lnbmFsUmVnaXN0ZXJQYWNrZXQpOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gcGFja2V0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhY2tldC5pZC5rZXkoKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsaXN0ZW46IHBlcm1zLmxpc3RlbiA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5saXN0ZW4pLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNlbmQ6IHBlcm1zLnNlbmQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuc2VuZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogU2lnbmFsUmVnaXN0ZXJQYWNrZXRKU09OKTogU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxSZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5hbGwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmxpc3RlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5zZW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICBsaXN0ZW4/OiBzdHJpbmc7XG4gICAgc2VuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIGxpc3Rlbj86IEludG9JZCB8IHVuZGVmaW5lZDtcbiAgICBzZW5kPzogSW50b0lkIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBTaWduYWxQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIGFueT47XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFNpZ25hbFBlcm1pc3Npb25zO1xuICAgICAgICB9LFxuICAgICk6IFNpZ25hbFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIub2Y8VCwgYW55PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpKS50b0pzb24oKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWw8VD4ge1xuICAgIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcbiAgICBub3RpZnkoYm9keTogVCk6IHZvaWQ7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgU2lnbmFsUGFja2V0LCBTaWduYWxSZWdpc3RlclBhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBTaWduYWxUeXBlLCB0eXBlIFNpZ25hbCB9IGZyb20gJy4vc2lnbmFsLmpzJztcblxuZXhwb3J0IGNvbnN0IFNJR05BTF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NpZ25hbCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2lnbmFsRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5jb25zdCBTSUdOQUxfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFNpZ25hbFJlZ2lzdGVyUGFja2V0PihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBTSUdOQUxfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBTSUdOQUxfTk9USUZZX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTaWduYWxQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdub3RpZnknLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gU0lHTkFMX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFscyA9IG5ldyBJZGVudGlmaWVyTWFwPFNpZ25hbFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFNJR05BTF9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX05PVElGWV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTaWduYWw8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbHMuaGFzKHNpZ25hbFR5cGUuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hbCBmb3Iga2V5ICR7c2lnbmFsVHlwZS5pZH0gYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxJbXBsKHRoaXMub211LCBzaWduYWxUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVKc29uPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVTZXJpYWxpemVkPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHNpZ25hbFR5cGU6IFNpZ25hbFR5cGU8VD4pOiBTaWduYWw8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduYWwoc2lnbmFsVHlwZSk7XG4gICAgfVxufVxuXG5jbGFzcyBTaWduYWxJbXBsPFQ+IGltcGxlbWVudHMgU2lnbmFsPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogKCh2YWx1ZTogVCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBTaWduYWxUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFNJR05BTF9OT1RJRllfUEFDS0VULCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVCcm9hZGNhc3QoZGF0YSkpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkoYm9keTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGJvZHkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9OT1RJRllfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YoaGFuZGxlciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQnJvYWRjYXN0KGRhdGE6IFNpZ25hbFBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEuYm9keSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy50eXBlLmlkLmlzU3VicGF0aE9mKHRoaXMub211LmFwcC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IERpc2Nvbm5lY3RUeXBlIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuZXhwb3J0IGNsYXNzIE9tdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFJlYXNvbiBleHRlbmRzIE9tdUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHR5cGU6IERpc2Nvbm5lY3RUeXBlLFxuICAgICAgICBwdWJsaWMgbWVzc2FnZSA9ICcnLFxuICAgICkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJSZXN0YXJ0IGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJULCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbm90aGVyQ29ubmVjdGlvbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5BTk9USEVSX0NPTk5FQ1RJT04sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25EZW5pZWQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuUEVSTUlTU0lPTl9ERU5JRUQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwcFJlbW92ZWQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuQVBQX1JFTU9WRUQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1RPS0VOLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkT3JpZ2luIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfT1JJR0lOLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVmVyc2lvbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1ZFUlNJT04sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRQYWNrZXQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjMxJztcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0RGF0YSwgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0JztcblxuZXhwb3J0IGNsYXNzIFBhY2tldE1hcHBlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldE1hcCA9IG5ldyBJZGVudGlmaWVyTWFwPFBhY2tldFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIoLi4ucGFja2V0VHlwZXM6IFBhY2tldFR5cGU8dW5rbm93bj5bXSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcGFja2V0VHlwZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhY2tldE1hcC5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCBpZCAke3R5cGUuaWQua2V5KCl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYWNrZXRNYXAuc2V0KHR5cGUuaWQsIHR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKHBhY2tldDogUGFja2V0KTogUGFja2V0RGF0YSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBwYWNrZXQudHlwZS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGRhdGE6IHBhY2tldC50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhY2tldC5kYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBkZXNlcmlhbGl6ZShkYXRhOiBQYWNrZXREYXRhKTogUGFja2V0IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShkYXRhLnR5cGUpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5wYWNrZXRNYXAuZ2V0KGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXR5cGUpIHRocm93IG5ldyBFcnJvcihgUGFja2V0IHR5cGUgJHtkYXRhLnR5cGV9IG5vdCByZWdpc3RlcmVkYCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZGF0YTogdHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEuZGF0YSksXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gICAgY29ubmVjdCgpOiBQcm9taXNlPENvbm5lY3Rpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xuICAgIHNlbmQocGFja2V0OiBQYWNrZXQsIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+KTogdm9pZDtcbiAgICByZWNlaXZlKHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+KTogUHJvbWlzZTxQYWNrZXQgfCBudWxsPjtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIGNsb3NlZDogYm9vbGVhbjtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBQYWNrZXQsIFBhY2tldERhdGEgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQtdHlwZXMnO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnVmZmVyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVmZmVyXG4gICAgICAgIC50b0Jhc2U2NCgpXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoZGF0YTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoZGF0YS5sZW5ndGggJSA0KSB7XG4gICAgICAgIGRhdGEgKz0gJz0nO1xuICAgIH1cbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KGRhdGEpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIodTg6IFVpbnQ4QXJyYXkpOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHU4Lmxlbmd0aCk7XG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgdmlldy5zZXQodTgpO1xuICAgIHJldHVybiBidWY7XG59XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRJT05fQVZBSUxBQkxFOiBib29sZWFuID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgISFjcnlwdG8uc3VidGxlO1xuXG5leHBvcnQgY2xhc3MgRGVjcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByaXZhdGVLZXk6IENyeXB0b0tleSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNLZXk6IENyeXB0b0tleSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPERlY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXksIHB1YmxpY0tleSB9ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IDQwOTYsXG4gICAgICAgICAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsxLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGVjcnlwdG9yKHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRvUmVxdWVzdCgpOiBQcm9taXNlPFJTQU51bWJlcnM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ2p3aycsIHRoaXMucHVibGljS2V5KTtcbiAgICAgICAgaWYgKCFrZXkuZSkgdGhyb3cgbmV3IEVycm9yKCdLZXkgZXhwb3J0IGZhaWxlZDogbWlzc2luZyBleHBvbmVudCcpO1xuICAgICAgICBpZiAoIWtleS5uKSB0aHJvdyBuZXcgRXJyb3IoJ0tleSBleHBvcnQgZmFpbGVkOiBtaXNzaW5nIG1vZHVsdXMnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGU6IGtleS5lLFxuICAgICAgICAgICAgbjoga2V5Lm4sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHsgbmFtZTogJ1JTQS1PQUVQJyB9LFxuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdFN0cmluZyhkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7IG5hbWU6ICdSU0EtT0FFUCcgfSxcbiAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoZGF0YSkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5jcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0tleTogQ3J5cHRvS2V5LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KHJlcXVlc3Q6IFJTQU51bWJlcnMpOiBQcm9taXNlPEVuY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgICdqd2snLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsZzogJ1JTQS1PQUVQLTI1NicsXG4gICAgICAgICAgICAgICAgZXh0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleV9vcHM6IFsnZW5jcnlwdCddLFxuICAgICAgICAgICAgICAgIGt0eTogJ1JTQScsXG4gICAgICAgICAgICAgICAgZTogcmVxdWVzdC5lLnJlcGxhY2UoLz0rJC8sICcnKSxcbiAgICAgICAgICAgICAgICBuOiByZXF1ZXN0Lm4ucmVwbGFjZSgvPSskLywgJycpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgRW5jcnlwdG9yKHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHRTdHJpbmcoZGF0YTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUVTIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGtleTogQ3J5cHRvS2V5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGl2OiBBcnJheUJ1ZmZlcixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPEFFUz4ge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEyOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDE2KSk7XG4gICAgICAgIHJldHVybiBuZXcgQUVTKGtleSwgaXYuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKGFlczogc3RyaW5nLCBkZWNyeXB0b3I6IERlY3J5cHRvcik6IFByb21pc2U8QUVTPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRvci5kZWNyeXB0KGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoYWVzKSkpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21BcnJheUJ1ZmZlcihkZWNyeXB0ZWQpO1xuICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgY29uc3QgaXYgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcblxuICAgICAgICBjb25zdCBrZXlfZW5jb2RlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgJ3JhdycsXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoa2V5KSxcbiAgICAgICAgICAgICdBRVMtQ0JDJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMoXG4gICAgICAgICAgICBrZXlfZW5jb2RlZCxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihpdiksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZShlbmNyeXB0b3I6IEVuY3J5cHRvcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdyYXcnLCB0aGlzLmtleSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkocmF3S2V5KSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkodGhpcy5pdikpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBlbmNyeXB0b3IuZW5jcnlwdChjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIod3JpdGVyLmZpbmlzaCgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogUGFja2V0RGF0YSk6IFByb21pc2U8UGFja2V0PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhkYXRhLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih3cml0ZXIuZmluaXNoKCkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQubmV3KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0KHBhY2tldDogUGFja2V0PFVpbnQ4QXJyYXk+KTogUHJvbWlzZTxQYWNrZXREYXRhPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihwYWNrZXQuZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbUFycmF5QnVmZmVyKGRlY3J5cHRlZCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4uL2FkZHJlc3MuanMnO1xuaW1wb3J0IHtcbiAgICBBbm90aGVyQ29ubmVjdGlvbiwgQXBwUmVtb3ZlZCwgRGlzY29ubmVjdFJlYXNvbiwgSW50ZXJuYWxFcnJvcixcbiAgICBJbnZhbGlkT3JpZ2luLFxuICAgIEludmFsaWRQYWNrZXQsXG4gICAgSW52YWxpZFRva2VuLFxuICAgIEludmFsaWRWZXJzaW9uLFxuICAgIFBlcm1pc3Npb25EZW5pZWQsXG4gICAgU2VydmVyUmVzdGFydCxcbn0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uL29tdS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuUHJvdmlkZXIgfSBmcm9tICcuLi90b2tlbi5qcyc7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IFBhY2tldE1hcHBlciB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBBRVMsIERlY3J5cHRvciwgRU5DUllQVElPTl9BVkFJTEFCTEUsIEVuY3J5cHRpb25SZXNwb25zZSwgRW5jcnlwdG9yIH0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IENvbm5lY3RQYWNrZXQsIERpc2Nvbm5lY3RUeXBlLCBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQuanMnO1xuXG50eXBlIFBhY2tldEhhbmRsZXI8VD4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICBldmVudDogRXZlbnRFbWl0dGVyPFtUXT47XG59O1xuXG50eXBlIFN0YXR1c1R5cGU8VD4gPSB7XG4gICAgdHlwZTogVDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ldHdvcmtTdGF0dXMgPSBTdGF0dXNUeXBlPCdjb25uZWN0aW5nJz4gfCBTdGF0dXNUeXBlPCdjb25uZWN0ZWQnPiB8IFN0YXR1c1R5cGU8J3JlYWR5Jz4gfCB7XG4gICAgdHlwZTogJ2Rpc2Nvbm5lY3RlZCc7XG4gICAgYXR0ZW1wdD86IG51bWJlcjtcbiAgICByZWFzb24/OiBEaXNjb25uZWN0UmVhc29uO1xufSB8IHtcbiAgICB0eXBlOiAncmVjb25uZWN0aW5nJztcbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIGRhdGU6IERhdGU7XG4gICAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmsge1xuICAgIHB1YmxpYyBzdGF0dXM6IE5ldHdvcmtTdGF0dXMgPSB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnIH07XG4gICAgcHVibGljIHJlYWRvbmx5IGV2ZW50OiB7IGNvbm5lY3RlZDogRXZlbnRFbWl0dGVyPFtdPjsgZGlzY29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8W0Rpc2Nvbm5lY3RSZWFzb24gfCB1bmRlZmluZWRdPjsgcGFja2V0OiBFdmVudEVtaXR0ZXI8W1BhY2tldDx1bmtub3duPl0+OyBzdGF0dXM6IEV2ZW50RW1pdHRlcjxbTmV0d29ya1N0YXR1c10+IH0gPSB7XG4gICAgICAgIGNvbm5lY3RlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBkaXNjb25uZWN0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgcGFja2V0OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHN0YXR1czogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgIH07XG4gICAgcHJpdmF0ZSByZWFkb25seSB0YXNrczogQXJyYXk8KCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRNYXBwZXIgPSBuZXcgUGFja2V0TWFwcGVyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRIYW5kbGVycyA9IG5ldyBJZGVudGlmaWVyTWFwPFBhY2tldEhhbmRsZXI8dW5rbm93bj4+KCk7XG4gICAgcHJpdmF0ZSBsaXN0ZW5UYXNrOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHB1YmxpYyByZWFzb246IERpc2Nvbm5lY3RSZWFzb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBhdHRlbXB0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwdWJsaWMgYWRkcmVzczogQWRkcmVzcyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0b2tlblByb3ZpZGVyOiBUb2tlblByb3ZpZGVyLFxuICAgICAgICBwcml2YXRlIHRyYW5zcG9ydDogVHJhbnNwb3J0LFxuICAgICAgICBwcml2YXRlIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uIHwgdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIGFlcz86IEFFUyB8IHVuZGVmaW5lZCxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5TRVJWRVJfTUVUQSxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5DT05ORUNULFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkRJU0NPTk5FQ1QsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuVE9LRU4sXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuUkVBRFksXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRQYWNrZXRIYW5kbGVyKFBBQ0tFVF9UWVBFUy5ESVNDT05ORUNULCBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVhc29uLnR5cGUgPT09IERpc2Nvbm5lY3RUeXBlLlNIVVRET1dOXG4gICAgICAgICAgICAgICAgfHwgcmVhc29uLnR5cGUgPT09IERpc2Nvbm5lY3RUeXBlLkNMT1NFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBFUlJPUl9NQVAgPSB7XG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkFOT1RIRVJfQ09OTkVDVElPTl06IEFub3RoZXJDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5QRVJNSVNTSU9OX0RFTklFRF06IFBlcm1pc3Npb25EZW5pZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkFQUF9SRU1PVkVEXTogQXBwUmVtb3ZlZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9UT0tFTl06IEludmFsaWRUb2tlbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9PUklHSU5dOiBJbnZhbGlkT3JpZ2luLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1ZFUlNJT05dOiBJbnZhbGlkVmVyc2lvbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5URVJOQUxfRVJST1JdOiBJbnRlcm5hbEVycm9yLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUX1RZUEVdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF9EQVRBXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlRdOiBTZXJ2ZXJSZXN0YXJ0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5DTE9TRV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuU0hVVERPV05dOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBFUlJPUl9NQVBbcmVhc29uLnR5cGVdO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFzb24gPSBuZXcgZXJyb3IocmVhc29uLm1lc3NhZ2UgPz8gJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRQYWNrZXRIYW5kbGVyKFBBQ0tFVF9UWVBFUy5SRUFEWSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgPT09ICdyZWFkeScpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIFJFQURZIHBhY2tldCB3aGVuIGFscmVhZHkgcmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ3JlYWR5JyB9KTtcbiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgIT09ICdkaXNjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGFuZ2UgY29ubmVjdGlvbiB3aGlsZSBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclBhY2tldCguLi5wYWNrZXRUeXBlczogUGFja2V0VHlwZTx1bmtub3duPltdKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFja2V0TWFwcGVyLnJlZ2lzdGVyKC4uLnBhY2tldFR5cGVzKTtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHBhY2tldFR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldEhhbmRsZXJzLnNldCh0eXBlLmlkLCB7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBldmVudDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFja2V0SGFuZGxlcjxUPih0eXBlOiBQYWNrZXRUeXBlPFQ+LCBoYW5kbGVyOiAocGFja2V0OiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMucGFja2V0SGFuZGxlcnMuZ2V0KHR5cGUuaWQpIGFzIFBhY2tldEhhbmRsZXI8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCB0eXBlICR7dHlwZS5pZC5rZXkoKX0gbm90IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsaXN0ZW5lcnMuZXZlbnQubGlzdGVuKGhhbmRsZXIgYXMgKHBhY2tldDogdW5rbm93bikgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2hlZHVsZVJlY29ubmVjdChhdHRlbXB0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IE1hdGgubWluKDMwMDAwLCAyMDAwICogKE1hdGgucG93KDEuNSwgYXR0ZW1wdCkgLSAxKSArIDIwMDApO1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzdGF0dXM6IEV4dHJhY3Q8TmV0d29ya1N0YXR1cywgeyB0eXBlOiAncmVjb25uZWN0aW5nJyB9PiA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWNvbm5lY3RpbmcnLFxuICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7Y2FuY2VsbGVkID0gdHJ1ZTt9LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyhzdGF0dXMpO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gc3RhdHVzLnRpbWVvdXQgLSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWUoKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJlbWFpbmluZykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChyZWNvbm5lY3QgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0YXRlKCdkaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29ubmVjdCB3aGlsZSAke3RoaXMuc3RhdHVzLnR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdGVuVGFzaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29ubmVjdCB3aGlsZSBhbHJlYWR5IGNvbm5lY3RpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGVtcHQrKztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gYXdhaXQgdGhpcy50cmFuc3BvcnQuY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Nvbm5lY3RpbmcnIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFSZWNlaXZlZCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWNlaXZlKHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFSZWNlaXZlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZWNlaXZpbmcgc2VydmVyIG1ldGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFQQUNLRVRfVFlQRVMuU0VSVkVSX01FVEEubWF0Y2gobWV0YVJlY2VpdmVkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IHBhY2tldCByZWNlaXZlZCB3YXMgbm90IHNlcnZlciBtZXRhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogbWV0YSB9ID0gbWV0YVJlY2VpdmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzcy5oYXNoID0gbWV0YS5oYXNoO1xuICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW5Qcm92aWRlci5nZXQodGhpcy5hZGRyZXNzLCB0aGlzLm9tdS5hcHApO1xuICAgICAgICAgICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbihgTm8gdG9rZW4gYXZhaWxhYmxlIGZvciBhcHAgJHt0aGlzLm9tdS5hcHAuaWQua2V5KCl9IGF0ICR7dGhpcy5hZGRyZXNzLmhvc3R9OiR7dGhpcy5hZGRyZXNzLnBvcnR9OiR7dGhpcy5hZGRyZXNzLmhhc2h9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlbmNyeXB0aW9uUmVzcDogRW5jcnlwdGlvblJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9tdS5hcHAudHlwZSA9PT0gJ3JlbW90ZScgJiYgRU5DUllQVElPTl9BVkFJTEFCTEUgJiYgbWV0YS5lbmNyeXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRvciA9IGF3YWl0IERlY3J5cHRvci5uZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdG9yID0gYXdhaXQgRW5jcnlwdG9yLm5ldyhtZXRhLmVuY3J5cHRpb24ucnNhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGF3YWl0IGVuY3J5cHRvci5lbmNyeXB0U3RyaW5nKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFlcyA9IGF3YWl0IEFFUy5uZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblJlc3AgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAndjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnNhOiBhd2FpdCBkZWNyeXB0b3IudG9SZXF1ZXN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhZXM6IGF3YWl0IHRoaXMuYWVzLnNlcmlhbGl6ZShlbmNyeXB0b3IpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFBBQ0tFVF9UWVBFUy5DT05ORUNULFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBuZXcgQ29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHRoaXMub211LmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sOiB7IHZlcnNpb246IFZFUlNJT04gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb246IGVuY3J5cHRpb25SZXNwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sIHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRhc2sgPSB0aGlzLmxpc3RlbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Nvbm5lY3RlZCcgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5jb25uZWN0ZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUYXNrcygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTLlJFQURZLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5UYXNrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEaXNjb25uZWN0UmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhc29uID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudC5kaXNjb25uZWN0ZWQuZW1pdCh0aGlzLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgIT09ICdkaXNjb25uZWN0ZWQnICYmIHRoaXMuc3RhdHVzLnR5cGUgIT09ICdyZWNvbm5lY3RpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCwgcmVhc29uOiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uPy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRhc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFzb24gJiYgIVtcbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0VHlwZS5TSFVURE9XTixcbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVCxcbiAgICAgICAgICAgIF0uaW5jbHVkZXModGhpcy5yZWFzb24udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY29ubmVjdCA9IGF3YWl0IHRoaXMuc2NoZWR1bGVSZWNvbm5lY3QodGhpcy5hdHRlbXB0KTtcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgcmVhc29uOiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uPy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1N0YXRlKHN0YXRlOiBOZXR3b3JrU3RhdHVzWyd0eXBlJ10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzLnR5cGUgPT09IHN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kKHBhY2tldDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnBhY2tldE1hcHBlci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgICAgIHBhY2tldCA9IGF3YWl0IHRoaXMuYWVzLmVuY3J5cHQoc2VyaWFsaXplZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQocGFja2V0LCB0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWNlaXZlKHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgIGlmICghcGFja2V0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoUGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUGFja2V0KHBhY2tldDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVC5tYXRjaChwYWNrZXQpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBlbmNyeXB0ZWQgcGFja2V0IGJlZm9yZSBlbmNyeXB0aW9uIHdhcyBlc3RhYmxpc2hlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgdGhpcy5hZXMuZGVjcnlwdChwYWNrZXQpO1xuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5wYWNrZXRNYXBwZXIuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LnBhY2tldC5lbWl0KHBhY2tldCk7XG4gICAgICAgIGNvbnN0IHBhY2tldEhhbmRsZXIgPSB0aGlzLnBhY2tldEhhbmRsZXJzLmdldChwYWNrZXQudHlwZS5pZCk7XG4gICAgICAgIGlmICghcGFja2V0SGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHBhY2tldEhhbmRsZXIuZXZlbnQuZW1pdChwYWNrZXQuZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCB0YXNrIGFmdGVyIGNsaWVudCBpcyByZWFkeScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlVGFzayh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2tzLnNwbGljZSh0aGlzLnRhc2tzLmluZGV4T2YodGFzayksIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hUYXNrcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U3RhdHVzKHN0YXR1czogTmV0d29ya1N0YXR1cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IHN0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IHN0YXR1cyB0byAke3N0YXR1c30gd2hlbiBhbHJlYWR5ICR7c3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LnN0YXR1cy5lbWl0KHN0YXR1cyk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuLi9hZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24sIFRyYW5zcG9ydCB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0RGF0YSB9IGZyb20gJy4vcGFja2V0L3BhY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IEFkZHJlc3MsXG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgZ2V0IHdzRW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmFkZHJlc3Muc2VjdXJlID8gJ3dzcycgOiAnd3MnO1xuICAgICAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHRoaXMuYWRkcmVzcztcbiAgICAgICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fS93c2A7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbm5lY3QoKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy53c0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIFdlYnNvY2tldENvbm5lY3Rpb24uZnJvbVNvY2tldChzb2NrZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldENvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldFF1ZXVlOiBBcnJheTxQYWNrZXREYXRhPiA9IFtdO1xuICAgIHByaXZhdGUgcmVjZWl2ZVdhaXRlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkaW5nUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYmVpbmdDbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNvY2tldDogV2ViU29ja2V0LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Tb2NrZXQoc29ja2V0OiBXZWJTb2NrZXQpOiBQcm9taXNlPFdlYnNvY2tldENvbm5lY3Rpb24+IHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBXZWJzb2NrZXRDb25uZWN0aW9uKHNvY2tldCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uYmVpbmdDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWRpbmdQcm9taXNlID0gY29ubmVjdGlvbi5vbk1lc3NhZ2UoZXZlbnQpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWRpbmdQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzb2NrZXQub25vcGVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50PHN0cmluZyB8IEJsb2I+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgc3RyaW5nIGRhdGEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkZXIgPSBhd2FpdCBCeXRlUmVhZGVyLmZyb21CbG9iKGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgdHlwZTogcmVhZGVyLnJlYWRTdHJpbmcoKSxcbiAgICAgICAgICAgIGRhdGE6IHJlYWRlci5yZWFkVWludDhBcnJheSgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBhY2tldFF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmICF0aGlzLmJlaW5nQ2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IHJlc29sdmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmIHRoaXMuYmVpbmdDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldERhdGEgPSB0aGlzLnBhY2tldFF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwYWNrZXREYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TRUQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbmQocGFja2V0OiBQYWNrZXQsIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQ8dW5rbm93bj4sIFBhY2tldERhdGE+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldERhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShwYWNrZXQpO1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0RGF0YS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXREYXRhLmRhdGEpO1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHdyaXRlci5maW5pc2goKSk7XG4gICAgfVxufVxuIiwKICAgICJ0eXBlIE9rPFQ+ID0ge1xuICAgIG9rOiB0cnVlO1xuICAgIGRhdGE6IFQ7XG59O1xudHlwZSBFcnI8RT4gPSB7XG4gICAgb2s6IGZhbHNlO1xuICAgIGRhdGE6IEU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCwgRSA9IEVycm9yPihmdW5jOiAoKSA9PiBUKTogT2s8VD4gfCBFcnI8RT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBmdW5jKCkgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZGF0YTogZSBhcyBFIH07XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuL2FkZHJlc3MuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJy4vYXBwLmpzJztcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi9oZWxwZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUHJvdmlkZXIge1xuICAgIGdldChzZXJ2ZXJBZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvblBhcmFtID0ge1xuICAgIGFkZHJlc3M6IEFkZHJlc3M7XG4gICAgdG9rZW46IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyVG9rZW5Qcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fUEFSQU1fS0VZID0gJ19vbXVfc2Vzc2lvbic7XG5cbiAgICBwcml2YXRlIGdldEtleShhZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbYWRkcmVzcy5ob3N0LCBhZGRyZXNzLnBvcnQsIGFkZHJlc3MuaGFzaCA/PyAnJywgYXBwLmlkLmtleSgpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChhZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IGZvdW5kVG9rZW4gPSB0aGlzLnBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3MpO1xuICAgICAgICBpZiAoZm91bmRUb2tlbikgcmV0dXJuIGZvdW5kVG9rZW47XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3M6IEFkZHJlc3MpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChCcm93c2VyVG9rZW5Qcm92aWRlci5UT0tFTl9QQVJBTV9LRVkpO1xuICAgICAgICBpZiAoIXBhcmFtKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgb2ssIGRhdGE6IHNlc3Npb24gfSA9IHRyeUNhdGNoPFNlc3Npb25QYXJhbT4oKCkgPT4gSlNPTi5wYXJzZShwYXJhbSkpO1xuICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBzZXNzaW9uIGZyb20gVVJMIHBhcmFtZXRlcjogJHtzZXNzaW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vzc2lvbi5hZGRyZXNzLmhhc2ggIT09IGFkZHJlc3MuaGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTZXNzaW9uIGFkZHJlc3MgaGFzaCBkb2VzIG5vdCBtYXRjaDogZXhwZWN0ZWQgJHthZGRyZXNzLmhhc2h9LCBnb3QgJHtzZXNzaW9uLmFkZHJlc3MuaGFzaH1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlc3Npb24udG9rZW47XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBFeHRlbnNpb25SZWdpc3RyeSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFTU0VUX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEFzc2V0RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvYXNzZXQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwgdHlwZSBEYXNoYm9hcmRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEVuZHBvaW50RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEhUVFBfRVhURU5TSU9OX1RZUEUsIEh0dHBFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9odHRwL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBJMThOX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEkxOG5FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9pMThuL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHR5cGUgTG9nZ2VyRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvbG9nZ2VyL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFBlcm1pc3Npb25FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9wZXJtaXNzaW9uL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHR5cGUgUGx1Z2luRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcGx1Z2luL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwgdHlwZSBSZWdpc3RyeUV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3JlZ2lzdHJ5L2V4dGVuc2lvbic7XG5pbXBvcnQgeyBTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHR5cGUgU2VydmVyRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2VydmVyL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCBTZXNzaW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2Vzc2lvbic7XG5pbXBvcnQgeyBTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHR5cGUgU2lnbmFsRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2lnbmFsL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBUQUJMRV9FWFRFTlNJT05fVFlQRSwgdHlwZSBUYWJsZUV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3RhYmxlL2V4dGVuc2lvbic7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJy4vYXBwLmpzJztcbmltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHR5cGUgeyBBZGRyZXNzLCBDb25uZWN0aW9uIH0gZnJvbSAnLi9uZXR3b3JrJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuL25ldHdvcmsnO1xuaW1wb3J0IHsgVHJhbnNwb3J0IH0gZnJvbSAnLi9uZXR3b3JrL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgV2Vic29ja2V0VHJhbnNwb3J0IH0gZnJvbSAnLi9uZXR3b3JrL3dlYnNvY2tldC10cmFuc3BvcnQnO1xuaW1wb3J0IHsgQnJvd3NlclRva2VuUHJvdmlkZXIsIHR5cGUgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vdG9rZW4uanMnO1xuXG5leHBvcnQgdHlwZSBDbGllbnRFdmVudHMgPSB7XG4gICAgc3RhcnRlZDogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICBzdG9wcGVkOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIHJlYWR5OiBFdmVudEVtaXR0ZXI8W10+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdSB7XG4gICAgcHVibGljIHJlYWR5OiBib29sZWFuO1xuICAgIHB1YmxpYyBydW5uaW5nOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGV2ZW50OiBDbGllbnRFdmVudHMgPSB7XG4gICAgICAgIHN0YXJ0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgc3RvcHBlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICByZWFkeTogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgIH07XG4gICAgcmVhZG9ubHkgdG9rZW46IFRva2VuUHJvdmlkZXI7XG4gICAgcmVhZG9ubHkgYWRkcmVzczogQWRkcmVzcztcbiAgICByZWFkb25seSBzZXNzaW9uczogU2Vzc2lvbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHJlYWRvbmx5IGVuZHBvaW50czogRW5kcG9pbnRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcGx1Z2luczogUGx1Z2luRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGRhc2hib2FyZDogRGFzaGJvYXJkRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGV4dGVuc2lvbnM6IEV4dGVuc2lvblJlZ2lzdHJ5O1xuICAgIHJlYWRvbmx5IHRhYmxlczogVGFibGVFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcmVnaXN0cmllczogUmVnaXN0cnlFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgc2lnbmFsczogU2lnbmFsRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGFzc2V0czogQXNzZXRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgaTE4bjogSTE4bkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBzZXJ2ZXI6IFNlcnZlckV4dGVuc2lvbjtcbiAgICByZWFkb25seSBsb2dnZXI6IExvZ2dlckV4dGVuc2lvbjtcbiAgICByZWFkb25seSBodHRwOiBIdHRwRXh0ZW5zaW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBhcHA6IEFwcCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGFkZHJlc3M/OiBBZGRyZXNzO1xuICAgICAgICAgICAgdG9rZW4/OiBUb2tlblByb3ZpZGVyIHwgc3RyaW5nO1xuICAgICAgICAgICAgdHJhbnNwb3J0PzogVHJhbnNwb3J0O1xuICAgICAgICAgICAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucz8udG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnM/LnRva2VuO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0b2tlbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnM/LnRva2VuID8/IG5ldyBCcm93c2VyVG9rZW5Qcm92aWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IG9wdGlvbnM/LmFkZHJlc3MgPz8ge1xuICAgICAgICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICAgICAgICBwb3J0OiAyNjQyMyxcbiAgICAgICAgICAgIHNlY3VyZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubmV0d29yayA9IG5ldyBOZXR3b3JrKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgICBvcHRpb25zPy50cmFuc3BvcnQgPz8gbmV3IFdlYnNvY2tldFRyYW5zcG9ydCh0aGlzLmFkZHJlc3MpLFxuICAgICAgICAgICAgb3B0aW9ucz8uY29ubmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLlJFQURZLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgUkVBRFkgcGFja2V0IHdoZW4gYWxyZWFkeSByZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbnNpb25SZWdpc3RyeSh0aGlzKTtcbiAgICAgICAgdGhpcy5lbmRwb2ludHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoUExVR0lOX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy50YWJsZXMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoVEFCTEVfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnNlc3Npb25zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFNFU1NJT05fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJpZXMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoUkVHSVNUUllfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmRhc2hib2FyZCA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnNpZ25hbHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0lHTkFMX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5hc3NldHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoQVNTRVRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmkxOG4gPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoSTE4Tl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2VydmVyID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFNFUlZFUl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKExPR0dFUl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuaHR0cCA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihIVFRQX0VYVEVOU0lPTl9UWVBFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZDxUPihwYWNrZXRUeXBlOiBQYWNrZXRUeXBlPFQ+LCBkYXRhOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmV0d29yay5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6IHBhY2tldFR5cGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGFscmVhZHkgcnVubmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSB0aGlzLm5ldHdvcmsuY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmV2ZW50LnN0YXJ0ZWQuZW1pdCgpO1xuICAgICAgICBhd2FpdCBjb25uZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50LnN0b3BwZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5yZWFkeS5saXN0ZW4oY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3YWl0Rm9yUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5KSByZXR1cm47XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHVubGlzdGVuID0gKCkgPT4ge307XG4gICAgICAgICAgICB1bmxpc3RlbiA9IHRoaXMuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztBQUdPLE1BQU0sa0JBQWtCO0FBQUEsRUFHRTtBQUFBLEVBRlosZUFBdUMsSUFBSTtBQUFBLEVBRTVELFdBQVcsQ0FBa0IsS0FBVTtBQUFBLElBQVY7QUFBQTtBQUFBLEVBRTdCLFFBQTZCLENBQUMsTUFBMkI7QUFBQSxJQUNyRCxJQUFJLEtBQUssYUFBYSxJQUFJLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFDbEMsTUFBTSxJQUFJLE1BQU0sa0JBQWtCLEtBQUsseUJBQXlCO0FBQUEsSUFDcEU7QUFBQSxJQUNBLE1BQU0sWUFBWSxLQUFLLE9BQU8sS0FBSyxHQUFHO0FBQUEsSUFDdEMsS0FBSyxhQUFhLElBQUksS0FBSyxNQUFNLFNBQVM7QUFBQSxJQUMxQyxPQUFPO0FBQUE7QUFFZjs7QUNrQk8sTUFBTSxJQUFJO0FBQUEsRUFDRztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRWhCLFdBQVcsQ0FBQyxJQUFZLFNBT3JCO0FBQUEsSUFDQyxLQUFLLEtBQUssV0FBVyxLQUFLLEVBQUU7QUFBQSxJQUM1QixLQUFLLFdBQVcsV0FBVyxhQUFhLFFB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
4799
+ //# debugId=7EC7028DE8DBCB6464756E2164756E21
4800
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9zcmMvYXBpL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9ieXRlYnVmZmVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvc2VyaWFsaXplci50cyIsICIuLi8uLi9zcmMvYXBpL2VuZHBvaW50L2VuZHBvaW50LnRzIiwgIi4uLy4uL3NyYy9hcGkvYXNzZXQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9yZWdpc3RyeS50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3RhYmxlLnRzIiwgIi4uLy4uL3NyYy9hcGkvZGFzaGJvYXJkL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9odHRwLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC93ZWJzb2NrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvZXZlbnQvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2xvY2sudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvcmVnaXN0cnkvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaTE4bi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9sb2dnZXIvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL2xvZ2dlci9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9wZXJtaXNzaW9uL3Blcm1pc3Npb24udHMiLCAiLi4vLi4vc3JjL2FwaS9wZXJtaXNzaW9uL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3BsdWdpbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2VydmVyL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3Nlc3Npb24vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2lnbmFsL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9zaWduYWwvc2lnbmFsLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2lnbmFsL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uL3NyYy92ZXJzaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2Nvbm5lY3Rpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvZW5jcnlwdGlvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9uZXR3b3JrLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3dlYnNvY2tldC10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL2hlbHBlci50cyIsICIuLi8uLi9zcmMvdG9rZW4udHMiLCAiLi4vLi4vc3JjL29tdS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2V4dGVuc2lvbi5qcyc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25SZWdpc3RyeSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHRlbnNpb25NYXA6IE1hcDxzdHJpbmcsIEV4dGVuc2lvbj4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7fVxuXG4gICAgcmVnaXN0ZXI8VCBleHRlbmRzIEV4dGVuc2lvbj4odHlwZTogRXh0ZW5zaW9uVHlwZTxUPik6IFQge1xuICAgICAgICBpZiAodGhpcy5leHRlbnNpb25NYXAuaGFzKHR5cGUubmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZW5zaW9uIHR5cGUgJHt0eXBlLm5hbWV9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHR5cGUuY3JlYXRlKHRoaXMub211KTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25NYXAuc2V0KHR5cGUubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsZSB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGl6YXRpb24uanMnO1xuXG5leHBvcnQgdHlwZSBBcHBNZXRhZGF0YSA9IHtcbiAgICBsb2NhbGU6IExvY2FsZTtcbiAgICBuYW1lPzogTG9jYWxpemVkVGV4dDtcbiAgICBpY29uPzogTG9jYWxpemVkVGV4dDtcbiAgICBkZXNjcmlwdGlvbj86IExvY2FsaXplZFRleHQ7XG4gICAgaW1hZ2U/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHNpdGU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHJlcG9zaXRvcnk/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGF1dGhvcnM/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGxpY2Vuc2U/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEFwcFR5cGUgPSAnYXBwJyB8ICdzZXJ2aWNlJyB8ICdyZW1vdGUnIHwgJ3BsdWdpbicgfCAnZGFzaGJvYXJkJztcblxuZXhwb3J0IHR5cGUgRGVwZW5kZW5jeVNwZWNpZmllciA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaW5kZXg/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcHBKc29uID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogQXBwVHlwZTtcbiAgICBwYXJlbnRfaWQ/OiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBBcHAge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQXBwVHlwZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50SWQ/OiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSB1cmw/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgcHVibGljIHJlYWRvbmx5IGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogSW50b0lkLCBvcHRpb25zOiB7XG4gICAgICAgIHR5cGU/OiBBcHBUeXBlO1xuICAgICAgICBwYXJlbnRJZD86IEludG9JZDtcbiAgICAgICAgdmVyc2lvbj86IHN0cmluZztcbiAgICAgICAgdXJsPzogc3RyaW5nO1xuICAgICAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBJZGVudGlmaWVyLmZyb20oaWQpO1xuICAgICAgICB0aGlzLnBhcmVudElkID0gSWRlbnRpZmllci5mcm9tT3B0aW9uYWwob3B0aW9ucy5wYXJlbnRJZCk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbjtcbiAgICAgICAgdGhpcy51cmwgPSBvcHRpb25zLnVybDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZSA/PyAnYXBwJztcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBvcHRpb25zLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGluZm86IEFwcEpzb24pOiBBcHAge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShpbmZvLmlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHAoaWQsIHtcbiAgICAgICAgICAgIHBhcmVudElkOiBJZGVudGlmaWVyLmZyb21PcHRpb25hbChpbmZvLnBhcmVudF9pZCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBpbmZvLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGluZm8udXJsLFxuICAgICAgICAgICAgdHlwZTogaW5mby50eXBlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGluZm8uZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBBcHApOiBBcHBKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgcGFyZW50X2lkOiBkYXRhLnBhcmVudElkPy5rZXkoKSxcbiAgICAgICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwsXG4gICAgICAgICAgICBtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogZGF0YS5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aHM6IHN0cmluZ1tdKTogQXBwIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHAodGhpcy5pZC5qb2luKC4uLnBhdGhzKSwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IHRoaXMuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211JztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb24ge1xuICAgIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25UeXBlPFQgZXh0ZW5kcyBFeHRlbnNpb24gPSBFeHRlbnNpb24+IGV4dGVuZHMgSWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGU6IChvbXU6IE9tdSkgPT4gVCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ2V4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKCdleHQnLCB0aGlzLm5hbWUpLmtleSgpO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHRleHRFbmNvZGVyOiBUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuZXhwb3J0IGNvbnN0IHRleHREZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5pbXBvcnQgeyBKc29uVHlwZSB9IGZyb20gJy4vc2VyaWFsaXplci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbGFncyB7XG4gICAgcHJpdmF0ZSB2YWx1ZTogbnVtYmVyO1xuICAgIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IHZhbHVlPzogbnVtYmVyOyBsZW5ndGg/OiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdGlvbnMubGVuZ3RoID8/IDMyO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQocG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgJiAoMSA8PCBwb3NpdGlvbikpICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpZlNldDxUPihwb3NpdGlvbjogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5oYXMocG9zaXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocG9zaXRpb246IG51bWJlciwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlIHw9IDEgPDwgcG9zaXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlICY9IH4oMSA8PCBwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUod3JpdGVyOiBCeXRlV3JpdGVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBuZXcgVWludDhBcnJheSgodGhpcy5sZW5ndGggKyA3KSAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJpdHNbaV0gPSAodGhpcy52YWx1ZSA+PiAoaSAqIDgpKSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLndyaXRlKGJpdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZChyZWFkZXI6IEJ5dGVSZWFkZXIsIGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChsZW5ndGggKyA3KSAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFsdWUgfD0gcmVhZGVyLnJlYWRVaW50OCgpIDw8IChpICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbGFncyh7IHZhbHVlLCBsZW5ndGggfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzaWduID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg4MDAwKSA/IC0xIDogMTtcbiAgICBjb25zdCBleHBvbmVudCA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4N2MwMCkgPj4gMTA7XG4gICAgY29uc3QgbWFudGlzc2EgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDAzZmYpO1xuICAgIGlmIChleHBvbmVudCA9PT0gMCAmJiBtYW50aXNzYSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ID09PSAweDFmKSB7XG4gICAgICAgIHJldHVybiBtYW50aXNzYSA9PT0gMCA/IEluZmluaXR5ICogc2lnbiA6IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCAtIDE1O1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBtYW50aXNzYSAvIDEwMjQ7XG4gICAgICAgIHJldHVybiBzaWduICogTWF0aC5wb3coMiwgbm9ybWFsaXplZEV4cG9uZW50KSAqICgxICsgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQxNihkYXRhVmlldzogRGF0YVZpZXcsIG9mZnNldDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZzIodmFsdWUpKTtcbiAgICBjb25zdCBtYW50aXNzYSA9IHZhbHVlIC8gTWF0aC5wb3coMiwgZXhwb25lbnQpIC0gMTtcbiAgICBjb25zdCBub3JtYWxpemVkRXhwb25lbnQgPSBleHBvbmVudCArIDE1O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IE1hdGgucm91bmQobWFudGlzc2EgKiAxMDI0KTtcbiAgICBpZiAobm9ybWFsaXplZEV4cG9uZW50IDw9IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgc2lnbiA8PCAxNSk7XG4gICAgfSBlbHNlIGlmIChub3JtYWxpemVkRXhwb25lbnQgPj0gMHgxZikge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAweDdjMDAgfCAoc2lnbiA8PCAxNSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIChzaWduIDw8IDE1KSB8IChub3JtYWxpemVkRXhwb25lbnQgPDwgMTApIHwgbm9ybWFsaXplZE1hbnRpc3NhKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlV3JpdGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIGJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gICAgcHJpdmF0ZSBvZmZzZXQgPSAwO1xuICAgIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGluaXQ/OiBBcnJheUJ1ZmZlciwgb2Zmc2V0PzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0ID8/IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gaW5pdCA/PyBuZXcgQXJyYXlCdWZmZXIoMTAyNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVdyaXRlcihhcnJheUJ1ZmZlciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWxsb2NhdGUobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgbGVuZ3RoID4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV3Qnl0ZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGggKiAyLCB0aGlzLm9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3Qnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBuZXcgVWludDhBcnJheShuZXdCdWZmZXIpLnNldChuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXdCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZShkYXRhOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZShkYXRhLmxlbmd0aCk7XG4gICAgICAgIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKS5zZXQoZGF0YSwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQm9vbGVhbih2YWx1ZTogYm9vbGVhbik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlID8gMSA6IDApO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MTYodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVTEVCMTI4KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSA+Pj0gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSAmIDB4N2YpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgd3JpdGVGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQ2NCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQ2NCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OEFycmF5KHZhbHVlOiBVaW50OEFycmF5KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVTEVCMTI4KHZhbHVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLndyaXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVpbnQ4QXJyYXkodGV4dEVuY29kZXIuZW5jb2RlKHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUpTT04odmFsdWU6IEpzb25UeXBlKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxhZ3MoZmxhZ3M6IEZsYWdzKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIGZsYWdzLndyaXRlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIsIDAsIHRoaXMub2Zmc2V0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCeXRlUmVhZGVyIHtcbiAgICBwcml2YXRlIGRhdGFWaWV3OiBEYXRhVmlldztcbiAgICBwcml2YXRlIG9mZnNldDogbnVtYmVyO1xuICAgIHByaXZhdGUgZmluaXNoZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGRhdGE6IERhdGFWaWV3KSB7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBkYXRhO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IEJ5dGVSZWFkZXIge1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZnJvbUJsb2IoYmxvYjogQmxvYik6IFByb21pc2U8Qnl0ZVJlYWRlcj4ge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkKHNpemU6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaXplIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBzaXplID4gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhVmlldy5idWZmZXIsIHRoaXMub2Zmc2V0LCBzaXplKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkQm9vbGVhbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdJbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnVWludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVUxFQjEyOCgpOiBudW1iZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgbGV0IHNoaWZ0ID0gMDtcbiAgICAgICAgbGV0IGJ5dGU6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBieXRlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgfD0gKGJ5dGUgJiAwYjAxMTExMTExKSA8PCBzaGlmdDtcbiAgICAgICAgICAgIHNoaWZ0ICs9IDc7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKChieXRlICYgMGIxMDAwMDAwMCkgIT09IDApO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZEZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQ2NCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4QXJyYXkoKTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZChsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IHRoaXMucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShieXRlQXJyYXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSlNPTjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFQge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLnJlYWRTdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbGFncyhsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgcmV0dXJuIEZsYWdzLnJlYWQodGhpcywgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgIT09IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgdHlwZSBKc29uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyBba2V5IGluIG5ldmVyXT86IEpzb25UeXBlIH0gfCBKc29uVHlwZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgc2VyaWFsaXplKGRhdGE6IFQpOiBEO1xuICAgIGRlc2VyaWFsaXplKGRhdGE6IEQpOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplcjxULCBEPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemU6IChkYXRhOiBUKSA9PiBELFxuICAgICAgICBwdWJsaWMgZGVzZXJpYWxpemU6IChkYXRhOiBEKSA9PiBULFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG9mPFQsIEQ+KHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBEPik6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oc2VyaWFsaXplci5zZXJpYWxpemUsIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGlwZTxULCBSLCBEPihzZXIxOiBTZXJpYWxpemFibGU8VCwgUj4sIHNlcjI6IFNlcmlhbGl6YWJsZTxSLCBEPik6IFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIyLnNlcmlhbGl6ZShzZXIxLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gc2VyMS5kZXNlcmlhbGl6ZShzZXIyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybTxUPihmdW5jOiAodmFsdWU6IFQpID0+IFQpOiBTZXJpYWxpemVyPFQsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFQ+KFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub29wPFQ+KCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZDxcbiAgICAgICAgSyBleHRlbmRzIGtleW9mIEQsXG4gICAgICAgIFIsXG4gICAgPihcbiAgICAgICAga2V5OiBLLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RFtLXSwgUj4sXG4gICAgKTogU2VyaWFsaXplcjxcbiAgICAgICAgVCxcbiAgICAgICAgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9XG4gICAgPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxcbiAgICAgICAgICAgIFQsXG4gICAgICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICAgICAgPihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZXJpYWxpemVkW2tleV0pLFxuICAgICAgICAgICAgICAgIH0gYXMgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhW2tleV0gYXMgUiksXG4gICAgICAgICAgICAgICAgfSBhcyBEKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb248VCBleHRlbmRzIEpzb25UeXBlPigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBVaW50OEFycmF5PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB0ZXh0RW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUoZGF0YSkpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXkoKTogU2VyaWFsaXplcjxUW10sIERbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VFtdLCBEW10+KFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEubWFwKChpdGVtKSA9PiB0aGlzLnNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuZGVzZXJpYWxpemUoaXRlbSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b01hcCgpOiBTZXJpYWxpemVyPE1hcDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBEPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEQ+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2soZmFsbGJhY2s6IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZhbGxiYWNrTWFwKGZhbGxiYWNrOiAoZGF0YTogRCwgZXJyb3I6IHVua25vd24pID0+IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soZGF0YSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBpcGU8RT4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPEQsIEU+KTogU2VyaWFsaXplcjxULCBFPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBFPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50VHlwZTxSZXEgPSB1bmtub3duLCBSZXMgPSB1bmtub3duPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uSWQ/OiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkLFxuICAgICkgeyB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxSZXEsIFJlcywgUmVxRGF0YSBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGUsIFJlc0RhdGEgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFJlcSwgUmVxRGF0YT47XG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8UmVzLCBSZXNEYXRhPjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZD86IEludG9JZDtcbiAgICAgICAgfSxcbiAgICApOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFR5cGU8UmVxLCBSZXM+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8UmVxLCBKc29uVHlwZSwgVWludDhBcnJheT4ocmVxdWVzdFNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxSZXMsIEpzb25UeXBlLCBVaW50OEFycmF5PihyZXNwb25zZVNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25JZCA/IElkZW50aWZpZXIuZnJvbShwZXJtaXNzaW9uSWQpIDogdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFJlcSwgUmVzPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UmVxLCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcywgVWludDhBcnJheT47XG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQ/OiBJbnRvSWQ7XG4gICAgICAgIH0sXG4gICAgKTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiB7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRUeXBlPFJlcSwgUmVzPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQgPyBJZGVudGlmaWVyLmZyb20ocGVybWlzc2lvbklkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuZXhwb3J0IGNvbnN0IEFTU0VUX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEFzc2V0RXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdhc3NldCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgQXNzZXRFeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCB0eXBlIEFzc2V0ID0ge1xuICAgIGlkZW50aWZpZXI6IElkZW50aWZpZXI7XG4gICAgYnVmZmVyOiBVaW50OEFycmF5O1xufTtcblxuY29uc3QgRklMRV9TRVJJQUxJWkVSID0gbmV3IFNlcmlhbGl6ZXI8QXNzZXQsIFVpbnQ4QXJyYXk+KFxuICAgIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhmaWxlLmlkZW50aWZpZXIua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGZpbGUuYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgIHJldHVybiB7IGlkZW50aWZpZXIsIGJ1ZmZlciB9O1xuICAgIH0sXG4pO1xuY29uc3QgRklMRV9BUlJBWV9TRVJJQUxJWkVSID0gbmV3IFNlcmlhbGl6ZXI8QXNzZXRbXSwgVWludDhBcnJheT4oXG4gICAgKGZpbGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgoZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoZmlsZS5pZGVudGlmaWVyLmtleSgpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoZmlsZS5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfSxcbiAgICAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgZmlsZXM6IEFzc2V0W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IGlkZW50aWZpZXIsIGJ1ZmZlciB9KTtcbiAgICAgICAgfVxuICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IEFTU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBBU1NFVF9FWFRFTlNJT05fVFlQRS5qb2luKCdwZXJtaXNzaW9uJyk7XG5cbmNvbnN0IEFTU0VUX1VQTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0LCBJZGVudGlmaWVyPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX1VQTE9BRF9NQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8QXNzZXRbXSwgSWRlbnRpZmllcltdPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWRfbWFueScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBGSUxFX0FSUkFZX1NFUklBTElaRVIsXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RPV05MT0FEX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgQXNzZXQ+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2Rvd25sb2FkJyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllcltdLCBBc3NldFtdPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdkb3dubG9hZF9tYW55JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IEZJTEVfQVJSQVlfU0VSSUFMSVpFUixcbiAgICAgICAgcGVybWlzc2lvbklkOiBBU1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuY29uc3QgQVNTRVRfREVMRVRFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllciwgbnVsbD4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZGVsZXRlJyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcblxuY29uc3QgQVNTRVRfR0VORVJBVEVfVE9LRU5fRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxvYmplY3QsIHsgdG9rZW46IHN0cmluZyB9PihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd0b2tlbl9nZW5lcmF0ZScsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcblxuZXhwb3J0IGNsYXNzIEFzc2V0RXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxBc3NldEV4dGVuc2lvbj4gPSBBU1NFVF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGFzc2V0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsuZXZlbnQuZGlzY29ubmVjdGVkLmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFzc2V0VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUub25SZWFkeShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob211LnBlcm1pc3Npb25zLnJlcXVpcmVkKEFTU0VUX1BFUk1JU1NJT05fSUQpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0R2VuZXJhdGVBc3NldFRva2VuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoaWRlbnRpZmllcjogSW50b0lkLCBidWZmZXI6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPElkZW50aWZpZXI+IHtcbiAgICAgICAgY29uc3QgYXNzZXRJZGVudGlmaWVyID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfVVBMT0FEX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBidWZmZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXNzZXRJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRNYW55KC4uLmZpbGVzOiBBc3NldFtdKTogUHJvbWlzZTxJZGVudGlmaWVyW10+IHtcbiAgICAgICAgY29uc3QgdXBsb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCwgZmlsZXMpO1xuICAgICAgICByZXR1cm4gdXBsb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkKGlkZW50aWZpZXI6IEludG9JZCk6IFByb21pc2U8QXNzZXQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ET1dOTE9BRF9FTkRQT0lOVCwgaWQpO1xuICAgICAgICByZXR1cm4gZG93bmxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRNYW55KC4uLmlkZW50aWZpZXJzOiBJbnRvSWRbXSk6IFByb21pc2U8QXNzZXRbXT4ge1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5ULFxuICAgICAgICAgICAgaWRlbnRpZmllcnMubWFwKChpZCkgPT4gSWRlbnRpZmllci5mcm9tKGlkKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkb3dubG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUoaWRlbnRpZmllcjogSW50b0lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9ERUxFVEVfRU5EUE9JTlQsIGlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcXVlc3RHZW5lcmF0ZUFzc2V0VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKEFTU0VUX0dFTkVSQVRFX1RPS0VOX0VORFBPSU5ULCB7fSk7XG4gICAgICAgIHRoaXMuYXNzZXRUb2tlbiA9IHJlc3VsdC50b2tlbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKFxuICAgICAgICBpZDogSW50b0lkLFxuICAgICAgICBvcHRpb25zPzogeyBjYWNoZT86ICduby1jYWNoZScgfSxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuYXNzZXRUb2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldCB0b2tlbiBpcyBub3Qgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMub211Lm5ldHdvcmsuYWRkcmVzcztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBhZGRyZXNzLnNlY3VyZSA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7cHJvdG9jb2x9Oi8vJHthZGRyZXNzLmhvc3R9OiR7YWRkcmVzcy5wb3J0fS9hc3NldGApO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnYXNzZXRfdG9rZW4nLCB0aGlzLmFzc2V0VG9rZW4pO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnaWQnLCBrZXkpO1xuICAgICAgICBpZiAob3B0aW9ucz8uY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd0JywgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmFzc2V0VG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXQgdG9rZW4gaXMgbm90IHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLm9tdS5uZXR3b3JrLmFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gYWRkcmVzcy5zZWN1cmUgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IG5ldyBVUkwoYCR7cHJvdG9jb2x9Oi8vJHthZGRyZXNzLmhvc3R9OiR7YWRkcmVzcy5wb3J0fS9wcm94eWApO1xuICAgICAgICBwcm94eVVybC5zZWFyY2hQYXJhbXMuc2V0KCdhc3NldF90b2tlbicsIHRoaXMuYXNzZXRUb2tlbik7XG4gICAgICAgIHByb3h5VXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3VybCcsIHVybCk7XG4gICAgICAgIHJldHVybiBwcm94eVVybC50b1N0cmluZygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBKc29uVHlwZSwgdHlwZSBTZXJpYWxpemFibGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBQYWNrZXREYXRhID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbiAgICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IHR5cGUgUGFja2V0PFQgPSB1bmtub3duPiA9IHtcbiAgICByZWFkb25seSB0eXBlOiBQYWNrZXRUeXBlPFQ+O1xuICAgIHJlYWRvbmx5IGRhdGE6IFQ7XG59O1xuXG5leHBvcnQgY2xhc3MgUGFja2V0VHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5ldyhkYXRhOiBUKTogUGFja2V0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgbWF0Y2gocGFja2V0OiBQYWNrZXQpOiBwYWNrZXQgaXMgUGFja2V0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC50eXBlID09PSB0aGlzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgfSk6IFBhY2tldFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhY2tldFR5cGU8VD4oXG4gICAgICAgICAgICBpZGVudGlmaWVyLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlKFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIHJlYWQ/OiBzdHJpbmc7XG4gICAgd3JpdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkO1xuICAgIHJlYWQ/OiBJbnRvSWQ7XG4gICAgd3JpdGU/OiBJbnRvSWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBwZXJtaXNzaW9ucz86IFJlZ2lzdHJ5UGVybWlzc2lvbnM7XG4gICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgfSk6IFJlZ2lzdHJ5VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXI6IEludG9JZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIHBlcm1pc3Npb25zLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFQ7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeTxUPiB7XG4gICAgcmVhZG9ubHkgdHlwZTogUmVnaXN0cnlUeXBlPFQ+O1xuICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgIGdldCgpOiBQcm9taXNlPFQ+O1xuICAgIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbW9kaWZ5KGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbGlzdGVuKGZuOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcblxuICAgIGNvbXBhdFN2ZWx0ZSgpOiBXcml0YWJsZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgU3Vic2NyaWJlcjxUPiA9ICh2YWx1ZTogVCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmVyID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlcjxUPiA9ICh2YWx1ZTogVCkgPT4gVDtcblxuZXhwb3J0IHR5cGUgU3RhcnRTdG9wTm90aWZpZXI8VD4gPSAoXG4gICAgc2V0OiAodmFsdWU6IFQpID0+IHZvaWQsXG4gICAgdXBkYXRlOiAoZm46IFVwZGF0ZXI8VD4pID0+IHZvaWRcbikgPT4gdm9pZCB8ICgoKSA9PiB2b2lkKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWFkYWJsZTxUPiB7XG4gICAgc3Vic2NyaWJlKHRoaXM6IHZvaWQsIHJ1bjogU3Vic2NyaWJlcjxUPik6IFVuc3Vic2NyaWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0YWJsZTxUPiBleHRlbmRzIFJlYWRhYmxlPFQ+IHtcbiAgICBzZXQodGhpczogdm9pZCwgdmFsdWU6IFQpOiB2b2lkO1xuICAgIHVwZGF0ZSh0aGlzOiB2b2lkLCB1cGRhdGVyOiBVcGRhdGVyPFQ+KTogdm9pZDtcbiAgICB3YWl0KCk6IFByb21pc2U8VD47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyLCBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbmZpZyA9IHtcbiAgICBjYWNoZV9zaXplOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlPFQ+IHtcbiAgICByZWFkb25seSBjYWNoZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBUPjtcbiAgICByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBnZXRNYW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgYWRkKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG4gICAgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNNYW55PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oLi4ua2V5czogKGtleW9mIFQpW10pOiBQcm9taXNlPHsgW2tleSBpbiBrZXlvZiBUXTogYm9vbGVhbiB9PjtcbiAgICBoYXNBbGwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBmZXRjaEl0ZW1zKHtcbiAgICAgICAgbGltaXQsXG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBsaW1pdDogbnVtYmVyO1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hSYW5nZSh7IHN0YXJ0LCBlbmQgfTogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hBbGwoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgaXRlcmF0ZSh7IGJhY2t3YXJkLCBjdXJzb3IgfTogeyBiYWNrd2FyZD86IGJvb2xlYW47IGN1cnNvcj86IHN0cmluZyB9KTogQXN5bmNJdGVyYWJsZTxUPjtcbiAgICBzaXplKCk6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIHByb3h5KHByb3h5OiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuO1xuICAgIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkO1xuICAgIHNldENvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZDtcbiAgICBzZXRQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogVGFibGVQZXJtaXNzaW9ucyk6IHZvaWQ7XG5cbiAgICBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG5cbmV4cG9ydCB0eXBlIFRhYmxlRXZlbnRzPFQ+ID0ge1xuICAgIGFkZDogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHJlbW92ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIGNsZWFyOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIGNhY2hlVXBkYXRlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVBlcm1pc3Npb25zID0ge1xuICAgIGFsbD86IElkZW50aWZpZXI7XG4gICAgcmVhZD86IElkZW50aWZpZXI7XG4gICAgd3JpdGU/OiBJZGVudGlmaWVyO1xuICAgIHJlbW92ZT86IElkZW50aWZpZXI7XG4gICAgcHJveHk/OiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IGNsYXNzIFRhYmxlVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIGtleUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zIHwgdW5kZWZpbmVkLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICAgICAgfSxcbiAgICApOiBUYWJsZVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnM7XG4gICAgICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgQXBwSW5zdGFsbFJlc3BvbnNlID0ge1xuICAgIGFjY2VwdGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BGaWxlID0ge1xuICAgIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFBvc2l0aW9uID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRW50ZXIgPSB7XG4gICAgdHlwZTogJ2VudGVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ092ZXIgPSB7XG4gICAgdHlwZTogJ292ZXInO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wID0ge1xuICAgIHR5cGU6ICdkcm9wJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0xlYXZlID0ge1xuICAgIHR5cGU6ICdsZWF2ZSc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ1N0YXRlID0gRHJhZ0VudGVyIHwgRHJhZ092ZXIgfCBEcmFnRHJvcCB8IERyYWdMZWF2ZTtcblxuZXhwb3J0IHR5cGUgRmlsZURyYWdQYWNrZXQgPSB7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwO1xuICAgIHN0YXRlOiBEcmFnU3RhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZE1ldGEgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBmaWxlczogcmVhZG9ubHkgRHJhZ0Ryb3BGaWxlW107XG59O1xuXG5leHBvcnQgdHlwZSBGaWxlRGF0YSA9IHtcbiAgICBmaWxlOiBEcmFnRHJvcEZpbGU7XG4gICAgYnVmZmVyOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyID0gMSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEcmFnRHJvcFJlYWRSZXNwb25zZSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGRhdGEudmVyc2lvbik7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLm1ldGEpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhkYXRhLmZpbGVzKS5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgeyBmaWxlLCBidWZmZXIgfV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5maWxlcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGZpbGUpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2Uge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcblxuICAgICAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBEcmFnRHJvcEZpbGUgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0geyBmaWxlLCBidWZmZXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UoXG4gICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0ID0gb2JqZWN0O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwSnNvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBvazogYm9vbGVhbjtcbn07XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvblR5cGVKc29uIH0gZnJvbSAnLi4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IFBhY2thZ2VJbmZvIH0gZnJvbSAnLi4vcGx1Z2luL3BhY2thZ2UtaW5mby5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnkvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgQXBwSW5kZXhSZWdpc3RyeU1ldGEgfSBmcm9tICcuLi9zZXJ2ZXIvZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XG5pbXBvcnQgeyBUYWJsZVR5cGUgfSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkSGFuZGxlciB9IGZyb20gJy4vaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBBcHBJbnN0YWxsUmVzcG9uc2UsIERyYWdEcm9wLCBEcmFnRHJvcFJlYWRSZXF1ZXN0LCBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkLCBEcmFnRHJvcFJlYWRSZXNwb25zZSwgRHJhZ0Ryb3BSZXF1ZXN0LCBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQsIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlLCBEcmFnRW50ZXIsIERyYWdMZWF2ZSwgRHJhZ092ZXIsIEZpbGVEcmFnUGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxEYXNoYm9hcmRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2Rhc2hib2FyZCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgRGFzaGJvYXJkRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG50eXBlIERhc2hib2FyZFNldFJlc3BvbnNlID0ge1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG59O1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdzZXQnKTtcbmNvbnN0IERBU0hCT0FSRF9TRVRfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyLCBEYXNoYm9hcmRTZXRSZXNwb25zZT4oXG4gICAgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3NldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnb3BlbicpO1xuY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248QXBwLCB2b2lkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb3Blbl9hcHAnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBBcHAsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxBcHA+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvcGVuX2FwcCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5leHBvcnQgY29uc3QgREFTSE9CQVJEX0FQUF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ3JlYWQnKTtcbmV4cG9ydCBjb25zdCBEQVNIT0JBUkRfQVBQX0VESVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnZWRpdCcpO1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdpbnN0YWxsJyk7XG5jb25zdCBEQVNIQk9BUkRfQVBQX0lOU1RBTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxBcHAsIEFwcEluc3RhbGxSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luc3RhbGxfYXBwJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogQXBwLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignZHJhZ19kcm9wJyk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1NUQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxGaWxlRHJhZ1BhY2tldD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9zdGF0ZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPEZpbGVEcmFnUGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnYXBwJywgQXBwKSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RHJhZ0Ryb3BSZWFkUmVxdWVzdCwgRHJhZ0Ryb3BSZWFkUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVFVRVNUX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWRfcmVxdWVzdCcsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVNQT05TRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RHJhZ0Ryb3BSZWFkUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZF9yZXNwb25zZScsXG4gICAgc2VyaWFsaXplcjogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdCwgRHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3QnLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3RfYXBwcm92YWwnLFxufSk7XG5cbnR5cGUgRHJhZ0Ryb3BIYW5kbGVyID0ge1xuICAgIG9uRW50ZXIoZm46IChldmVudDogRHJhZ0VudGVyKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbk92ZXIoZm46IChldmVudDogRHJhZ092ZXIpID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uRHJvcChmbjogKGV2ZW50OiBEcmFnRHJvcCkgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25MZWF2ZShmbjogKGV2ZW50OiBEcmFnTGVhdmUpID0+IHVua25vd24pOiB2b2lkO1xuICAgIHJlYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8RHJhZ0Ryb3BSZWFkUmVzcG9uc2U+O1xufTtcblxuZXhwb3J0IHR5cGUgQ29va2llID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld1JlcXVlc3QgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UGFja2V0ID0ge1xuICAgIGlkOiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IHR5cGUgVXNlclJlc3BvbnNlPFQgPSB1bmRlZmluZWQ+ID0ge1xuICAgIHR5cGU6ICdvayc7XG4gICAgdmFsdWU6IFQ7XG59IHwge1xuICAgIHR5cGU6ICdibG9ja2VkJztcbn0gfCB7XG4gICAgdHlwZTogJ2NhbmNlbGxlZCc7XG59O1xuZXhwb3J0IGNsYXNzIFVzZXJSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVzdWx0OiB7XG4gICAgICAgICAgICB0eXBlOiAnb2snO1xuICAgICAgICAgICAgdmFsdWU6IFQ7XG4gICAgICAgIH0gfCB7XG4gICAgICAgICAgICB0eXBlOiAnYmxvY2tlZCc7XG4gICAgICAgIH0gfCB7XG4gICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJztcbiAgICAgICAgfSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgdW53cmFwKCk6IFQge1xuICAgICAgICBpZiAodGhpcy5yZXN1bHQudHlwZSA9PT0gJ29rJykgcmV0dXJuIHRoaXMucmVzdWx0LnZhbHVlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHVud3JhcCBhICR7dGhpcy5yZXN1bHQudHlwZX0gcmVzdWx0YCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UmVzcG9uc2UgPSBVc2VyUmVzcG9uc2UgJiBXZWJ2aWV3UGFja2V0O1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCd3ZWJ2aWV3Jyk7XG5cbmV4cG9ydCB0eXBlIEhvc3RSZXF1ZXN0ID0ge1xuICAgIGhvc3Q6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdldENvb2tpZXNSZXF1ZXN0ID0ge1xuICAgIHVybDogc3RyaW5nO1xufTtcblxuY29uc3QgREFTSEJPQVJEX0NPT0tJRVNfR0VUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248R2V0Q29va2llc1JlcXVlc3QsIFVzZXJSZXNwb25zZTxDb29raWVbXT4+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdjb29raWVzX2dldCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3UmVxdWVzdCwgV2Vidmlld1Jlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19yZXF1ZXN0JyxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UmVzcG9uc2U+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19DTE9TRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdQYWNrZXQsIFdlYnZpZXdSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfY2xvc2UnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1BhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1Jlc3BvbnNlPigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50ID0ge1xuICAgIHR5cGU6ICdjbG9zZWQnO1xufSB8IHtcbiAgICB0eXBlOiAncmVzaXplJztcbiAgICBkaW1lbnRpb25zOiB7XG4gICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgeTogbnVtYmVyO1xuICAgIH07XG59IHwge1xuICAgIHR5cGU6ICdjb29raWUnO1xuICAgIGNvb2tpZXM6IENvb2tpZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50TGlzdGVuZXJzID0ge1xuICAgIFtLIGluIFdlYnZpZXdFdmVudFsndHlwZSddXT86IEFycmF5PChldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogSyB9PikgPT4gdm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRQYWNrZXQgPSB7XG4gICAgaWQ6IElkZW50aWZpZXI7XG4gICAgdGFyZ2V0OiBJZGVudGlmaWVyO1xuICAgIGV2ZW50OiBXZWJ2aWV3RXZlbnQ7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3SGFuZGxlID0ge1xuICAgIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICAgIGdldENvb2tpZXMoKTogUHJvbWlzZTxDb29raWVbXT47XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBvbjxUIGV4dGVuZHMgV2Vidmlld0V2ZW50Wyd0eXBlJ10+KGtleTogVCwgY2FsbGJhY2s6IChldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9PikgPT4gdm9pZCk6IHZvaWQ7XG4gICAgam9pbigpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50RW1pdCA9IDxUIGV4dGVuZHMgV2Vidmlld0V2ZW50Wyd0eXBlJ10+KGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBUIH0+KSA9PiB2b2lkO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2Vidmlld0V2ZW50UGFja2V0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19ldmVudCcsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdFdmVudFBhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllcilcbiAgICAgICAgLmZpZWxkKCd0YXJnZXQnLCBJZGVudGlmaWVyKSxcbn0pO1xuXG50eXBlIEFsbG93ZWRIb3N0ID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaG9zdHM6IHN0cmluZ1tdO1xufTtcblxuY29uc3QgREFTSEJPQVJEX0FMTE9XRURfV0VCVklFV19IT1NUUyA9IFRhYmxlVHlwZS5jcmVhdGVKc29uPEFsbG93ZWRIb3N0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF93ZWJ2aWV3X2hvc3RzJyxcbiAgICBrZXk6IChlbnRyeSkgPT4gZW50cnkuaWQsXG4gICAgcGVybWlzc2lvbnM6IHsgYWxsOiBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQgfSxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfSE9TVF9SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248e1xuICAgIGhvc3Q6IHN0cmluZztcbn0sIFVzZXJSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2hvc3RfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc3BlZWNoX3JlY29nbml0aW9uJyk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRTZWdtZW50ID0ge1xuICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICB0cmFuc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUcmFuc2NyaXB0U3RhdHVzID0ge1xuICAgIHR5cGU6ICdpZGxlJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc3VsdCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdmaW5hbCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdhdWRpb19zdGFydGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn0gfCB7XG4gICAgdHlwZTogJ2F1ZGlvX2VuZGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUcmFuc2NyaXB0U3RhdHVzPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uJyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgdHlwZTogJ2lkbGUnIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgICAgICB3cml0ZTogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgU3BlZWNoUmVjb2duaXRpb25TdGFydCA9IHtcbiAgICB0eXBlOiAnc3RhcnQnO1xufTtcblxuY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFNwZWVjaFJlY29nbml0aW9uU3RhcnQsIFVzZXJSZXNwb25zZTx1bmRlZmluZWQ+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uX3N0YXJ0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5pbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEJhc2U8VCBleHRlbmRzIHN0cmluZz4ge1xuICAgIGtpbmQ6IFQ7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3Blcm1pc3Npb25zJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvblR5cGVKc29uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3BsdWdpbnMnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBhY2thZ2VzOiBQYWNrYWdlSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9pbnN0YWxsJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBVcGRhdGUgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3VwZGF0ZSc+IHtcbiAgICBvbGRfYXBwOiBBcHBKc29uO1xuICAgIG5ld19hcHA6IEFwcEpzb247XG4gICAgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2luZGV4L2luc3RhbGwnPiB7XG4gICAgaW5kZXhfdXJsOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRQcm9jZXNzIHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RIdHRwUG9ydCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdodHRwL3BvcnQnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHByb2Nlc3NlczogUG9ydFByb2Nlc3NbXTtcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0UmVxdWVzdCA9IChcbiAgICBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnNcbiAgICB8IFByb21wdFJlcXVlc3RBcHBQbHVnaW5zXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwSW5zdGFsbFxuICAgIHwgUHJvbXB0UmVxdWVzdEFwcFVwZGF0ZVxuICAgIHwgUHJvbXB0UmVxdWVzdEluZGV4SW5zdGFsbFxuICAgIHwgUHJvbXB0UmVxdWVzdEh0dHBQb3J0XG4pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVxdWVzdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXF1ZXN0Jyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXN1bHQgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdibG9jayc7XG5cbmludGVyZmFjZSBQcm9tcHRSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBraW5kOiBzdHJpbmc7XG4gICAgcmVzdWx0OiBQcm9tcHRSZXN1bHQ7XG59XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfcmVzcG9uc2UnLFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPG51bGwsIG51bGw+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfY2xlYXJfYmxvY2tlZCcsXG59KTtcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGRhc2hib2FyZDogRGFzaGJvYXJkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZHJhZ0Ryb3BIYW5kbGVyOiBEcmFnRHJvcEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wTGlzdGVuZXJzID0ge1xuICAgICAgICBlbnRlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRW50ZXIpID0+IHVua25vd24+LFxuICAgICAgICBvdmVyOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdPdmVyKSA9PiB1bmtub3duPixcbiAgICAgICAgZHJvcDogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRHJvcCkgPT4gdW5rbm93bj4sXG4gICAgICAgIGxlYXZlOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdMZWF2ZSkgPT4gdW5rbm93bj4sXG4gICAgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dlZEhvc3RzOiBUYWJsZTxBbGxvd2VkSG9zdD47XG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWVjaFJlY29nbml0aW9uOiBSZWdpc3RyeTxUcmFuc2NyaXB0U3RhdHVzPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdIYW5kbGVzOiBJZGVudGlmaWVyTWFwPHsgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlOyBlbWl0OiBXZWJ2aWV3RXZlbnRFbWl0IH0+ID0gbmV3IElkZW50aWZpZXJNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9QUk9NUFRfUkVRVUVTVCwgKHJlcXVlc3QpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21wdFJlcXVlc3QocmVxdWVzdCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCwgKGFwcCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3BlbkFwcChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmVudGVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Zlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5vdmVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZHJvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5kcm9wLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMubGVhdmUuZm9yRWFjaCgoZm4pID0+IGZuKHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud2Vidmlld0hhbmRsZXMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgICAgICAgICAgaGFuZGxlLmVtaXQocGFja2V0LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhvc3RzID0gb211LnRhYmxlcy5nZXQoREFTSEJPQVJEX0FMTE9XRURfV0VCVklFV19IT1NUUyk7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb24gPSBvbXUucmVnaXN0cmllcy5nZXQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdEZvckRhc2hib2FyZChyZXF1ZXN0OiBQcm9tcHRSZXF1ZXN0KTogUHJvbWlzZTxQcm9tcHRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkID0gdGhpcy5nZXREYXNoYm9hcmQoKTtcbiAgICAgICAgc3dpdGNoIChyZXF1ZXN0LmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC9wZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQZXJtaXNzaW9uUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC9wbHVnaW5zJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZVBsdWdpblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbnN0YWxsQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVVcGRhdGVBcHAocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdpbmRleC9pbnN0YWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZUluZGV4SW5zdGFsbChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2h0dHAvcG9ydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVIdHRwUG9ydFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9tcHQgcmVxdWVzdGVkOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3Q6IFByb21wdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0Rm9yRGFzaGJvYXJkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UsIHtcbiAgICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLFxuICAgICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPcGVuQXBwKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVPcGVuQXBwKGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULCB7XG4gICAgICAgICAgICBvazogYWNjZXB0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0LnJlcXVlc3RfaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0OiBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkKCk6IERhc2hib2FyZEhhbmRsZXIge1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9DT09LSUVTX0dFVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPENvb2tpZVtdPj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHBhcmFtcy5jYWxsZXIua2V5KCk7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSG9zdDogQWxsb3dlZEhvc3QgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaWQpID8/IHsgaWQsIGhvc3RzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGFsbG93ZWRIb3N0Lmhvc3RzLmluY2x1ZGVzKGhvc3RuYW1lKTtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmdldENvb2tpZXMocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuYmluZChEQVNIQk9BUkRfSE9TVF9SRVFVRVNULCBhc3luYyAocmVxdWVzdCwgcGFyYW1zKTogUHJvbWlzZTxVc2VyUmVzcG9uc2U+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdCB9ID0gcmVxdWVzdDtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcGFyYW1zLmNhbGxlci5rZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IGhvc3RFbnRyeTogQWxsb3dlZEhvc3QgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaWQpID8/IHsgaWQsIGhvc3RzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGhvc3RFbnRyeS5ob3N0cy5pbmNsdWRlcyhob3N0KTtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGFzaGJvYXJkLmhvc3RSZXF1ZXN0ZWQocmVxdWVzdCwgcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSA9PT0gJ29rJykge1xuICAgICAgICAgICAgICAgIGhvc3RFbnRyeS5ob3N0cy5wdXNoKGhvc3QpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLnVwZGF0ZShob3N0RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdCA9IGFzeW5jIChldmVudDogV2Vidmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyYW1zLmNhbGxlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuY3JlYXRlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMsIGVtaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuZ2V0V2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZGFzaGJvYXJkLmNsb3NlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5zcGVlY2hSZWNvZ25pdGlvblN0YXJ0KHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCxcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0IGRhc2hib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEhvc3Qob3B0aW9uczogeyBob3N0OiBzdHJpbmcgfSk6IFByb21pc2U8VXNlclJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9IT1NUX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0V2VidmlldyhvcHRpb25zOiBXZWJ2aWV3UmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxXZWJ2aWV3SGFuZGxlPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdvaycpIHJldHVybiBuZXcgVXNlclJlc3VsdChyZXN1bHQpO1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgY29uc3QgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsXG4gICAgICAgICAgICAgICAgICAgIHsgaWQgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvb2tpZXM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVzID0gKGF3YWl0IHRoaXMuZ2V0Q29va2llcyh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgfSkpLnVud3JhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1trZXldITtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgam9pbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5vbignY2xvc2VkJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vidmlld0hhbmRsZXMuc2V0KGlkLCB7XG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICBlbWl0OiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9Pik6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoe1xuICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgIHZhbHVlOiBoYW5kbGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb29raWVzKG9wdGlvbnM6IEdldENvb2tpZXNSZXF1ZXN0KTogUHJvbWlzZTxVc2VyUmVzdWx0PENvb2tpZVtdPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfQ09PS0lFU19HRVQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5ULCBhcHApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbnN0YWxsQXBwKGFwcDogQXBwKTogUHJvbWlzZTxBcHBJbnN0YWxsUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXJCbG9ja2VkUHJvbXB0cygpOiBQcm9taXNlPG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVpcmVEcmFnRHJvcCgpOiBQcm9taXNlPERyYWdEcm9wSGFuZGxlcj4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfRU5EUE9JTlQsIHt9KTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5kcmFnRHJvcExpc3RlbmVycztcbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5vbXU7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyID0ge1xuICAgICAgICAgICAgb25FbnRlcihmbikgeyBsaXN0ZW5lcnMuZW50ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbk92ZXIoZm4pIHsgbGlzdGVuZXJzLm92ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkRyb3AoZm4pIHsgbGlzdGVuZXJzLmRyb3AucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkxlYXZlKGZuKSB7IGxpc3RlbmVycy5sZWF2ZS5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIGFzeW5jIHJlYWQoaWQpIHsgcmV0dXJuIGF3YWl0IGNsaWVudC5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfRU5EUE9JTlQsIHsgZHJhZ19pZDogaWQgfSk7IH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wSGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbm90aWZ5RHJvcERyYWdTdGF0ZShwYWNrZXQ6IEZpbGVEcmFnUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNwZWVjaFJlY29nbml0aW9uU3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fU1RBUlQsIHsgdHlwZTogJ3N0YXJ0JyB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZS9zZXJpYWxpemVyLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldC5qcyc7XG5cbmNvbnN0IElERU5USUZJRVIgPSBuZXcgSWRlbnRpZmllcignY29yZScsICdwYWNrZXQnKTtcblxudHlwZSBQcm90b2NvbEluZm8gPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudHlwZSBSU0FOdW1iZXJzID0ge1xuICAgIGU6IHN0cmluZztcbiAgICBuOiBzdHJpbmc7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXF1ZXN0ID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVzcG9uc2UgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG4gICAgYWVzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJNZXRhID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlcXVlc3QgfCBudWxsO1xuICAgIGhhc2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbnR5cGUgQ29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBhcHA6IEFwcEpzb247XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIENvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHA6IEFwcDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdG9rZW46IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuYXBwID0gb3B0aW9ucy5hcHA7XG4gICAgICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuICAgICAgICB0aGlzLmVuY3J5cHRpb24gPSBvcHRpb25zLmVuY3J5cHRpb24gPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXRKc29uKTogQ29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLmRlc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0KTogQ29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBEaXNjb25uZWN0VHlwZSB7XG4gICAgSU5WQUxJRF9UT0tFTiA9ICdpbnZhbGlkX3Rva2VuJyxcbiAgICBJTlZBTElEX09SSUdJTiA9ICdpbnZhbGlkX29yaWdpbicsXG4gICAgSU5WQUxJRF9WRVJTSU9OID0gJ2ludmFsaWRfdmVyc2lvbicsXG4gICAgSU5WQUxJRF9QQUNLRVRfVFlQRSA9ICdpbnZhbGlkX3BhY2tldF90eXBlJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9EQVRBID0gJ2ludmFsaWRfcGFja2V0X2RhdGEnLFxuICAgIElOVkFMSURfUEFDS0VUID0gJ2ludmFsaWRfcGFja2V0JyxcbiAgICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgQU5PVEhFUl9DT05ORUNUSU9OID0gJ2Fub3RoZXJfY29ubmVjdGlvbicsXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbl9kZW5pZWQnLFxuICAgIEFQUF9SRU1PVkVEID0gJ2FwcF9yZW1vdmVkJyxcbiAgICBTRVJWRVJfUkVTVEFSVCA9ICdzZXJ2ZXJfcmVzdGFydCcsXG4gICAgU0hVVERPV04gPSAnc2h1dGRvd24nLFxuICAgIENMT1NFID0gJ2Nsb3NlJyxcbn1cblxudHlwZSBEaXNjb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RQYWNrZXQge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2UgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0KTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4gZGF0YS50b0pzb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBEaXNjb25uZWN0UGFja2V0LmZyb21Kc29uKGRhdGEpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSnNvbihkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IERpc2Nvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b0pzb24oKTogRGlzY29ubmVjdFBhY2tldEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBBQ0tFVF9UWVBFUzoge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlPFNlcnZlck1ldGE+O1xuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGU8Q29ubmVjdFBhY2tldD47XG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZTxEaXNjb25uZWN0UGFja2V0PjtcbiAgICBUT0tFTjogUGFja2V0VHlwZTxzdHJpbmc+O1xuICAgIFJFQURZOiBQYWNrZXRUeXBlPHVuZGVmaW5lZD47XG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZTxVaW50OEFycmF5Pjtcbn0gPSB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxTZXJ2ZXJNZXRhPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdzZXJ2ZXJfbWV0YScsXG4gICAgfSksXG4gICAgQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPENvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBDb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEaXNjb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdkaXNjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogRGlzY29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBUT0tFTjogUGFja2V0VHlwZS5jcmVhdGVKc29uPHN0cmluZz4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAndG9rZW4nLFxuICAgIH0pLFxuICAgIFJFQURZOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248dW5kZWZpbmVkPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdyZWFkeScsXG4gICAgfSksXG4gICAgRU5DUllQVEVEX1BBQ0tFVDogUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFVpbnQ4QXJyYXk+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2UnLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3AoKSxcbiAgICB9KSxcbn07XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZWdpc3RlclBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmRwb2ludHM6IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChpdGVtLmVuZHBvaW50cy5zaXplKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlbS5lbmRwb2ludHMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHZhbHVlPy5rZXkoKSA/PyAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGVuZHBvaW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KGVuZHBvaW50cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlZFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNhbGxlcjogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBJbnZva2VkUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAgY2FsbGVyOiBpdGVtLmNhbGxlci5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlZFBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBjYWxsZXI6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VkUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuY2FsbGVyKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEludm9rZWRQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VkUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludEludm9rZWRQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEludm9rZWRQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlZFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IEludm9rZWRQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW52b2tlZFBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEludm9rZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBkYXRhLmtleSxcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRJbnZva2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50SW52b2tlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhJbnZva2VQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSW52b2tlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEludm9rZVBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVycm9yOiBzdHJpbmcgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBSZXNwb25zZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgICAgICBlcnJvcjogaXRlbS5lcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBSZXNwb25zZVBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IG51bWJlcjtcbiAgICAgICAgICAgIGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICAgICAgZGF0YS5lcnJvcixcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IFJlc3BvbnNlUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhSZXNwb25zZVBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlc3BvbnNlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFbmRwb2ludEludm9rZWRQYWNrZXQsIEVuZHBvaW50SW52b2tlUGFja2V0LCBFbmRwb2ludFJlZ2lzdGVyUGFja2V0LCBFbmRwb2ludFJlc3BvbnNlUGFja2V0LCBJbnZva2VkUGFyYW1zLCBJbnZva2VQYXJhbXMsIFJlc3BvbnNlUGFyYW1zIH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEVuZHBvaW50RXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdlbmRwb2ludCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgRW5kcG9pbnRFeHRlbnNpb24ob211KSxcbik7XG5cbnR5cGUgQ2FsbFByb21pc2UgPSB7XG4gICAgcmVzb2x2ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxudHlwZSBFbmRwb2ludEhhbmRsZXIgPSB7XG4gICAgdHlwZTogRW5kcG9pbnRUeXBlO1xuICAgIGhhbmRsZXI6IChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkgPT4gUHJvbWlzZTxVaW50OEFycmF5Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RW5kcG9pbnRFeHRlbnNpb24+ID0gRU5EUE9JTlRfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBib3VuZEVuZHBvaW50cyA9IG5ldyBJZGVudGlmaWVyTWFwPEVuZHBvaW50SGFuZGxlcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlUHJvbWlzZXM6IE1hcDxudW1iZXIsIENhbGxQcm9taXNlPiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGNhbGxJZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmNhbGxJZCA9IE1hdGguZmxvb3IoKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxMDAwKTtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBFTkRQT0lOVF9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9JTlZPS0VfUEFDS0VULFxuICAgICAgICAgICAgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSW52b2tlZChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZ2V0KHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFJlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIGtleSAke3BhY2tldC5wYXJhbXMua2V5fSAoJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSlgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZGVsZXRlKHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmIChwYWNrZXQucGFyYW1zLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHBhY2tldC5wYXJhbXMuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9taXNlLnJlc29sdmUocGFja2V0LmJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlSW52b2tlZChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkge1xuICAgICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYm91bmRFbmRwb2ludHMuZ2V0KHBhY2tldC5wYXJhbXMuaWQpO1xuICAgICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY2VpdmVkIGludm9jYXRpb24gZm9yIHVua25vd24gZW5kcG9pbnQgJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSAoJHtwYWNrZXQucGFyYW1zLmtleX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVuZHBvaW50LmhhbmRsZXIocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULCBuZXcgRW5kcG9pbnRSZXNwb25zZVBhY2tldChcbiAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VQYXJhbXMocGFja2V0LnBhcmFtcy5pZCwgcGFja2V0LnBhcmFtcy5rZXksIG51bGwpLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KFxuICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVBhcmFtcyhwYWNrZXQucGFyYW1zLmlkLCBwYWNrZXQucGFyYW1zLmtleSwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKSxcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSgpLFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbmRwb2ludF0gb2YgdGhpcy5ib3VuZEVuZHBvaW50cykge1xuICAgICAgICAgICAgZW5kcG9pbnRzLnNldChrZXksIGVuZHBvaW50LnR5cGUucGVybWlzc2lvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgRW5kcG9pbnRSZWdpc3RlclBhY2tldChlbmRwb2ludHMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYmluZDxSZXEsIFJlcz4oXG4gICAgICAgIHR5cGU6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4sXG4gICAgICAgIGhhbmRsZXI6IChkYXRhOiBSZXEsIHBhcmFtczogSW52b2tlZFBhcmFtcykgPT4gUHJvbWlzZTxSZXM+LFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgZW5kcG9pbnRzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3VuZEVuZHBvaW50cy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW5kcG9pbnQgd2l0aCBpZCAke3R5cGUuaWQua2V5KCl9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmRFbmRwb2ludHMuc2V0KHR5cGUuaWQsIHsgdHlwZSwgaGFuZGxlcjogYXN5bmMgKHsgYnVmZmVyLCBwYXJhbXMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxID0gdHlwZS5yZXF1ZXN0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihyZXEsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5yZXNwb25zZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJlc3VsdCk7XG4gICAgICAgIH0gfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGw8UmVxLCBSZXM+KGVuZHBvaW50OiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+LCBkYXRhOiBSZXEpOiBQcm9taXNlPFJlcz4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNhbGxJZCsrO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VWludDhBcnJheT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVByb21pc2VzLnNldChrZXksIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9JTlZPS0VfUEFDS0VULCBuZXcgRW5kcG9pbnRJbnZva2VQYWNrZXQoXG4gICAgICAgICAgICBuZXcgSW52b2tlUGFyYW1zKGVuZHBvaW50LmlkLCBrZXkpLFxuICAgICAgICAgICAgZW5kcG9pbnQucmVxdWVzdFNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICApKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICByZXR1cm4gZW5kcG9pbnQucmVzcG9uc2VTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlKTtcbiAgICB9XG59XG5cbmNvbnN0IEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlZ2lzdGVyUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludEludm9rZVBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW52b2tlJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZVBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRJbnZva2VkUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnZva2VkJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZWRQYWNrZXQsXG59KTtcbmNvbnN0IEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlc3BvbnNlUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZScsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZXNwb25zZVBhY2tldCxcbn0pO1xuIiwKICAgICJpbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBKc29uVHlwZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGUgPSB7XG4gICAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0ID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBoZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgcmVkaXJlY3Q6IFJlcXVlc3RSZWRpcmVjdDtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhQ2h1bms8VCBleHRlbmRzIEpzb25UeXBlPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBEYXRhQ2h1bms8VD4pOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlSlNPTihkYXRhLm1ldGEpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZTxUIGV4dGVuZHMgSnNvblR5cGU+KGRhdGE6IFVpbnQ4QXJyYXkpOiBEYXRhQ2h1bms8VD4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBtZXRhID0gcmVhZGVyLnJlYWRKU09OPFQ+KCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2h1bmsobWV0YSwgYm9keSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IERhdGFDaHVuaywgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5cbmV4cG9ydCB0eXBlIFdTRGF0YSA9IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXc7XG5cbmV4cG9ydCBjb25zdCBXU01zZ1R5cGUgPSB7XG4gICAgQ09OVElOVUFUSU9OOiAweDAsXG4gICAgVEVYVDogMHgxLFxuICAgIEJJTkFSWTogMHgyLFxuICAgIFBJTkc6IDB4OSxcbiAgICBQT05HOiAweEEsXG4gICAgQ0xPU0U6IDB4OCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBXU0Nsb3NlQ29kZSA9IHtcbiAgICBPSzogMTAwMCxcbiAgICBHT0lOR19BV0FZOiAxMDAxLFxuICAgIFBST1RPQ09MX0VSUk9SOiAxMDAyLFxuICAgIFVOU1VQUE9SVEVEX0RBVEE6IDEwMDMsXG4gICAgQUJOT1JNQUxfQ0xPU1VSRTogMTAwNixcbiAgICBJTlZBTElEX1RFWFQ6IDEwMDcsXG4gICAgUE9MSUNZX1ZJT0xBVElPTjogMTAwOCxcbiAgICBNRVNTQUdFX1RPT19CSUc6IDEwMDksXG4gICAgTUFOREFUT1JZX0VYVEVOU0lPTjogMTAxMCxcbiAgICBJTlRFUk5BTF9FUlJPUjogMTAxMSxcbiAgICBTRVJWSUNFX1JFU1RBUlQ6IDEwMTIsXG4gICAgVFJZX0FHQUlOX0xBVEVSOiAxMDEzLFxuICAgIEJBRF9HQVRFV0FZOiAxMDE0LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldENsb3NlID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBXU0RhdGFNZXRhID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTpcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlRFWFRcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLkJJTkFSWVxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUElOR1xuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUE9ORztcbn07XG5cbmV4cG9ydCB0eXBlIFdTSGFuZGxlU3RhdGUgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnIHwgJ3JlY2VpdmluZyc7XG4gICAgaGFuZGxlOiBXZWJTb2NrZXRIYW5kbGU7XG59O1xuXG50eXBlIFdTT3B0aW9ucyA9IHtcbiAgICBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZDtcbiAgICBkaXNwb3NlKG9wdGlvbnM6IHtcbiAgICAgICAgY29kZT86IG51bWJlcjtcbiAgICAgICAgcmVhc29uPzogc3RyaW5nO1xuICAgIH0pOiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZFF1ZXVlOiAoZGF0YTogV1NEYXRhKSA9PiB2b2lkLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyB0b1dlYlNvY2tldCgpOiBPbXVXZWJTb2NrZXQge1xuICAgICAgICByZXR1cm4gbmV3IE9tdVdlYlNvY2tldCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBXU09wdGlvbnMpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvcHRpb25zLmFkZFF1ZXVlLCBvcHRpb25zLmRpc3Bvc2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICBvcGVuOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVuJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubWV0YS50eXBlID09PSBXU01zZ1R5cGUuQklOQVJZKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaW5hcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YS5ib2R5LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YS5ib2R5KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZChkYXRhOiBXU0RhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRRdWV1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSh7IGNvZGUsIHJlYXNvbiB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZSgpOiBQcm9taXNlPFdTTXNnPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVSZXNvbHZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nIGZyb20gYW5vdGhlciBhc3luYyBjYWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdHVzICE9PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdvcGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmluZyBvbiBhbHJlYWR5IGNsb3NlZCBzb2NrZXQnKTtcbiAgICB9XG5cbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcbn1cblxuZXhwb3J0IGNsYXNzIE9tdVdlYlNvY2tldCBpbXBsZW1lbnRzIFdlYlNvY2tldCB7XG4gICAgcHVibGljIENPTk5FQ1RJTkcgPSAwIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBPUEVOID0gMSBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0lORyA9IDIgYXMgY29uc3Q7XG4gICAgcHVibGljIENMT1NFRCA9IDMgYXMgY29uc3Q7XG5cbiAgICBiaW5hcnlUeXBlOiBCaW5hcnlUeXBlID0gJ2Jsb2InO1xuICAgIGJ1ZmZlcmVkQW1vdW50OiBudW1iZXIgPSAwO1xuICAgIGV4dGVuc2lvbnM6IHN0cmluZyA9ICcnO1xuICAgIG9uY2xvc2U6ICgodGhpczogV2ViU29ja2V0LCBldjogQ2xvc2VFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBvbmVycm9yOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IHVua25vd24pIHwgbnVsbCA9IG51bGw7XG4gICAgb25vcGVuOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICByZWFkeVN0YXRlOiAwIHwgMiB8IDEgfCAzID0gMDtcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB3czogT211V1MsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRMaXN0ZW5lcnM6IEV2ZW50TGlzdGVuZXJNYXA8V2ViU29ja2V0RXZlbnRNYXA+ID0ge1xuICAgICAgICAgICAgY2xvc2U6IFtdLFxuICAgICAgICAgICAgZXJyb3I6IFtdLFxuICAgICAgICAgICAgbWVzc2FnZTogW10sXG4gICAgICAgICAgICBvcGVuOiBbXSxcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWNlaXZlTG9vcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVjZWl2ZUxvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgdHlwZSB9ID0gYXdhaXQgdGhpcy53cy5yZWNlaXZlKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ2xvc2VFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBkYXRhLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IGRhdGEucHJvdG9jb2wgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ29wZW4nLCB7fSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXJyb3JFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5yZWFzb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnQudHlwZV07XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgdGhpcy5vbm9wZW4/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0aGlzLm9uZXJyb3I/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2xvc2U/LihldmVudCBhcyBDbG9zZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZW5kKGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5zZW5kKGRhdGEpO1xuICAgIH1cblxuICAgIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLndzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KHR5cGU6IEssIGxpc3RlbmVyOiAodGhpczogV2ViU29ja2V0LCBldjogV2ViU29ja2V0RXZlbnRNYXBbS10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgIlxuaW1wb3J0IHsgdGV4dEVuY29kZXIgfSBmcm9tICcuLi8uLi9jb25zdCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBEYXRhQ2h1bmssIEh0dHBSZXF1ZXN0LCBPbXVSZXNwb25zZSwgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5pbXBvcnQgeyBPbXVXUywgV2ViU29ja2V0Q2xvc2UsIFdlYlNvY2tldEVycm9yLCBXZWJTb2NrZXRPcGVuLCBXU0RhdGEsIFdTRGF0YU1ldGEsIFdTSGFuZGxlU3RhdGUsIFdTTXNnVHlwZSB9IGZyb20gJy4vd2Vic29ja2V0JztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbmNvbnN0IFJFUVVFU1RfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3RfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVFVRVNUX1NFTkQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFJlcXVlc3RIYW5kbGU+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3Rfc2VuZCcsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbnR5cGUgSHR0cFJlcXVlc3RDbG9zZSA9IFJlcXVlc3RIYW5kbGU7XG5cbmNvbnN0IFJFUVVFU1RfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlcXVlc3RDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2Nsb3NlJyxcbn0pO1xuXG50eXBlIEh0dHBSZXNwb25zZSA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBoaXN0b3J5OiBIdHRwUmVzcG9uc2VbXTtcbiAgICByZWRpcmVjdGVkOiBib29sZWFuO1xufTtcblxuY29uc3QgUkVTUE9OU0VfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXNwb25zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NIVU5LID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jaHVuaycsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlcXVlc3RIYW5kbGU+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2xvc2UnLFxufSk7XG5cbnR5cGUgSGFuZGxlU3RhdGVSZWNlaXZpbmcgPSB7XG4gICAgdHlwZTogJ3JlY2VpdmluZyc7XG4gICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5KTogdm9pZDtcbiAgICBjbG9zZSgpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZUNyZWF0ZWQgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnO1xuICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZSA9IEhhbmRsZVN0YXRlQ3JlYXRlZCB8IEhhbmRsZVN0YXRlUmVjZWl2aW5nO1xuXG5jb25zdCBXRUJTT0NLRVRfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2NyZWF0ZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX09QRU4gPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0T3Blbj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19vcGVuJyxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfREFUQSA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8V1NEYXRhTWV0YT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfZGF0YScsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jbG9zZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0VSUk9SID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldEVycm9yPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2Vycm9yJyxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGdXR1cmU8VD4oKToge1xuICAgIHByb21pc2U6IFByb21pc2U8VD47XG4gICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQ7XG59IHtcbiAgICBsZXQgcmVzb2x2ZTogKCh2YWx1ZTogVCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlamVjdDogKChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICBpZiAoIXJlc29sdmUgfHwgIXJlamVjdCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGZ1dHVyZScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2UsXG4gICAgICAgIHJlc29sdmUsXG4gICAgICAgIHJlamVjdCxcbiAgICB9O1xufVxuXG50eXBlIFdTU2VuZFRhc2sgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRhOiBXU0RhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgSHR0cEV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RXh0ZW5zaW9uPiA9IEhUVFBfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZXF1ZXN0Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHBIYW5kbGVzOiBSZWNvcmQ8c3RyaW5nLCBIYW5kbGVTdGF0ZSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzSGFuZGxlczogUmVjb3JkPHN0cmluZywgV1NIYW5kbGVTdGF0ZT4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzU2VuZFF1ZXVlOiBXU1NlbmRUYXNrW10gPSBbXTtcbiAgICBwcml2YXRlIHdzU2VuZFdhaXRSZXNvbHZlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICApIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVRVNUX0NSRUFURSxcbiAgICAgICAgICAgIFJFUVVFU1RfU0VORCxcbiAgICAgICAgICAgIFJFUVVFU1RfQ0xPU0UsXG4gICAgICAgICAgICBSRVNQT05TRV9DUkVBVEUsXG4gICAgICAgICAgICBSRVNQT05TRV9DSFVOSyxcbiAgICAgICAgICAgIFJFU1BPTlNFX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NSRUFURSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9EQVRBLFxuICAgICAgICAgICAgV0VCU09DS0VUX09QRU4sXG4gICAgICAgICAgICBXRUJTT0NLRVRfRVJST1IsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ1JFQVRFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnNldFJlc3BvbnNlKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NIVU5LLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnJlY2VpdmUocGFja2V0LmJvZHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX09QRU4sIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIGFscmVhZHkgaGFuZGxlZCBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUub3BlbihwYWNrZXQpO1xuICAgICAgICAgICAgaGFuZGxlLnR5cGUgPSAncmVjZWl2aW5nJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0RBVEEsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAncmVjZWl2aW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgY2h1bmsgZm9yIG5vbi1yZWNlaXZpbmcgc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZGlzcGF0Y2gocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0NMT1NFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5jbG9zZShwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0VSUk9SLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5lcnJvcihwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53c1NlbmRMb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3NTZW5kTG9vcCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbmQgPSB0aGlzLndzU2VuZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoc2VuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gYXdhaXQgdG9VaW50OEFycmF5KHNlbmQuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBzZW5kLmRhdGEgPT09ICdzdHJpbmcnID8gV1NNc2dUeXBlLlRFWFQgOiBXU01zZ1R5cGUuQklOQVJZO1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0RBVEEsIG5ldyBEYXRhQ2h1bmsoeyBpZDogc2VuZC5pZCwgdHlwZSB9LCBhcnJheSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3Q6IFJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IGtleXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3Qgc2V0ID0gKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb3dlcktleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBrZXlzW2xvd2VyS2V5XTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW29yaWdpbmFsS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAga2V5c1tsb3dlcktleV0gPSBrZXk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5pdD8uaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpbml0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbml0LmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSWQoKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5hcHAuaWQuam9pbihgJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufS0ke3RoaXMucmVxdWVzdENvdW50Kyt9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTx7IHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U7IHN0cmVhbTogUmVhZGFibGVTdHJlYW0gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVJZCgpLmtleSgpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFUVVFU1RfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy5nZW5lcmF0ZUhlYWRlcnMocmVxdWVzdCwgaW5pdCksXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gcmVxdWVzdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX1NFTkQsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YTogeyBpZCB9LFxuICAgICAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NMT1NFLCB7IGlkIH0pO1xuICAgICAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCByZXNwb25zZUZ1dHVyZSA9IGNyZWF0ZUZ1dHVyZTxIdHRwUmVzcG9uc2U+KCk7XG4gICAgICAgIGxldCBjaHVua0V2ZW50ID0gY3JlYXRlRnV0dXJlPGJvb2xlYW4+KCk7XG4gICAgICAgIGNvbnN0IHNldFJlc3BvbnNlID0gKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5odHRwSGFuZGxlc1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JlY2VpdmluZycsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT4pIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZWQnLFxuICAgICAgICAgICAgc2V0UmVzcG9uc2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2VGdXR1cmUucHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgc3RyZWFtOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgICAgICAgICAgIGFzeW5jIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IGNodW5rRXZlbnQucHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmspIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaChpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPE9tdVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0cmVhbSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBPbXVSZXNwb25zZShcbiAgICAgICAgICAgIG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlciksXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlZGlyZWN0ZWQsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgJ2Jhc2ljJyxcbiAgICAgICAgICAgIHJlc3BvbnNlLnVybCxcbiAgICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cyhpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBvcHRpb25zPzoge1xuICAgICAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgICAgIGF1dG9jbG9zZT86IGJvb2xlYW47XG4gICAgICAgIGF1dG9waW5nPzogYm9vbGVhbjtcbiAgICAgICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfSk6IFByb21pc2U8T211V1M+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gT211V1MuY3JlYXRlKHtcbiAgICAgICAgICAgIGFkZFF1ZXVlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9DTE9TRSwge1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IG9wdGlvbnMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy53c0hhbmRsZXNbaWQua2V5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMud3NIYW5kbGVzW2lkLmtleSgpXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIG9wdGlvbnMpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGUud3M7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldyk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+PiB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGV4dEVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBkYXRhLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEgYXMgQXJyYXlCdWZmZXJMaWtlKTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCB0eXBlIFVubGlzdGVuID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxQIGV4dGVuZHMgQXJyYXk8YW55Pj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTwoLi4uYXJnczogUCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+ID0gW107XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyOiAoLi4uYXJnczogUCkgPT4gYW55KTogVW5saXN0ZW4ge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZSh0aGlzLmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQoLi4uYXJnczogUCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi50aGlzLmxpc3RlbmVyc10pIHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJcbnR5cGUgVGFzayA9ICgpID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBjbGFzcyBMb2NrIHtcbiAgICBwcml2YXRlIHRhc2tzOiAoVGFzaylbXSA9IFtdO1xuICAgIHByaXZhdGUgd2FpdGVyOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHdhaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLndhaXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FpdGVyID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJ1blRhc2tzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnRhc2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRoaXMudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLndhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJ1blRhc2tzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVzZTxUPihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGF3YWl0IHByb21pc2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0KCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBSZWdpc3RyeVBlcm1pc3Npb25zLCBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB9IGZyb20gJy4vcmVnaXN0cnknO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZTogVWludDhBcnJheSB8IG51bGwsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogUmVnaXN0cnlQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZUJvb2xlYW4ocGFja2V0LnZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgaWYgKHBhY2tldC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogUmVnaXN0cnlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWFkZXIucmVhZEJvb2xlYW4oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleGlzdGluZyA/IHJlYWRlci5yZWFkVWludDhBcnJheSgpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVBhY2tldChpZCwgdmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdGVyUGFja2V0KTogUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IHBhY2tldDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYWNrZXQuaWQua2V5KCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFJlZ2lzdGVyUGFja2V0SlNPTik6IFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oZGF0YS5pZCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWFkOiBwZXJtcy5yZWFkID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLnJlYWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHdyaXRlOiBwZXJtcy53cml0ZSA/IElkZW50aWZpZXIuZnJvbShwZXJtcy53cml0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IExvY2sgfSBmcm9tICcuLi8uLi9sb2NrLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgeyBSZWdpc3RlclBhY2tldCwgUmVnaXN0cnlQYWNrZXQgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlLCBXcml0YWJsZSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmllcyA9IG5ldyBJZGVudGlmaWVyTWFwPFJlZ2lzdHJ5PHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9MSVNURU5fUEFDS0VULFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVnaXN0cnk8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKHJlZ2lzdHJ5VHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBpZGVudGlmaWVyICcke3JlZ2lzdHJ5VHlwZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeUltcGwodGhpcy5vbXUsIHJlZ2lzdHJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlZ2lzdHJ5VHlwZS5pZDtcbiAgICAgICAgbGV0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyaWVzLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5ID0gdGhpcy5jcmVhdGVSZWdpc3RyeShyZWdpc3RyeVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyaWVzLnNldChpZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIFJlZ2lzdHJ5PFQ+O1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcj86IFNlcmlhbGl6ZXI8VCwgRD4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcjogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVnaXN0cnlJbXBsPFQ+IGltcGxlbWVudHMgUmVnaXN0cnk8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8W1RdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRUdJU1RSWV9VUERBVEVfUEFDS0VULCAocGFja2V0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGUocGFja2V0KSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBhc3luYyAjZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChSRUdJU1RSWV9HRVRfRU5EUE9JTlQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQudmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jICNzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNnZXQoKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI3NldCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaGFuZGxlcjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZyAmJiB0aGlzLm9tdS5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLmxpc3RlbihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZShkYXRhOiBSZWdpc3RyeVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHlwZS5pZC5pc1N1YnBhdGhPZih0aGlzLm9tdS5hcHAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGF0U3ZlbHRlKCk6IFdyaXRhYmxlPFQ+IHtcbiAgICAgICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgICAgIGxldCB2YWx1ZTogVCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KHZhbHVlOiBUKSA9PiB2b2lkPigpO1xuICAgICAgICB0aGlzLmxpc3RlbigobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgocnVuKSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldDogKHZhbHVlOiBUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmliZTogKHJ1bikgPT4ge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocnVuKTtcbiAgICAgICAgICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUocnVuKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogKGZuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhaXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUkVHSVNUUllfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UmVnaXN0cnlFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3JlZ2lzdHJ5JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBSZWdpc3RyeUV4dGVuc2lvbihvbXUpLFxuKTtcbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUkVHSVNUUllfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuY29uc3QgUkVHSVNUUllfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlZ2lzdGVyUGFja2V0PihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFJFR0lTVFJZX1VQREFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8UmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgIH0sXG4pO1xuY29uc3QgUkVHSVNUUllfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFJFR0lTVFJZX0dFVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPElkZW50aWZpZXIsIFJlZ2lzdHJ5UGFja2V0PihcbiAgICBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdnZXQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0pzb24oKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBSZWdpc3RyeVBhY2tldCxcbiAgICAgICAgcGVybWlzc2lvbklkOiBSRUdJU1RSWV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsZSB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeVR5cGUsIHR5cGUgUmVnaXN0cnkgfSBmcm9tICcuLi9yZWdpc3RyeSc7XG5cbmV4cG9ydCBjb25zdCBJMThOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoJ2kxOG4nLCAoY2xpZW50KSA9PiBuZXcgSTE4bkV4dGVuc2lvbihjbGllbnQpKTtcblxuZXhwb3J0IGNvbnN0IEkxOE5fU0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdzZXQnKTtcbmV4cG9ydCBjb25zdCBJMThOX0dFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBJMThOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvY2FsZXMnLCAnZ2V0Jyk7XG5jb25zdCBJMThOX0xPQ0FMRVNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPExvY2FsZVtdPihJMThOX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xvY2FsZXMnLFxuICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBbXSA6IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzIGFzIExvY2FsZVtdLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBJMThuRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxJMThuRXh0ZW5zaW9uPiA9IEkxOE5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXNSZWdpc3RyeTogUmVnaXN0cnk8TG9jYWxlW10+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmxvY2FsZXNSZWdpc3RyeSA9IG9tdS5yZWdpc3RyaWVzLmdldChJMThOX0xPQ0FMRVNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZShsb2NhbGl6ZWRUZXh0OiBMb2NhbGl6ZWRUZXh0KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlc1JlZ2lzdHJ5LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuc2VsZWN0QmVzdFRyYW5zbGF0aW9uKGxvY2FsZXMsIGxvY2FsaXplZFRleHQpO1xuICAgICAgICBpZiAoIXRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhsb2NhbGl6ZWRUZXh0KVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEJlc3RUcmFuc2xhdGlvbihcbiAgICAgICAgbG9jYWxlczogcmVhZG9ubHkgTG9jYWxlW10sXG4gICAgICAgIGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQsXG4gICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGl6ZWRUZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRMb2NhbGVzID0gbG9jYWxlcy5yZWR1Y2UoKGFjYywgbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBsLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gocGFydHMuc2xpY2UoMCwgaSkuam9pbignLScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIHRyYW5zZm9ybWVkTG9jYWxlcykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbbF07XG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9jYWxlKGxvY2FsZTogTG9jYWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlc1JlZ2lzdHJ5LnNldChsb2NhbGUpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBlbnVtIExvZ1R5cGUge1xuICAgIEVSUk9SID0gJ2Vycm9yJyxcbiAgICBXQVJOSU5HID0gJ3dhcm5pbmcnLFxuICAgIElORk8gPSAnaW5mbycsXG4gICAgREVCVUcgPSAnZGVidWcnLFxufVxuXG5leHBvcnQgdHlwZSBMb2dNZXNzYWdlID0ge1xuICAgIHR5cGU6IExvZ1R5cGU7XG4gICAgdGV4dDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIExvZ1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IExvZ01lc3NhZ2UsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogTG9nUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhpdGVtLmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0ubWVzc2FnZS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0ubWVzc2FnZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBMb2dQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBpZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByZWFkZXIucmVhZFN0cmluZygpIGFzIExvZ1R5cGU7XG4gICAgICAgIGNvbnN0IHRleHQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB0eXBlLCB0ZXh0IH07XG4gICAgICAgIHJldHVybiBuZXcgTG9nUGFja2V0KElkZW50aWZpZXIuZnJvbUtleShpZCksIG1lc3NhZ2UpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7IExvZ01lc3NhZ2UgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuaW1wb3J0IHsgTG9nUGFja2V0LCBMb2dUeXBlIH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxMb2dnZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2xvZ2dlcicsXG4gICAgKGNsaWVudCkgPT4gbmV3IExvZ2dlckV4dGVuc2lvbihjbGllbnQpLFxuKTtcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9MT0dfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IExPR0dFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2cnKTtcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9MT0dfUEFDS0VUOiBQYWNrZXRUeXBlPExvZ1BhY2tldD4gPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8TG9nUGFja2V0PihMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9nJyxcbiAgICBzZXJpYWxpemVyOiBMb2dQYWNrZXQsXG59KTtcbmV4cG9ydCBjb25zdCBMT0dHRVJfTElTVEVOX1BBQ0tFVDogUGFja2V0VHlwZTxJZGVudGlmaWVyPiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5cbnR5cGUgTG9nTGlzdGVuZXIgPSAobWVzc2FnZTogTG9nTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCBjbGFzcyBMb2dnZXJFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBMT0dHRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IElkZW50aWZpZXJNYXA8TG9nTGlzdGVuZXJbXT4gPSBuZXcgSWRlbnRpZmllck1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChMT0dHRVJfTE9HX1BBQ0tFVCwgTE9HR0VSX0xJU1RFTl9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKExPR0dFUl9MT0dfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJzLmdldChwYWNrZXQuaWQpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuZm9yRWFjaCgoaXQpID0+IGl0KHBhY2tldC5tZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogTG9nTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTG9nUGFja2V0KHRoaXMub211LmFwcC5pZCwgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoTE9HR0VSX0xPR19QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyh7IHR5cGU6IExvZ1R5cGUuRVJST1IsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5pbmcodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5XQVJOSU5HLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbmZvKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyh7IHR5cGU6IExvZ1R5cGUuSU5GTywgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5ERUJVRywgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGlkOiBJZGVudGlmaWVyLCBsaXN0ZW5lcjogTG9nTGlzdGVuZXIpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTElTVEVOX1BBQ0tFVCwgaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdGVuZXJzLmdldChpZCkgPz8gW107XG4gICAgICAgIGxpc3QucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbGlzdCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25MZXZlbCA9ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCc7XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25NZXRhZGF0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGxldmVsOiBQZXJtaXNzaW9uTGV2ZWw7XG59O1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uVHlwZUpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25UeXBlIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGlkOiBJZGVudGlmaWVyOyBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICk6IFBlcm1pc3Npb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uVHlwZSh7XG4gICAgICAgICAgICBpZDogSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQZXJtaXNzaW9uVHlwZSk6IFBlcm1pc3Npb25UeXBlSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoanNvbjogUGVybWlzc2lvblR5cGVKc29uKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb21LZXkoanNvbi5pZCksXG4gICAgICAgICAgICBtZXRhZGF0YToganNvbi5tZXRhZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlIH0gZnJvbSAnLi9wZXJtaXNzaW9uLmpzJztcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UGVybWlzc2lvbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGVybWlzc2lvbicsXG4gICAgKGNsaWVudCkgPT4gbmV3IFBlcm1pc3Npb25FeHRlbnNpb24oY2xpZW50KSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihQZXJtaXNzaW9uVHlwZSkudG9BcnJheSgpLFxuICAgIH0sXG4pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXSwgdm9pZD4oXG4gICAgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLFxuICAgIH0sXG4pO1xuY29uc3QgUEVSTUlTU0lPTl9HUkFOVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UGVybWlzc2lvblR5cGVbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdncmFudCcsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihQZXJtaXNzaW9uVHlwZSkudG9BcnJheSgpLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9ucyA9IG5ldyBJZGVudGlmaWVyTWFwPFBlcm1pc3Npb25UeXBlPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0ZXJlZFBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJTZXQoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVRVUlSRV9QQUNLRVQsXG4gICAgICAgICAgICBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCwgKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zLnNldChwZXJtaXNzaW9uLmlkLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5hcHAudHlwZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoXG4gICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy52YWx1ZXMoKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkUGVybWlzc2lvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoXG4gICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy52YWx1ZXMoKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyKHBlcm1pc3Npb246IFBlcm1pc3Npb25UeXBlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULCBbcGVybWlzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnNldChwZXJtaXNzaW9uLmlkLCBwZXJtaXNzaW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZSguLi5wZXJtaXNzaW9uSWRzOiBJbnRvSWRbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHMgPSBwZXJtaXNzaW9uSWRzLm1hcChJZGVudGlmaWVyLmZyb20pO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gaWRzLmZpbHRlcigoaWQpID0+ICF0aGlzLnBlcm1pc3Npb25zLmhhcyhpZCkpO1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGVybWlzc2lvbnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2xpZW50IHN0YXJ0cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVkUGVybWlzc2lvbnMuYWRkKGlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KC4uLnBlcm1pc3Npb25JZHM6IElkZW50aWZpZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChQRVJNSVNTSU9OX1JFUVVFU1RfRU5EUE9JTlQsIHBlcm1pc3Npb25JZHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGVybWlzc2lvbklkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuaGFzKHBlcm1pc3Npb25JZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZWQocGVybWlzc2lvbklkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGx1Z2luJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBQbHVnaW5FeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBQTFVHSU5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBsdWdpbnM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChQTFVHSU5fUkVRVUlSRV9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd2VkUGFja2FnZXMoKTogVGFibGU8UGx1Z2luUGFja2FnZUluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LnRhYmxlcy5nZXQoUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChvcHRpb25zOiBSZWxvYWRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUExVR0lOX1JFUVVJUkVfUEFDS0VULCBPYmplY3QuZnJvbUVudHJpZXModGhpcy5yZXF1aXJlZFBsdWdpbnMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZShwbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5zIG11c3QgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2lucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQbHVnaW5zLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgUExVR0lOX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+PihcbiAgICBQTFVHSU5fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgfSxcbik7XG5leHBvcnQgY2xhc3MgUGx1Z2luUGFja2FnZUluZm8ge1xuICAgIHB1YmxpYyBwYWNrYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKF9wYWNrYWdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnBhY2thZ2UgPSBfcGFja2FnZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQbHVnaW5QYWNrYWdlSW5mbyk6IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KTogUGx1Z2luUGFja2FnZUluZm8ge1xuICAgICAgICByZXR1cm4gUGx1Z2luUGFja2FnZUluZm8uZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBuZXcgUGx1Z2luUGFja2FnZUluZm8oanNvbi5wYWNrYWdlLCBqc29uLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHsgcGFja2FnZTogdGhpcy5wYWNrYWdlLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAnbWFuYWdlJyk7XG5cbmNvbnN0IFBMVUdJTl9BTExPV0VEX1BBQ0tBR0VfVEFCTEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF9wYWNrYWdlJyxcbiAgICBzZXJpYWxpemVyOiBQbHVnaW5QYWNrYWdlSW5mbyxcbiAgICBrZXk6IChpdGVtKSA9PiBpdGVtLmtleSgpLFxufSk7XG5cbnR5cGUgUmVsb2FkT3B0aW9ucyA9IHtcbiAgICBwYWNrYWdlczogc3RyaW5nW10gfCBudWxsO1xufTtcblxudHlwZSBSZWxvYWRSZXN1bHQgPSB7XG4gICAgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5jb25zdCBQTFVHSU5fUkVMT0FEX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZWxvYWRPcHRpb25zLCBSZWxvYWRSZXN1bHQ+KFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIHBlcm1pc3Npb25JZDogUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhZGRlZF9hdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBJbmRleCB7XG4gICAgaW5kZXhlczogUmVjb3JkPHN0cmluZywgQXBwSW5kZXhFbnRyeT47XG59O1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcHMnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICd3cml0ZScpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignaW5kZXgnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUdJU1RSWV9UWVBFOiBSZWdpc3RyeVR5cGU8QXBwSW5kZXg+ID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248QXBwSW5kZXg+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbmRleCcsXG4gICAgZGVmYXVsdFZhbHVlOiB7ICdpbmRleGVzJzoge30gfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICB3cml0ZTogU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgcmVhZDogU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5jb25zdCBBUFBfVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdhcHBzJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgYWxsOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignc2h1dGRvd24nKTtcbmNvbnN0IFNIVVRET1dOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxib29sZWFuLCBib29sZWFuPihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2h1dGRvd24nLFxuICAgIHBlcm1pc3Npb25JZDogU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbigndHJ1c3RlZF9vcmlnaW5zJywgJ2dldCcpO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnc2V0Jyk7XG5jb25zdCBUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAndHJ1c3RlZF9ob3N0cycsXG4gICAgZGVmYXVsdFZhbHVlOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHdyaXRlOiBUUlVTVEVEX09SSUdJTlNfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHBzOiBUYWJsZTxBcHA+O1xuICAgIHB1YmxpYyByZWFkb25seSBpbmRleDogUmVnaXN0cnk8QXBwSW5kZXg+O1xuICAgIHB1YmxpYyByZWFkb25seSB0cnVzdGVkSG9zdHM6IFJlZ2lzdHJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmFwcHMgPSBvbXUudGFibGVzLmdldChBUFBfVEFCTEVfVFlQRSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvbXUucmVnaXN0cmllcy5nZXQoU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEUpO1xuICAgICAgICB0aGlzLnRydXN0ZWRIb3N0cyA9IG9tdS5yZWdpc3RyaWVzLmdldChUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihyZXN0YXJ0PzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChTSFVURE9XTl9FTkRQT0lOVF9UWVBFLCByZXN0YXJ0ID8/IGZhbHNlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5vbXUubmV0d29yay5ldmVudC5kaXNjb25uZWN0ZWQubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uQ29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRpc2Nvbm5lY3RDYWxsYmFja3M6IEFycmF5PChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgb25Db25uZWN0KGNhbGxiYWNrOiAoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Db25uZWN0Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBBcHBJbmRleFJlZ2lzdHJ5TWV0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU6IExvY2FsaXplZFRleHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4UmVnaXN0cnlKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhcHBzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEluZGV4UmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBhcHBzOiBJZGVudGlmaWVyTWFwPEFwcD4sXG4gICAgICAgIHB1YmxpYyBtZXRhOiBBcHBJbmRleFJlZ2lzdHJ5TWV0YSB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBBcHBJbmRleFJlZ2lzdHJ5SlNPTik6IEFwcEluZGV4UmVnaXN0cnkge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShqc29uWydpZCddKTtcbiAgICAgICAgY29uc3QgYXBwcyA9IG5ldyBJZGVudGlmaWVyTWFwPEFwcD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBbaWRTdHIsIGFwcEpTT05dIG9mIE9iamVjdC5lbnRyaWVzKGpzb25bJ2FwcHMnXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGlkU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcCA9IEFwcC5kZXNlcmlhbGl6ZShhcHBKU09OKTtcbiAgICAgICAgICAgIGlmICghaWQuaXNOYW1lc3BhY2VFcXVhbChhcHAuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHAgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIElEIGluIHRoZSBpbmRleC4gJHthcHAuaWR9ICE9ICR7aWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBzLnNldChpZCwgYXBwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFwcEluZGV4UmVnaXN0cnkoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGFwcHMsXG4gICAgICAgICAgICBqc29uLm1ldGEsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCwgSWRlbnRpZmllclNldCwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNlc3Npb25PYnNlcnZlciB9IGZyb20gJy4uL3NlcnZlci9leHRlbnNpb24nO1xuaW1wb3J0IHsgVGFibGUsIFRhYmxlVHlwZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFU1NJT05fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnc2Vzc2lvbnMnLCAob211OiBPbXUpID0+IG5ldyBTZXNzaW9uRXh0ZW5zaW9uKG9tdSkpO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZWFkJyk7XG5jb25zdCBTRVNTSU9OX1RBQkxFX1RZUEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25zJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb2JzZXJ2ZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5jb25zdCBTRVNTSU9OX0RJU0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxBcHA+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbl9kaXNjb25uZWN0ZWQnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbn0pO1xuXG50eXBlIFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkID0ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbGFuX2lwOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZW1vdGVfYXBwJywgJ3JlcXVlc3QnKTtcblxuY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZW1vdGVBcHBSZXF1ZXN0UGF5bG9hZCwgUmVxdWVzdFJlbW90ZUFwcFJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlbW90ZV9hcHBfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZVRva2VuUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2dlbmVyYXRlX3Rva2VuJyk7XG5cbnR5cGUgR2VuZXJhdGVUb2tlblBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxHZW5lcmF0ZVRva2VuUGF5bG9hZCwgR2VuZXJhdGVUb2tlblJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dlbmVyYXRlX3Rva2VuJyxcbiAgICBwZXJtaXNzaW9uSWQ6IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlc3Npb25FeHRlbnNpb24+ID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbnM6IFRhYmxlPEFwcD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uT2JzZXJ2ZXJzID0gbmV3IElkZW50aWZpZXJNYXA8U2Vzc2lvbk9ic2VydmVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZWRBcHBzID0gbmV3IElkZW50aWZpZXJTZXQoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLCAoYXBwKSA9PiB0aGlzLmhhbmRsZVNlc3Npb25EaXNjb25uZWN0KGFwcCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSBvbXUudGFibGVzLmdldChTRVNTSU9OX1RBQkxFX1RZUEUpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgICAgICBvbXUub25SZWFkeSgoKSA9PiB0aGlzLm9uUmVhZHkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhpZDogSW50b0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlc3Npb25zLmhhcyhJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2JzZXJ2ZShhcHBJZDogSW50b0lkLCB7XG4gICAgICAgIG9uQ29ubmVjdCxcbiAgICAgICAgb25EaXNjb25uZWN0LFxuICAgIH06IHtcbiAgICAgICAgb25Db25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICAgICAgb25EaXNjb25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICB9KTogU2Vzc2lvbk9ic2VydmVyIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oYXBwSWQpO1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIFtpZF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmdldChpZCkgPz8gbmV3IFNlc3Npb25PYnNlcnZlcihbXSwgW10pO1xuICAgICAgICBvYnNlcnZlci5vbkNvbm5lY3Qob25Db25uZWN0KTtcbiAgICAgICAgb2JzZXJ2ZXIub25EaXNjb25uZWN0KG9uRGlzY29ubmVjdCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zZXQoaWQsIG9ic2VydmVyKTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uQ29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uRGlzY29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLmFwcElkczogSW50b0lkW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlcXVpcmUgYXBwcyBhZnRlciB0aGUgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhcHBJZCBvZiBhcHBJZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRBcHBzLmFkZChJZGVudGlmaWVyLmZyb20oYXBwSWQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25UYXNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEFwcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMucmVxdWlyZWRBcHBzLnZhbHVlcygpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25PYnNlcnZlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5rZXlzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0UmVtb3RlQXBwKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgeyBhcHAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghYXBwLnVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIGEgVVJMIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwLnR5cGUgIT09ICdyZW1vdGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGJlIGEgcmVtb3RlIGFwcCB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcHAubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgaGF2ZSBtZXRhZGF0YSB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFJFTU9URV9BUFBfUkVRVUVTVF9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVUb2tlbihvcHRpb25zOiB7XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICBwZXJtaXNzaW9uczogSW50b0lkW107XG4gICAgfSk6IFByb21pc2U8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChHRU5FUkFURV9UT0tFTl9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgeyBTaWduYWxQZXJtaXNzaW9ucywgU2lnbmFsUGVybWlzc2lvbnNKU09OIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNpZ25hbFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsUGFja2V0KGlkLCBib2R5KTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpZ25hbFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2lnbmFsUmVnaXN0ZXJQYWNrZXQpOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gcGFja2V0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhY2tldC5pZC5rZXkoKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsaXN0ZW46IHBlcm1zLmxpc3RlbiA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5saXN0ZW4pLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNlbmQ6IHBlcm1zLnNlbmQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuc2VuZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogU2lnbmFsUmVnaXN0ZXJQYWNrZXRKU09OKTogU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxSZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5hbGwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmxpc3RlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5zZW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICBsaXN0ZW4/OiBzdHJpbmc7XG4gICAgc2VuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIGxpc3Rlbj86IEludG9JZCB8IHVuZGVmaW5lZDtcbiAgICBzZW5kPzogSW50b0lkIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBTaWduYWxQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIGFueT47XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFNpZ25hbFBlcm1pc3Npb25zO1xuICAgICAgICB9LFxuICAgICk6IFNpZ25hbFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIub2Y8VCwgYW55PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpKS50b0pzb24oKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWw8VD4ge1xuICAgIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcbiAgICBub3RpZnkoYm9keTogVCk6IHZvaWQ7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgU2lnbmFsUGFja2V0LCBTaWduYWxSZWdpc3RlclBhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBTaWduYWxUeXBlLCB0eXBlIFNpZ25hbCB9IGZyb20gJy4vc2lnbmFsLmpzJztcblxuZXhwb3J0IGNvbnN0IFNJR05BTF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NpZ25hbCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2lnbmFsRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5jb25zdCBTSUdOQUxfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFNpZ25hbFJlZ2lzdGVyUGFja2V0PihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBTSUdOQUxfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBTSUdOQUxfTk9USUZZX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTaWduYWxQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdub3RpZnknLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gU0lHTkFMX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFscyA9IG5ldyBJZGVudGlmaWVyTWFwPFNpZ25hbFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFNJR05BTF9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX05PVElGWV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTaWduYWw8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbHMuaGFzKHNpZ25hbFR5cGUuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hbCBmb3Iga2V5ICR7c2lnbmFsVHlwZS5pZH0gYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxJbXBsKHRoaXMub211LCBzaWduYWxUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVKc29uPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVTZXJpYWxpemVkPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHNpZ25hbFR5cGU6IFNpZ25hbFR5cGU8VD4pOiBTaWduYWw8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduYWwoc2lnbmFsVHlwZSk7XG4gICAgfVxufVxuXG5jbGFzcyBTaWduYWxJbXBsPFQ+IGltcGxlbWVudHMgU2lnbmFsPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogKCh2YWx1ZTogVCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBTaWduYWxUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFNJR05BTF9OT1RJRllfUEFDS0VULCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVCcm9hZGNhc3QoZGF0YSkpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkoYm9keTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGJvZHkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9OT1RJRllfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YoaGFuZGxlciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQnJvYWRjYXN0KGRhdGE6IFNpZ25hbFBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEuYm9keSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy50eXBlLmlkLmlzU3VicGF0aE9mKHRoaXMub211LmFwcC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IERpc2Nvbm5lY3RUeXBlIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuZXhwb3J0IGNsYXNzIE9tdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFJlYXNvbiBleHRlbmRzIE9tdUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHR5cGU6IERpc2Nvbm5lY3RUeXBlLFxuICAgICAgICBwdWJsaWMgbWVzc2FnZSA9ICcnLFxuICAgICkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJSZXN0YXJ0IGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJULCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbm90aGVyQ29ubmVjdGlvbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5BTk9USEVSX0NPTk5FQ1RJT04sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25EZW5pZWQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuUEVSTUlTU0lPTl9ERU5JRUQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwcFJlbW92ZWQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuQVBQX1JFTU9WRUQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1RPS0VOLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkT3JpZ2luIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfT1JJR0lOLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVmVyc2lvbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX1ZFUlNJT04sIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRQYWNrZXQgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjQwJztcbmV4cG9ydCBjb25zdCBWRVJTSU9OX01JTk9SID0gJzAuOS4wJztcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0RGF0YSwgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0JztcblxuZXhwb3J0IGNsYXNzIFBhY2tldE1hcHBlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldE1hcCA9IG5ldyBJZGVudGlmaWVyTWFwPFBhY2tldFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIoLi4ucGFja2V0VHlwZXM6IFBhY2tldFR5cGU8dW5rbm93bj5bXSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcGFja2V0VHlwZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhY2tldE1hcC5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCBpZCAke3R5cGUuaWQua2V5KCl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYWNrZXRNYXAuc2V0KHR5cGUuaWQsIHR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKHBhY2tldDogUGFja2V0KTogUGFja2V0RGF0YSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBwYWNrZXQudHlwZS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGRhdGE6IHBhY2tldC50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHBhY2tldC5kYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBkZXNlcmlhbGl6ZShkYXRhOiBQYWNrZXREYXRhKTogUGFja2V0IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShkYXRhLnR5cGUpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5wYWNrZXRNYXAuZ2V0KGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXR5cGUpIHRocm93IG5ldyBFcnJvcihgUGFja2V0IHR5cGUgJHtkYXRhLnR5cGV9IG5vdCByZWdpc3RlcmVkYCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZGF0YTogdHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEuZGF0YSksXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gICAgY29ubmVjdCgpOiBQcm9taXNlPENvbm5lY3Rpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xuICAgIHNlbmQocGFja2V0OiBQYWNrZXQsIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+KTogdm9pZDtcbiAgICByZWNlaXZlKHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQsIFBhY2tldERhdGE+KTogUHJvbWlzZTxQYWNrZXQgfCBudWxsPjtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIGNsb3NlZDogYm9vbGVhbjtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBQYWNrZXQsIFBhY2tldERhdGEgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQtdHlwZXMnO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnVmZmVyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVmZmVyXG4gICAgICAgIC50b0Jhc2U2NCgpXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoZGF0YTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoZGF0YS5sZW5ndGggJSA0KSB7XG4gICAgICAgIGRhdGEgKz0gJz0nO1xuICAgIH1cbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KGRhdGEpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIodTg6IFVpbnQ4QXJyYXkpOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHU4Lmxlbmd0aCk7XG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgdmlldy5zZXQodTgpO1xuICAgIHJldHVybiBidWY7XG59XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRJT05fQVZBSUxBQkxFOiBib29sZWFuID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgISFjcnlwdG8uc3VidGxlO1xuXG5leHBvcnQgY2xhc3MgRGVjcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByaXZhdGVLZXk6IENyeXB0b0tleSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNLZXk6IENyeXB0b0tleSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPERlY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXksIHB1YmxpY0tleSB9ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IDQwOTYsXG4gICAgICAgICAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsxLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGVjcnlwdG9yKHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRvUmVxdWVzdCgpOiBQcm9taXNlPFJTQU51bWJlcnM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ2p3aycsIHRoaXMucHVibGljS2V5KTtcbiAgICAgICAgaWYgKCFrZXkuZSkgdGhyb3cgbmV3IEVycm9yKCdLZXkgZXhwb3J0IGZhaWxlZDogbWlzc2luZyBleHBvbmVudCcpO1xuICAgICAgICBpZiAoIWtleS5uKSB0aHJvdyBuZXcgRXJyb3IoJ0tleSBleHBvcnQgZmFpbGVkOiBtaXNzaW5nIG1vZHVsdXMnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGU6IGtleS5lLFxuICAgICAgICAgICAgbjoga2V5Lm4sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHsgbmFtZTogJ1JTQS1PQUVQJyB9LFxuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdFN0cmluZyhkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7IG5hbWU6ICdSU0EtT0FFUCcgfSxcbiAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoZGF0YSkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5jcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0tleTogQ3J5cHRvS2V5LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KHJlcXVlc3Q6IFJTQU51bWJlcnMpOiBQcm9taXNlPEVuY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgICdqd2snLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsZzogJ1JTQS1PQUVQLTI1NicsXG4gICAgICAgICAgICAgICAgZXh0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleV9vcHM6IFsnZW5jcnlwdCddLFxuICAgICAgICAgICAgICAgIGt0eTogJ1JTQScsXG4gICAgICAgICAgICAgICAgZTogcmVxdWVzdC5lLnJlcGxhY2UoLz0rJC8sICcnKSxcbiAgICAgICAgICAgICAgICBuOiByZXF1ZXN0Lm4ucmVwbGFjZSgvPSskLywgJycpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgRW5jcnlwdG9yKHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHRTdHJpbmcoZGF0YTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUVTIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGtleTogQ3J5cHRvS2V5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGl2OiBBcnJheUJ1ZmZlcixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPEFFUz4ge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEyOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDE2KSk7XG4gICAgICAgIHJldHVybiBuZXcgQUVTKGtleSwgaXYuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKGFlczogc3RyaW5nLCBkZWNyeXB0b3I6IERlY3J5cHRvcik6IFByb21pc2U8QUVTPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRvci5kZWNyeXB0KGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoYWVzKSkpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21BcnJheUJ1ZmZlcihkZWNyeXB0ZWQpO1xuICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgY29uc3QgaXYgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcblxuICAgICAgICBjb25zdCBrZXlfZW5jb2RlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgJ3JhdycsXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoa2V5KSxcbiAgICAgICAgICAgICdBRVMtQ0JDJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMoXG4gICAgICAgICAgICBrZXlfZW5jb2RlZCxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihpdiksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZShlbmNyeXB0b3I6IEVuY3J5cHRvcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdyYXcnLCB0aGlzLmtleSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkocmF3S2V5KSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkodGhpcy5pdikpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBlbmNyeXB0b3IuZW5jcnlwdChjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIod3JpdGVyLmZpbmlzaCgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogUGFja2V0RGF0YSk6IFByb21pc2U8UGFja2V0PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhkYXRhLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih3cml0ZXIuZmluaXNoKCkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQubmV3KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0KHBhY2tldDogUGFja2V0PFVpbnQ4QXJyYXk+KTogUHJvbWlzZTxQYWNrZXREYXRhPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihwYWNrZXQuZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbUFycmF5QnVmZmVyKGRlY3J5cHRlZCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4uL2FkZHJlc3MuanMnO1xuaW1wb3J0IHtcbiAgICBBbm90aGVyQ29ubmVjdGlvbiwgQXBwUmVtb3ZlZCwgRGlzY29ubmVjdFJlYXNvbiwgSW50ZXJuYWxFcnJvcixcbiAgICBJbnZhbGlkT3JpZ2luLFxuICAgIEludmFsaWRQYWNrZXQsXG4gICAgSW52YWxpZFRva2VuLFxuICAgIEludmFsaWRWZXJzaW9uLFxuICAgIFBlcm1pc3Npb25EZW5pZWQsXG4gICAgU2VydmVyUmVzdGFydCxcbn0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uL29tdS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuUHJvdmlkZXIgfSBmcm9tICcuLi90b2tlbi5qcyc7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IFBhY2tldE1hcHBlciB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBBRVMsIERlY3J5cHRvciwgRU5DUllQVElPTl9BVkFJTEFCTEUsIEVuY3J5cHRpb25SZXNwb25zZSwgRW5jcnlwdG9yIH0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IENvbm5lY3RQYWNrZXQsIERpc2Nvbm5lY3RUeXBlLCBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQuanMnO1xuXG50eXBlIFBhY2tldEhhbmRsZXI8VD4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICBldmVudDogRXZlbnRFbWl0dGVyPFtUXT47XG59O1xuXG50eXBlIFN0YXR1c1R5cGU8VD4gPSB7XG4gICAgdHlwZTogVDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ldHdvcmtTdGF0dXMgPSBTdGF0dXNUeXBlPCdjb25uZWN0aW5nJz4gfCBTdGF0dXNUeXBlPCdjb25uZWN0ZWQnPiB8IFN0YXR1c1R5cGU8J3JlYWR5Jz4gfCB7XG4gICAgdHlwZTogJ2Rpc2Nvbm5lY3RlZCc7XG4gICAgYXR0ZW1wdD86IG51bWJlcjtcbiAgICByZWFzb24/OiBEaXNjb25uZWN0UmVhc29uO1xufSB8IHtcbiAgICB0eXBlOiAncmVjb25uZWN0aW5nJztcbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIGRhdGU6IERhdGU7XG4gICAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmsge1xuICAgIHB1YmxpYyBzdGF0dXM6IE5ldHdvcmtTdGF0dXMgPSB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnIH07XG4gICAgcHVibGljIHJlYWRvbmx5IGV2ZW50OiB7IGNvbm5lY3RlZDogRXZlbnRFbWl0dGVyPFtdPjsgZGlzY29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8W0Rpc2Nvbm5lY3RSZWFzb24gfCB1bmRlZmluZWRdPjsgcGFja2V0OiBFdmVudEVtaXR0ZXI8W1BhY2tldDx1bmtub3duPl0+OyBzdGF0dXM6IEV2ZW50RW1pdHRlcjxbTmV0d29ya1N0YXR1c10+IH0gPSB7XG4gICAgICAgIGNvbm5lY3RlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBkaXNjb25uZWN0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgcGFja2V0OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHN0YXR1czogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgIH07XG4gICAgcHJpdmF0ZSByZWFkb25seSB0YXNrczogQXJyYXk8KCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRNYXBwZXIgPSBuZXcgUGFja2V0TWFwcGVyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRIYW5kbGVycyA9IG5ldyBJZGVudGlmaWVyTWFwPFBhY2tldEhhbmRsZXI8dW5rbm93bj4+KCk7XG4gICAgcHJpdmF0ZSBsaXN0ZW5UYXNrOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHB1YmxpYyByZWFzb246IERpc2Nvbm5lY3RSZWFzb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBhdHRlbXB0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwdWJsaWMgYWRkcmVzczogQWRkcmVzcyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0b2tlblByb3ZpZGVyOiBUb2tlblByb3ZpZGVyLFxuICAgICAgICBwcml2YXRlIHRyYW5zcG9ydDogVHJhbnNwb3J0LFxuICAgICAgICBwcml2YXRlIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uIHwgdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIGFlcz86IEFFUyB8IHVuZGVmaW5lZCxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5TRVJWRVJfTUVUQSxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5DT05ORUNULFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkRJU0NPTk5FQ1QsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuVE9LRU4sXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuUkVBRFksXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRQYWNrZXRIYW5kbGVyKFBBQ0tFVF9UWVBFUy5ESVNDT05ORUNULCBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVhc29uLnR5cGUgPT09IERpc2Nvbm5lY3RUeXBlLlNIVVRET1dOXG4gICAgICAgICAgICAgICAgfHwgcmVhc29uLnR5cGUgPT09IERpc2Nvbm5lY3RUeXBlLkNMT1NFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBFUlJPUl9NQVAgPSB7XG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkFOT1RIRVJfQ09OTkVDVElPTl06IEFub3RoZXJDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5QRVJNSVNTSU9OX0RFTklFRF06IFBlcm1pc3Npb25EZW5pZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLkFQUF9SRU1PVkVEXTogQXBwUmVtb3ZlZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9UT0tFTl06IEludmFsaWRUb2tlbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9PUklHSU5dOiBJbnZhbGlkT3JpZ2luLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1ZFUlNJT05dOiBJbnZhbGlkVmVyc2lvbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5URVJOQUxfRVJST1JdOiBJbnRlcm5hbEVycm9yLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VUX1RZUEVdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF9EQVRBXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlRdOiBTZXJ2ZXJSZXN0YXJ0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5DTE9TRV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuU0hVVERPV05dOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBFUlJPUl9NQVBbcmVhc29uLnR5cGVdO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFzb24gPSBuZXcgZXJyb3IocmVhc29uLm1lc3NhZ2UgPz8gJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRQYWNrZXRIYW5kbGVyKFBBQ0tFVF9UWVBFUy5SRUFEWSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgPT09ICdyZWFkeScpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIFJFQURZIHBhY2tldCB3aGVuIGFscmVhZHkgcmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ3JlYWR5JyB9KTtcbiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgIT09ICdkaXNjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGFuZ2UgY29ubmVjdGlvbiB3aGlsZSBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclBhY2tldCguLi5wYWNrZXRUeXBlczogUGFja2V0VHlwZTx1bmtub3duPltdKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFja2V0TWFwcGVyLnJlZ2lzdGVyKC4uLnBhY2tldFR5cGVzKTtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHBhY2tldFR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldEhhbmRsZXJzLnNldCh0eXBlLmlkLCB7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBldmVudDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFja2V0SGFuZGxlcjxUPih0eXBlOiBQYWNrZXRUeXBlPFQ+LCBoYW5kbGVyOiAocGFja2V0OiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMucGFja2V0SGFuZGxlcnMuZ2V0KHR5cGUuaWQpIGFzIFBhY2tldEhhbmRsZXI8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCB0eXBlICR7dHlwZS5pZC5rZXkoKX0gbm90IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsaXN0ZW5lcnMuZXZlbnQubGlzdGVuKGhhbmRsZXIgYXMgKHBhY2tldDogdW5rbm93bikgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzY2hlZHVsZVJlY29ubmVjdChhdHRlbXB0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IE1hdGgubWluKDMwMDAwLCAyMDAwICogKE1hdGgucG93KDEuNSwgYXR0ZW1wdCkgLSAxKSArIDIwMDApO1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzdGF0dXM6IEV4dHJhY3Q8TmV0d29ya1N0YXR1cywgeyB0eXBlOiAncmVjb25uZWN0aW5nJyB9PiA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWNvbm5lY3RpbmcnLFxuICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7Y2FuY2VsbGVkID0gdHJ1ZTt9LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyhzdGF0dXMpO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gc3RhdHVzLnRpbWVvdXQgLSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWUoKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJlbWFpbmluZykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChyZWNvbm5lY3QgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0YXRlKCdkaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29ubmVjdCB3aGlsZSAke3RoaXMuc3RhdHVzLnR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdGVuVGFzaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29ubmVjdCB3aGlsZSBhbHJlYWR5IGNvbm5lY3RpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGVtcHQrKztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gYXdhaXQgdGhpcy50cmFuc3BvcnQuY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Nvbm5lY3RpbmcnIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFSZWNlaXZlZCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWNlaXZlKHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFSZWNlaXZlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZWNlaXZpbmcgc2VydmVyIG1ldGEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFQQUNLRVRfVFlQRVMuU0VSVkVSX01FVEEubWF0Y2gobWV0YVJlY2VpdmVkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IHBhY2tldCByZWNlaXZlZCB3YXMgbm90IHNlcnZlciBtZXRhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogbWV0YSB9ID0gbWV0YVJlY2VpdmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzcy5oYXNoID0gbWV0YS5oYXNoO1xuICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW5Qcm92aWRlci5nZXQodGhpcy5hZGRyZXNzLCB0aGlzLm9tdS5hcHApO1xuICAgICAgICAgICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbihgTm8gdG9rZW4gYXZhaWxhYmxlIGZvciBhcHAgJHt0aGlzLm9tdS5hcHAuaWQua2V5KCl9IGF0ICR7dGhpcy5hZGRyZXNzLmhvc3R9OiR7dGhpcy5hZGRyZXNzLnBvcnR9OiR7dGhpcy5hZGRyZXNzLmhhc2h9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlbmNyeXB0aW9uUmVzcDogRW5jcnlwdGlvblJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9tdS5hcHAudHlwZSA9PT0gJ3JlbW90ZScgJiYgRU5DUllQVElPTl9BVkFJTEFCTEUgJiYgbWV0YS5lbmNyeXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRvciA9IGF3YWl0IERlY3J5cHRvci5uZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdG9yID0gYXdhaXQgRW5jcnlwdG9yLm5ldyhtZXRhLmVuY3J5cHRpb24ucnNhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGF3YWl0IGVuY3J5cHRvci5lbmNyeXB0U3RyaW5nKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFlcyA9IGF3YWl0IEFFUy5uZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblJlc3AgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAndjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnNhOiBhd2FpdCBkZWNyeXB0b3IudG9SZXF1ZXN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhZXM6IGF3YWl0IHRoaXMuYWVzLnNlcmlhbGl6ZShlbmNyeXB0b3IpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFBBQ0tFVF9UWVBFUy5DT05ORUNULFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBuZXcgQ29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHRoaXMub211LmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sOiB7IHZlcnNpb246IFZFUlNJT04gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb246IGVuY3J5cHRpb25SZXNwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sIHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRhc2sgPSB0aGlzLmxpc3RlbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Nvbm5lY3RlZCcgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5jb25uZWN0ZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUYXNrcygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTLlJFQURZLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5UYXNrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEaXNjb25uZWN0UmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhc29uID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudC5kaXNjb25uZWN0ZWQuZW1pdCh0aGlzLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnR5cGUgIT09ICdkaXNjb25uZWN0ZWQnICYmIHRoaXMuc3RhdHVzLnR5cGUgIT09ICdyZWNvbm5lY3RpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCwgcmVhc29uOiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uPy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRhc2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFzb24gJiYgIVtcbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0VHlwZS5TSFVURE9XTixcbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVCxcbiAgICAgICAgICAgIF0uaW5jbHVkZXModGhpcy5yZWFzb24udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY29ubmVjdCA9IGF3YWl0IHRoaXMuc2NoZWR1bGVSZWNvbm5lY3QodGhpcy5hdHRlbXB0KTtcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgcmVhc29uOiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uPy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1N0YXRlKHN0YXRlOiBOZXR3b3JrU3RhdHVzWyd0eXBlJ10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzLnR5cGUgPT09IHN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kKHBhY2tldDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnBhY2tldE1hcHBlci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgICAgIHBhY2tldCA9IGF3YWl0IHRoaXMuYWVzLmVuY3J5cHQoc2VyaWFsaXplZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQocGFja2V0LCB0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWNlaXZlKHRoaXMucGFja2V0TWFwcGVyKTtcbiAgICAgICAgICAgIGlmICghcGFja2V0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoUGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUGFja2V0KHBhY2tldDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChQQUNLRVRfVFlQRVMuRU5DUllQVEVEX1BBQ0tFVC5tYXRjaChwYWNrZXQpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBlbmNyeXB0ZWQgcGFja2V0IGJlZm9yZSBlbmNyeXB0aW9uIHdhcyBlc3RhYmxpc2hlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgdGhpcy5hZXMuZGVjcnlwdChwYWNrZXQpO1xuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5wYWNrZXRNYXBwZXIuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LnBhY2tldC5lbWl0KHBhY2tldCk7XG4gICAgICAgIGNvbnN0IHBhY2tldEhhbmRsZXIgPSB0aGlzLnBhY2tldEhhbmRsZXJzLmdldChwYWNrZXQudHlwZS5pZCk7XG4gICAgICAgIGlmICghcGFja2V0SGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHBhY2tldEhhbmRsZXIuZXZlbnQuZW1pdChwYWNrZXQuZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCB0YXNrIGFmdGVyIGNsaWVudCBpcyByZWFkeScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlVGFzayh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2tzLnNwbGljZSh0aGlzLnRhc2tzLmluZGV4T2YodGFzayksIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hUYXNrcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U3RhdHVzKHN0YXR1czogTmV0d29ya1N0YXR1cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IHN0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IHN0YXR1cyB0byAke3N0YXR1c30gd2hlbiBhbHJlYWR5ICR7c3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBhd2FpdCB0aGlzLmV2ZW50LnN0YXR1cy5lbWl0KHN0YXR1cyk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuLi9hZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24sIFRyYW5zcG9ydCB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldCwgUGFja2V0RGF0YSB9IGZyb20gJy4vcGFja2V0L3BhY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IEFkZHJlc3MsXG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgZ2V0IHdzRW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmFkZHJlc3Muc2VjdXJlID8gJ3dzcycgOiAnd3MnO1xuICAgICAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHRoaXMuYWRkcmVzcztcbiAgICAgICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fS93c2A7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbm5lY3QoKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy53c0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIFdlYnNvY2tldENvbm5lY3Rpb24uZnJvbVNvY2tldChzb2NrZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldENvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldFF1ZXVlOiBBcnJheTxQYWNrZXREYXRhPiA9IFtdO1xuICAgIHByaXZhdGUgcmVjZWl2ZVdhaXRlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkaW5nUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYmVpbmdDbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNvY2tldDogV2ViU29ja2V0LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Tb2NrZXQoc29ja2V0OiBXZWJTb2NrZXQpOiBQcm9taXNlPFdlYnNvY2tldENvbm5lY3Rpb24+IHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBXZWJzb2NrZXRDb25uZWN0aW9uKHNvY2tldCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uYmVpbmdDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWRpbmdQcm9taXNlID0gY29ubmVjdGlvbi5vbk1lc3NhZ2UoZXZlbnQpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWRpbmdQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzb2NrZXQub25vcGVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50PHN0cmluZyB8IEJsb2I+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgc3RyaW5nIGRhdGEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkZXIgPSBhd2FpdCBCeXRlUmVhZGVyLmZyb21CbG9iKGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgdHlwZTogcmVhZGVyLnJlYWRTdHJpbmcoKSxcbiAgICAgICAgICAgIGRhdGE6IHJlYWRlci5yZWFkVWludDhBcnJheSgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBhY2tldFF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgIHJlYWRlci5maW5pc2goKTtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmICF0aGlzLmJlaW5nQ2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IHJlc29sdmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmIHRoaXMuYmVpbmdDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldERhdGEgPSB0aGlzLnBhY2tldFF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwYWNrZXREYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TRUQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlV2FpdGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbmQocGFja2V0OiBQYWNrZXQsIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxQYWNrZXQ8dW5rbm93bj4sIFBhY2tldERhdGE+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldERhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShwYWNrZXQpO1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0RGF0YS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXREYXRhLmRhdGEpO1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHdyaXRlci5maW5pc2goKSk7XG4gICAgfVxufVxuIiwKICAgICJ0eXBlIE9rPFQ+ID0ge1xuICAgIG9rOiB0cnVlO1xuICAgIGRhdGE6IFQ7XG59O1xudHlwZSBFcnI8RT4gPSB7XG4gICAgb2s6IGZhbHNlO1xuICAgIGRhdGE6IEU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCwgRSA9IEVycm9yPihmdW5jOiAoKSA9PiBUKTogT2s8VD4gfCBFcnI8RT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBmdW5jKCkgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZGF0YTogZSBhcyBFIH07XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuL2FkZHJlc3MuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJy4vYXBwLmpzJztcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi9oZWxwZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUHJvdmlkZXIge1xuICAgIGdldChzZXJ2ZXJBZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvblBhcmFtID0ge1xuICAgIGFkZHJlc3M6IEFkZHJlc3M7XG4gICAgdG9rZW46IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyVG9rZW5Qcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fUEFSQU1fS0VZID0gJ19vbXVfc2Vzc2lvbic7XG5cbiAgICBwcml2YXRlIGdldEtleShhZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbYWRkcmVzcy5ob3N0LCBhZGRyZXNzLnBvcnQsIGFkZHJlc3MuaGFzaCA/PyAnJywgYXBwLmlkLmtleSgpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChhZGRyZXNzOiBBZGRyZXNzLCBhcHA6IEFwcCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IGZvdW5kVG9rZW4gPSB0aGlzLnBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3MpO1xuICAgICAgICBpZiAoZm91bmRUb2tlbikgcmV0dXJuIGZvdW5kVG9rZW47XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3M6IEFkZHJlc3MpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChCcm93c2VyVG9rZW5Qcm92aWRlci5UT0tFTl9QQVJBTV9LRVkpO1xuICAgICAgICBpZiAoIXBhcmFtKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgb2ssIGRhdGE6IHNlc3Npb24gfSA9IHRyeUNhdGNoPFNlc3Npb25QYXJhbT4oKCkgPT4gSlNPTi5wYXJzZShwYXJhbSkpO1xuICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBzZXNzaW9uIGZyb20gVVJMIHBhcmFtZXRlcjogJHtzZXNzaW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vzc2lvbi5hZGRyZXNzLmhhc2ggIT09IGFkZHJlc3MuaGFzaCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTZXNzaW9uIGFkZHJlc3MgaGFzaCBkb2VzIG5vdCBtYXRjaDogZXhwZWN0ZWQgJHthZGRyZXNzLmhhc2h9LCBnb3QgJHtzZXNzaW9uLmFkZHJlc3MuaGFzaH1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlc3Npb24udG9rZW47XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBFeHRlbnNpb25SZWdpc3RyeSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFTU0VUX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEFzc2V0RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvYXNzZXQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwgdHlwZSBEYXNoYm9hcmRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9kYXNoYm9hcmQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEVuZHBvaW50RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEhUVFBfRVhURU5TSU9OX1RZUEUsIEh0dHBFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9odHRwL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBJMThOX0VYVEVOU0lPTl9UWVBFLCB0eXBlIEkxOG5FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9pMThuL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHR5cGUgTG9nZ2VyRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvbG9nZ2VyL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFBlcm1pc3Npb25FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9wZXJtaXNzaW9uL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHR5cGUgUGx1Z2luRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcGx1Z2luL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwgdHlwZSBSZWdpc3RyeUV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3JlZ2lzdHJ5L2V4dGVuc2lvbic7XG5pbXBvcnQgeyBTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHR5cGUgU2VydmVyRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2VydmVyL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCBTZXNzaW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2Vzc2lvbic7XG5pbXBvcnQgeyBTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHR5cGUgU2lnbmFsRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvc2lnbmFsL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBUQUJMRV9FWFRFTlNJT05fVFlQRSwgdHlwZSBUYWJsZUV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3RhYmxlL2V4dGVuc2lvbic7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJy4vYXBwLmpzJztcbmltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHR5cGUgeyBBZGRyZXNzLCBDb25uZWN0aW9uIH0gZnJvbSAnLi9uZXR3b3JrJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuL25ldHdvcmsnO1xuaW1wb3J0IHsgVHJhbnNwb3J0IH0gZnJvbSAnLi9uZXR3b3JrL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgV2Vic29ja2V0VHJhbnNwb3J0IH0gZnJvbSAnLi9uZXR3b3JrL3dlYnNvY2tldC10cmFuc3BvcnQnO1xuaW1wb3J0IHsgQnJvd3NlclRva2VuUHJvdmlkZXIsIHR5cGUgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vdG9rZW4uanMnO1xuXG5leHBvcnQgdHlwZSBDbGllbnRFdmVudHMgPSB7XG4gICAgc3RhcnRlZDogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICBzdG9wcGVkOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIHJlYWR5OiBFdmVudEVtaXR0ZXI8W10+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdSB7XG4gICAgcHVibGljIHJlYWR5OiBib29sZWFuO1xuICAgIHB1YmxpYyBydW5uaW5nOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGV2ZW50OiBDbGllbnRFdmVudHMgPSB7XG4gICAgICAgIHN0YXJ0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgc3RvcHBlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICByZWFkeTogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgIH07XG4gICAgcmVhZG9ubHkgdG9rZW46IFRva2VuUHJvdmlkZXI7XG4gICAgcmVhZG9ubHkgYWRkcmVzczogQWRkcmVzcztcbiAgICByZWFkb25seSBzZXNzaW9uczogU2Vzc2lvbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBuZXR3b3JrOiBOZXR3b3JrO1xuICAgIHJlYWRvbmx5IGVuZHBvaW50czogRW5kcG9pbnRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcGx1Z2luczogUGx1Z2luRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGRhc2hib2FyZDogRGFzaGJvYXJkRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGV4dGVuc2lvbnM6IEV4dGVuc2lvblJlZ2lzdHJ5O1xuICAgIHJlYWRvbmx5IHRhYmxlczogVGFibGVFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgcmVnaXN0cmllczogUmVnaXN0cnlFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgc2lnbmFsczogU2lnbmFsRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGFzc2V0czogQXNzZXRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgaTE4bjogSTE4bkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBzZXJ2ZXI6IFNlcnZlckV4dGVuc2lvbjtcbiAgICByZWFkb25seSBsb2dnZXI6IExvZ2dlckV4dGVuc2lvbjtcbiAgICByZWFkb25seSBodHRwOiBIdHRwRXh0ZW5zaW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBhcHA6IEFwcCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGFkZHJlc3M/OiBBZGRyZXNzO1xuICAgICAgICAgICAgdG9rZW4/OiBUb2tlblByb3ZpZGVyIHwgc3RyaW5nO1xuICAgICAgICAgICAgdHJhbnNwb3J0PzogVHJhbnNwb3J0O1xuICAgICAgICAgICAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucz8udG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnM/LnRva2VuO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0b2tlbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnM/LnRva2VuID8/IG5ldyBCcm93c2VyVG9rZW5Qcm92aWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IG9wdGlvbnM/LmFkZHJlc3MgPz8ge1xuICAgICAgICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICAgICAgICBwb3J0OiAyNjQyMyxcbiAgICAgICAgICAgIHNlY3VyZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubmV0d29yayA9IG5ldyBOZXR3b3JrKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgICBvcHRpb25zPy50cmFuc3BvcnQgPz8gbmV3IFdlYnNvY2tldFRyYW5zcG9ydCh0aGlzLmFkZHJlc3MpLFxuICAgICAgICAgICAgb3B0aW9ucz8uY29ubmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUEFDS0VUX1RZUEVTLlJFQURZLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgUkVBRFkgcGFja2V0IHdoZW4gYWxyZWFkeSByZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbnNpb25SZWdpc3RyeSh0aGlzKTtcbiAgICAgICAgdGhpcy5lbmRwb2ludHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoUExVR0lOX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy50YWJsZXMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoVEFCTEVfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnNlc3Npb25zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFNFU1NJT05fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJpZXMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoUkVHSVNUUllfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmRhc2hib2FyZCA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnNpZ25hbHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0lHTkFMX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5hc3NldHMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoQVNTRVRfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmkxOG4gPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoSTE4Tl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2VydmVyID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFNFUlZFUl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKExPR0dFUl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuaHR0cCA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihIVFRQX0VYVEVOU0lPTl9UWVBFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZDxUPihwYWNrZXRUeXBlOiBQYWNrZXRUeXBlPFQ+LCBkYXRhOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmV0d29yay5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6IHBhY2tldFR5cGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGFscmVhZHkgcnVubmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSB0aGlzLm5ldHdvcmsuY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmV2ZW50LnN0YXJ0ZWQuZW1pdCgpO1xuICAgICAgICBhd2FpdCBjb25uZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50LnN0b3BwZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5yZWFkeS5saXN0ZW4oY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3YWl0Rm9yUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5KSByZXR1cm47XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHVubGlzdGVuID0gKCkgPT4ge307XG4gICAgICAgICAgICB1bmxpc3RlbiA9IHRoaXMuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztBQUdPLE1BQU0sa0JBQWtCO0FBQUEsRUFHRTtBQUFBLEVBRlosZUFBdUMsSUFBSTtBQUFBLEVBRTVELFdBQVcsQ0FBa0Is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SUFDN0QsS0FBSyxjQUFjLEtBQUssV0FBVyxTQUFTLHlCQUF5QjtBQUFBLElBQ3JFLEtBQUssU0FBUyxLQUFLLFdBQVcsU0FBUyxvQkFBb0I7QUFBQSxJQUMzRCxLQUFLLFdBQVcsS0FBSyxXQUFXLFNBQVMsc0JBQXNCO0FBQUEsSUFDL0QsS0FBSyxhQUFhLEtBQUssV0FBVyxTQUFTLHVCQUF1QjtBQUFBLElBQ2xFLEtBQUssWUFBWSxLQUFLLFdBQVcsU0FBUyx3QkFBd0I7QUFBQSxJQUNsRSxLQUFLLFVBQVUsS0FBSyxXQUFXLFNBQVMscUJBQXFCO0FBQUEsSUFDN0QsS0FBSyxTQUFTLEtBQUssV0FBVyxTQUFTLG9CQUFvQjtBQUFBLElBQzNELEtBQUssT0FBTyxLQUFLLFdBQVcsU0FBUyxtQkFBbUI7QUFBQSxJQUN4RCxLQUFLLFNBQVMsS0FBSyxXQUFXLFNBQVMscUJBQXFCO0FBQUEsSUFDNUQsS0FBSyxTQUFTLEtBQUssV0FBVyxTQUFTLHFCQUFxQjtBQUFBLElBQzVELEtBQUssT0FBTyxLQUFLLFdBQVcsU0FBUyxtQkFBbUI7QUFBQTtBQUFBLEVBR3JELElBQU8sQ0FBQyxZQUEyQixNQUFlO0FBQUEsSUFDckQsS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUNkLE1BQU07QUFBQSxNQUNOO0FBQUEsSUFDSixDQUFDO0FBQUE7QUFBQSxPQUdRLE1BQUssR0FBa0I7QUFBQSxJQUNoQyxJQUFJLEtBQUssU0FBUztBQUFBLE1BQ2QsTUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsSUFDNUM7QUFBQSxJQUNBLEtBQUssVUFBVTtBQUFBLElBQ2YsTUFBTSxVQUFVLEtBQUssUUFBUSxRQUFRO0FBQUEsSUFDckMsS0FBSyxNQUFNLFFBQVEsS0FBSztBQUFBLElBQ3hCLE1BQU07QUFBQTtBQUFBLEVBR0gsSUFBSSxHQUFTO0FBQUEsSUFDaEIsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFBQTtBQUFBLEVBR3JCLE9BQU8sQ0FBQyxVQUFnQztBQUFBLElBQzNDLElBQUksS0FBSyxPQUFPO0FBQUEsTUFDWixTQUFTO0FBQUEsSUFDYjtBQUFBLElBQ0EsT0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPLFFBQVE7QUFBQTtBQUFBLE9BRzlCLGFBQVksR0FBa0I7QUFBQSxJQUN2QyxJQUFJLEtBQUs7QUFBQSxNQUFPO0FBQUEsSUFDaEIsT0FBTyxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQUEsTUFDbEMsSUFBSSxXQUFXLE1BQU07QUFBQSxNQUNyQixXQUFXLEtBQUssTUFBTSxNQUFNLE9BQU8sTUFBTTtBQUFBLFFBQ3JDLFNBQVM7QUFBQSxRQUNULFFBQVE7QUFBQSxPQUNYO0FBQUEsS0FDSjtBQUFBO0FBRVQ7IiwKICAiZGVidWdJZCI6ICI3RUM3MDI4REU4REJDQjY0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==