@ukwhatn/wikidot 4.1.0 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2255,10 +2255,17 @@ class AMCClient {
2255
2255
  body: formData.toString()
2256
2256
  });
2257
2257
  let responseData;
2258
+ const responseText = await response.text();
2258
2259
  try {
2259
- responseData = await response.json();
2260
+ responseData = JSON.parse(responseText);
2260
2261
  } catch {
2261
- return wdErrAsync(new ResponseDataError(`AMC responded with non-JSON data: ${await response.text()}`));
2262
+ retryCount++;
2263
+ if (retryCount >= this.config.retryLimit) {
2264
+ return wdErrAsync(new ResponseDataError(`AMC responded with non-JSON data: ${responseText}`));
2265
+ }
2266
+ const backoff = calculateBackoff(retryCount, this.config.retryInterval, this.config.backoffFactor, this.config.maxBackoff);
2267
+ await sleep(backoff);
2268
+ continue;
2262
2269
  }
2263
2270
  const parseResult = amcResponseSchema.safeParse(responseData);
2264
2271
  if (!parseResult.success) {
@@ -2286,7 +2293,7 @@ class AMCClient {
2286
2293
  retryCount++;
2287
2294
  if (retryCount >= this.config.retryLimit) {
2288
2295
  const statusCode = error instanceof Error && "response" in error ? error.response?.status ?? DEFAULT_HTTP_STATUS_CODE : DEFAULT_HTTP_STATUS_CODE;
2289
- return wdErrAsync(new AMCHttpError(`AMC HTTP request failed: ${String(error)}`, statusCode));
2296
+ return wdErrAsync(new AMCHttpError(`AMC request failed: ${String(error)}`, statusCode));
2290
2297
  }
2291
2298
  const backoff = calculateBackoff(retryCount, this.config.retryInterval, this.config.backoffFactor, this.config.maxBackoff);
2292
2299
  await sleep(backoff);
@@ -4860,5 +4867,5 @@ init_user2();
4860
4867
  // src/util/index.ts
4861
4868
  init_parser();
4862
4869
 
4863
- //# debugId=FBF4C403AA4153D864756E2164756E21
4864
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL21vZHVsZS91c2VyL2Fub255bW91cy11c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci9kZWxldGVkLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2d1ZXN0LXVzZXIudHMiLCAic3JjL3V0aWwvdGFibGUvY2hhci10YWJsZS50cyIsICJzcmMvdXRpbC9zdHJpbmctdXRpbC50cyIsICJzcmMvbW9kdWxlL3VzZXIvdXNlci1jb2xsZWN0aW9uLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci93aWtpZG90LXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2luZGV4LnRzIiwgInNyYy91dGlsL3BhcnNlci91c2VyLnRzIiwgInNyYy91dGlsL3BhcnNlci9pbmRleC50cyIsICJzcmMvY29tbW9uL2RlY29yYXRvcnMudHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tcG9zdC50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXRocmVhZC50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLWNhdGVnb3J5LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vaW5kZXgudHMiLCAic3JjL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWNsaWVudC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1oZWFkZXIudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtdHlwZXMudHMiLCAic3JjL2Nvbm5lY3Rvci9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2F1dGgudHMiLCAic3JjL21vZHVsZS9wcml2YXRlLW1lc3NhZ2UvcHJpdmF0ZS1tZXNzYWdlLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy9wbS1hY2Nlc3Nvci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL2ZvcnVtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvbWVtYmVyLWFjY2Vzc29yLnRzIiwgInNyYy91dGlsL3F1aWNrLW1vZHVsZS50cyIsICJzcmMvbW9kdWxlL3NpdGUvc2l0ZS1hcHBsaWNhdGlvbi50cyIsICJzcmMvbW9kdWxlL3NpdGUvc2l0ZS1tZW1iZXIudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLWZpbGUudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtbWV0YS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1yZXZpc2lvbi50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1zb3VyY2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2Utdm90ZS50cyIsICJzcmMvbW9kdWxlL3BhZ2Uvc2VhcmNoLXF1ZXJ5LnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zaXRlLWNoYW5nZS50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2VzLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy9zaXRlLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2NsaWVudC50cyIsICJzcmMvbW9kdWxlL2luZGV4LnRzIiwgInNyYy91dGlsL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhlIFdpa2lkb3QgbGlicmFyeVxuICogQWxsIGN1c3RvbSBlcnJvcnMgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdpa2lkb3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIEVycm9yIG5hbWUgKi9cbiAgcHVibGljIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuZXhwZWN0ZWQgZXJyb3JcbiAqIFJlcHJlc2VudHMgaW50ZXJuYWwgaW5jb25zaXN0ZW5jaWVzIG9yIGJ1Z3NcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIEJhc2UgZXJyb3IgZm9yIEFqYXggTW9kdWxlIENvbm5lY3RvciByZWxhdGVkIGlzc3Vlc1xuICovXG5leHBvcnQgY2xhc3MgQU1DRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVFRQIHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBBTUMgcmVxdWVzdCBmYWlscyB3aXRoIGFuIEhUVFAgZXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0h0dHBFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHtcbiAgLyoqIEhUVFAgc3RhdHVzIGNvZGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gSFRUUCBzdGF0dXMgY29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICB9XG59XG5cbi8qKlxuICogV2lraWRvdCBzdGF0dXMgY29kZSBlcnJvclxuICogVGhyb3duIHdoZW4gQU1DIHJlc3BvbnNlIHN0YXR1cyBpcyBub3Qgb2tcbiAqL1xuZXhwb3J0IGNsYXNzIFdpa2lkb3RTdGF0dXNFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHtcbiAgLyoqIFdpa2lkb3Qgc3RhdHVzIGNvZGUgc3RyaW5nICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXNDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gc3RhdHVzQ29kZSAtIFN0YXR1cyBjb2RlIChlLmcuLCAnbm90X29rJywgJ3RyeV9hZ2FpbicpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNwb25zZSBkYXRhIGVycm9yXG4gKiBUaHJvd24gd2hlbiByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZURhdGFFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3Igc2Vzc2lvbiByZWxhdGVkIGlzc3Vlc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogU2Vzc2lvbiBjcmVhdGlvbiBmYWlsdXJlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIGxvZ2luIGF0dGVtcHQgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25DcmVhdGVFcnJvciBleHRlbmRzIFNlc3Npb25FcnJvciB7fVxuXG4vKipcbiAqIExvZ2luIHJlcXVpcmVkIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBhdXRoZW50aWNhdGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgd2l0aG91dCBsb2dpblxuICovXG5leHBvcnQgY2xhc3MgTG9naW5SZXF1aXJlZEVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdMb2dpbiBpcyByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBSZXNvdXJjZSBub3QgZm91bmQgZXJyb3JcbiAqIFRocm93biB3aGVuIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogUmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgZXJyb3JcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgcmVzb3VyY2UgdGhhdCBhbHJlYWR5IGV4aXN0c1xuICovXG5leHBvcnQgY2xhc3MgVGFyZ2V0RXhpc3RzRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBUYXJnZXQgc3RhdGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgcmVzb3VyY2UgaXMgaW4gYW4gaW5vcGVyYWJsZSBzdGF0ZSAoZS5nLiwgbG9ja2VkKVxuICovXG5leHBvcnQgY2xhc3MgVGFyZ2V0RXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3MgZGVuaWVkIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgZGVuaWVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogSFRNTCBlbGVtZW50IG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXF1aXJlZCBlbGVtZW50IGlzIG5vdCBmb3VuZCBkdXJpbmcgcGFyc2luZ1xuICovXG5leHBvcnQgY2xhc3MgTm9FbGVtZW50RXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cbiIsCiAgICAiLy8gQmFzZSBlcnJvcnNcblxuLy8gQU1DIGVycm9yc1xuZXhwb3J0IHsgQU1DRXJyb3IsIEFNQ0h0dHBFcnJvciwgUmVzcG9uc2VEYXRhRXJyb3IsIFdpa2lkb3RTdGF0dXNFcnJvciB9IGZyb20gJy4vYW1jJztcbmV4cG9ydCB7IFVuZXhwZWN0ZWRFcnJvciwgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcbi8vIFNlc3Npb24gZXJyb3JzXG5leHBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIFNlc3Npb25DcmVhdGVFcnJvciwgU2Vzc2lvbkVycm9yIH0gZnJvbSAnLi9zZXNzaW9uJztcblxuLy8gVGFyZ2V0IGVycm9yc1xuZXhwb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXJyb3IsXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxufSBmcm9tICcuL3RhcmdldCc7XG4iLAogICAgIi8qKlxuICogTW9kdWxlIHByb3ZpZGluZyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBUaGlzIG1vZHVsZSBjb25maWd1cmVzIGFuZCBwcm92aWRlcyBsb2dnZXJzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqIEJ5IGRlZmF1bHQsIGl0IGRvZXMgbm90IG91dHB1dCBhbnl0aGluZywgYWxsb3dpbmcgYXBwbGljYXRpb24tc2lkZSBsb2cgY29udHJvbC5cbiAqL1xuXG4vKipcbiAqIExvZyBsZXZlbFxuICovXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4vKipcbiAqIExvZyBsZXZlbCBwcmlvcml0eSAoaGlnaGVyIG51bWJlciA9IG1vcmUgaW1wb3J0YW50KVxuICovXG5jb25zdCBMT0dfTEVWRUxfUFJJT1JJVFk6IFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPiA9IHtcbiAgZGVidWc6IDAsXG4gIGluZm86IDEsXG4gIHdhcm46IDIsXG4gIGVycm9yOiAzLFxufTtcblxuLyoqXG4gKiBMb2dnZXIgaGFuZGxlclxuICovXG5leHBvcnQgdHlwZSBMb2dIYW5kbGVyID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBOdWxsSGFuZGxlcjogT3V0cHV0cyBub3RoaW5nIChkZWZhdWx0KVxuICovXG5leHBvcnQgY29uc3QgbnVsbEhhbmRsZXI6IExvZ0hhbmRsZXIgPSAoKSA9PiB7XG4gIC8vIERvIG5vdGhpbmdcbn07XG5cbi8qKlxuICogQ29uc29sZUhhbmRsZXI6IE91dHB1dHMgdG8gY29uc29sZVxuICovXG5leHBvcnQgY29uc3QgY29uc29sZUhhbmRsZXI6IExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IGAke3RpbWVzdGFtcH0gWyR7bmFtZX0vJHtsZXZlbC50b1VwcGVyQ2FzZSgpfV0gJHttZXNzYWdlfWA7XG5cbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ2RlYnVnJzpcbiAgICAgIGNvbnNvbGUuZGVidWcoZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbmZvJzpcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgY29uc29sZS53YXJuKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZXJyb3InOlxuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vKipcbiAqIExvZ2dlciBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgaGFuZGxlcjogTG9nSGFuZGxlcjtcbiAgcHJpdmF0ZSBsZXZlbDogTG9nTGV2ZWw7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBoYW5kbGVyOiBMb2dIYW5kbGVyID0gbnVsbEhhbmRsZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGhhbmRsZXJcbiAgICovXG4gIHNldEhhbmRsZXIoaGFuZGxlcjogTG9nSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGxvZyBsZXZlbFxuICAgKi9cbiAgc2V0TGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbGV2ZWwgc2hvdWxkIGJlIGxvZ2dlZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRMb2cobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExPR19MRVZFTF9QUklPUklUWVtsZXZlbF0gPj0gTE9HX0xFVkVMX1BSSU9SSVRZW3RoaXMubGV2ZWxdO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBsb2dcbiAgICovXG4gIHByaXZhdGUgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGRMb2cobGV2ZWwpKSB7XG4gICAgICB0aGlzLmhhbmRsZXIobGV2ZWwsIHRoaXMubmFtZSwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZGVidWcnLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdlcnJvcicsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGxvZ2dlclxuICogQHBhcmFtIG5hbWUgLSBMb2dnZXIgbmFtZSAoZGVmYXVsdDogXCJ3aWtpZG90XCIpXG4gKiBAcmV0dXJucyBMb2dnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lID0gJ3dpa2lkb3QnKTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIobmFtZSk7XG59XG5cbi8qKlxuICogU2V0dXAgY29uc29sZSBvdXRwdXQgaGFuZGxlclxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byBjb25maWd1cmVcbiAqIEBwYXJhbSBsZXZlbCAtIExvZyBsZXZlbCAoZGVmYXVsdDogXCJ3YXJuXCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cENvbnNvbGVIYW5kbGVyKGxvZ2dlcjogTG9nZ2VyLCBsZXZlbDogTG9nTGV2ZWwgPSAnd2FybicpOiB2b2lkIHtcbiAgbG9nZ2VyLnNldEhhbmRsZXIoY29uc29sZUhhbmRsZXIpO1xuICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbG9nZ2VyIHVzZWQgdGhyb3VnaG91dCB0aGUgcGFja2FnZVxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiIsCiAgICAiaW1wb3J0IHsgZXJyLCBlcnJBc3luYywgb2ssIG9rQXN5bmMsIHR5cGUgUmVzdWx0LCBSZXN1bHRBc3luYyB9IGZyb20gJ25ldmVydGhyb3cnO1xuaW1wb3J0IHR5cGUgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKiogU3luY2hyb25vdXMgUmVzdWx0IHR5cGUgYWxpYXMgKi9cbmV4cG9ydCB0eXBlIFdpa2lkb3RSZXN1bHQ8VD4gPSBSZXN1bHQ8VCwgV2lraWRvdEVycm9yPjtcblxuLyoqIEFzeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0gUmVzdWx0QXN5bmM8VCwgV2lraWRvdEVycm9yPjtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkT2sgPSA8VD4odmFsdWU6IFQpOiBXaWtpZG90UmVzdWx0PFQ+ID0+IG9rKHZhbHVlKTtcblxuLyoqIENyZWF0ZSBlcnJvciBSZXN1bHQgKi9cbmV4cG9ydCBjb25zdCB3ZEVyciA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHQ8bmV2ZXI+ID0+IGVycihlcnJvcik7XG5cbi8qKiBDcmVhdGUgc3VjY2VzcyBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IHdkT2tBc3luYyA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHRBc3luYzxUPiA9PiBva0FzeW5jKHZhbHVlKTtcblxuLyoqIENyZWF0ZSBlcnJvciBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyQXN5bmMgPSA8RSBleHRlbmRzIFdpa2lkb3RFcnJvcj4oZXJyb3I6IEUpOiBXaWtpZG90UmVzdWx0QXN5bmM8bmV2ZXI+ID0+XG4gIGVyckFzeW5jKGVycm9yKTtcblxuLyoqIENvbnZlcnQgZnJvbSBQcm9taXNlICovXG5leHBvcnQgY29uc3QgZnJvbVByb21pc2UgPSA8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGVycm9yTWFwcGVyOiAoZXJyb3I6IHVua25vd24pID0+IFdpa2lkb3RFcnJvclxuKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yTWFwcGVyKTtcblxuLyoqIENvbWJpbmUgbXVsdGlwbGUgUmVzdWx0QXN5bmMgKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lUmVzdWx0cyA9IDxUPihyZXN1bHRzOiBXaWtpZG90UmVzdWx0QXN5bmM8VD5bXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxUW10+ID0+XG4gIFJlc3VsdEFzeW5jLmNvbWJpbmUocmVzdWx0cyk7XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vY29tbW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdWx0JztcbiIsCiAgICAiLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ0NvbmZpZyB7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgKG1pbGxpc2Vjb25kcykgKi9cbiAgdGltZW91dDogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIHJldHJ5IGNvdW50ICovXG4gIHJldHJ5TGltaXQ6IG51bWJlcjtcblxuICAvKiogQmFzZSByZXRyeSBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKSAqL1xuICByZXRyeUludGVydmFsOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gYmFja29mZiAobWlsbGlzZWNvbmRzKSAqL1xuICBtYXhCYWNrb2ZmOiBudW1iZXI7XG5cbiAgLyoqIEJhY2tvZmYgZmFjdG9yICovXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBjb25jdXJyZW50IHJlcXVlc3RzICovXG4gIHNlbWFwaG9yZUxpbWl0OiBudW1iZXI7XG59XG5cbi8qKiBEZWZhdWx0IEFNQyBjb25maWd1cmF0aW9uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTUNfQ09ORklHOiBBTUNDb25maWcgPSB7XG4gIHRpbWVvdXQ6IDIwMDAwLFxuICByZXRyeUxpbWl0OiA1LFxuICByZXRyeUludGVydmFsOiAxMDAwLFxuICBtYXhCYWNrb2ZmOiA2MDAwMCxcbiAgYmFja29mZkZhY3RvcjogMi4wLFxuICBzZW1hcGhvcmVMaW1pdDogMTAsXG59O1xuXG4vKipcbiAqIEZpeGVkIHRva2VuIHZhbHVlIHJlcXVpcmVkIGJ5IFdpa2lkb3RcbiAqIFRoaXMgaXMgYSBmaXhlZCB2YWx1ZSBvYnRhaW5lZCBmcm9tIFdpa2lkb3QncyBmcm9udGVuZCxcbiAqIHVzZWQgYXMgYW4gaWRlbnRpZmllciByYXRoZXIgdGhhbiBhIHNlY3VyaXR5IHRva2VuXG4gKi9cbmV4cG9ydCBjb25zdCBXSUtJRE9UX1RPS0VONyA9ICcxMjM0NTYnO1xuXG4vKipcbiAqIEZhbGxiYWNrIEhUVFAgc3RhdHVzIGNvZGUgZm9yIEhUVFAgZXJyb3JzXG4gKiBVc2VkIHdoZW4gc3RhdHVzIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUgPSA5OTk7XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBBbm9ueW1vdXMgdXNlclxuICovXG5leHBvcnQgY2xhc3MgQW5vbnltb3VzVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgYW5vbnltb3VzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIFVzZXJuYW1lIChcIkFub255bW91c1wiIGZvciBhbm9ueW1vdXMgdXNlcnMpICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnQW5vbnltb3VzJztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnYW5vbnltb3VzJztcblxuICAvKiogQXZhdGFyIFVSTCAobnVsbCBmb3IgYW5vbnltb3VzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZztcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnYW5vbnltb3VzJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgaXA6IHN0cmluZykge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaXAgPSBpcDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgQW5vbnltb3VzVXNlcihuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgaXA9JHt0aGlzLmlwfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBEZWxldGVkIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlbGV0ZWRVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBEZWxldGVkIHVzZXIgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFVzZXJuYW1lIChcImFjY291bnQgZGVsZXRlZFwiIGZvciBkZWxldGVkIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ2FjY291bnQgZGVsZXRlZCc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2FjY291bnRfZGVsZXRlZCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGRlbGV0ZWQpICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICdkZWxldGVkJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgaWQ6IG51bWJlcikge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRGVsZXRlZFVzZXIoaWQ9JHt0aGlzLmlkfSwgbmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogR3Vlc3QgdXNlclxuICovXG5leHBvcnQgY2xhc3MgR3Vlc3RVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICgwIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBHdWVzdCBuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lIChudWxsIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogQXZhdGFyIFVSTCAobWF5IGJlIEdyYXZhdGFyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZ3Vlc3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lOiBzdHJpbmcsIGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXZhdGFyVXJsID0gYXZhdGFyVXJsO1xuICB9XG5cbiAgLy8gQWJzdHJhY3RVc2VyIGltcGxlbWVudGF0aW9uXG4gIGlzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBHdWVzdFVzZXIobmFtZT0ke3RoaXMubmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICIvKipcbiAqIE1hcHBpbmcgdGFibGUgZm9yIGNvbnZlcnRpbmcgc3BlY2lhbCBzeW1ib2xzIGFuZCBub24tRW5nbGlzaCBhbHBoYWJldHMgdG8gRW5nbGlzaCBhbHBoYWJldHNcbiAqXG4gKiBQcm92aWRlcyBtYXBwaW5nIGZvciBjb252ZXJ0aW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHRvIGNvcnJlc3BvbmRpbmcgQVNDSUkgY2hhcmFjdGVycy5cbiAqIE1haW5seSB1c2VkIGZvciBVUkwgZ2VuZXJhdGlvbiBhbmQgcGFnZSBuYW1lIGNvbnZlcnNpb24gdG8gdW5peCBmb3JtYXQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHNwZWNpYWxDaGFyTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnXFx1MDBDMCc6ICdhJyxcbiAgJ1xcdTAwQzEnOiAnYScsXG4gICdcXHUwMEMyJzogJ2EnLFxuICAnXFx1MDBDMyc6ICdhJyxcbiAgJ1xcdTAwQzQnOiAnYWUnLFxuICAnXFx1MDBDNSc6ICdhJyxcbiAgJ1xcdTAwQzYnOiAnYWUnLFxuICAnXFx1MDBDNyc6ICdjJyxcbiAgJ1xcdTAwQzgnOiAnZScsXG4gICdcXHUwMEM5JzogJ2UnLFxuICAnXFx1MDBDQSc6ICdlJyxcbiAgJ1xcdTAwQ0InOiAnZScsXG4gICdcXHUwMENDJzogJ2knLFxuICAnXFx1MDBDRCc6ICdpJyxcbiAgJ1xcdTAwQ0UnOiAnaScsXG4gICdcXHUwMENGJzogJ2knLFxuICAnXFx1MDBEMCc6ICdkJyxcbiAgJ1xcdTAwRDEnOiAnbicsXG4gICdcXHUwMEQyJzogJ28nLFxuICAnXFx1MDBEMyc6ICdvJyxcbiAgJ1xcdTAwRDQnOiAnbycsXG4gICdcXHUwMEQ1JzogJ28nLFxuICAnXFx1MDBENic6ICdvZScsXG4gICdcXHUwMEQ4JzogJ28nLFxuICAnXFx1MDBEOSc6ICd1JyxcbiAgJ1xcdTAwREEnOiAndScsXG4gICdcXHUwMERCJzogJ3UnLFxuICAnXFx1MDBEQyc6ICd1ZScsXG4gICdcXHUwMEREJzogJ3knLFxuICAnXFx1MDBERSc6ICd0JyxcbiAgJ1xcdTAwREYnOiAnc3MnLFxuICAnXFx1MDBFMCc6ICdhJyxcbiAgJ1xcdTAwRTEnOiAnYScsXG4gICdcXHUwMEUyJzogJ2EnLFxuICAnXFx1MDBFMyc6ICdhJyxcbiAgJ1xcdTAwRTQnOiAnYWUnLFxuICAnXFx1MDBFNSc6ICdhJyxcbiAgJ1xcdTAwRTYnOiAnYWUnLFxuICAnXFx1MDBFNyc6ICdjJyxcbiAgJ1xcdTAwRTgnOiAnZScsXG4gICdcXHUwMEU5JzogJ2UnLFxuICAnXFx1MDBFQSc6ICdlJyxcbiAgJ1xcdTAwRUInOiAnZScsXG4gICdcXHUwMEVDJzogJ2knLFxuICAnXFx1MDBFRCc6ICdpJyxcbiAgJ1xcdTAwRUUnOiAnaScsXG4gICdcXHUwMEVGJzogJ2knLFxuICAnXFx1MDBGMCc6ICdkJyxcbiAgJ1xcdTAwRjEnOiAnbicsXG4gICdcXHUwMEYyJzogJ28nLFxuICAnXFx1MDBGMyc6ICdvJyxcbiAgJ1xcdTAwRjQnOiAnbycsXG4gICdcXHUwMEY1JzogJ28nLFxuICAnXFx1MDBGNic6ICdvZScsXG4gICdcXHUwMEY4JzogJ28nLFxuICAnXFx1MDBGOSc6ICd1JyxcbiAgJ1xcdTAwRkEnOiAndScsXG4gICdcXHUwMEZCJzogJ3UnLFxuICAnXFx1MDBGQyc6ICd1ZScsXG4gICdcXHUwMEZEJzogJ3knLFxuICAnXFx1MDBGRSc6ICd0JyxcbiAgJ1xcdTAwRkYnOiAneScsXG4gICdcXHUwMTAwJzogJ2EnLFxuICAnXFx1MDEwMSc6ICdhJyxcbiAgJ1xcdTAxMDInOiAnYScsXG4gICdcXHUwMTAzJzogJ2EnLFxuICAnXFx1MDEwNCc6ICdhJyxcbiAgJ1xcdTAxMDUnOiAnYScsXG4gICdcXHUwMTA2JzogJ2MnLFxuICAnXFx1MDEwNyc6ICdjJyxcbiAgJ1xcdTAxMDgnOiAnYycsXG4gICdcXHUwMTA5JzogJ2MnLFxuICAnXFx1MDEwQSc6ICdjJyxcbiAgJ1xcdTAxMEInOiAnYycsXG4gICdcXHUwMTBDJzogJ2MnLFxuICAnXFx1MDEwRCc6ICdjJyxcbiAgJ1xcdTAxMEUnOiAnZCcsXG4gICdcXHUwMTBGJzogJ2QnLFxuICAnXFx1MDExMCc6ICdkJyxcbiAgJ1xcdTAxMTEnOiAnZCcsXG4gICdcXHUwMTEyJzogJ2UnLFxuICAnXFx1MDExMyc6ICdlJyxcbiAgJ1xcdTAxMTQnOiAnZScsXG4gICdcXHUwMTE1JzogJ2UnLFxuICAnXFx1MDExNic6ICdlJyxcbiAgJ1xcdTAxMTcnOiAnZScsXG4gICdcXHUwMTE4JzogJ2UnLFxuICAnXFx1MDExOSc6ICdlJyxcbiAgJ1xcdTAxMUEnOiAnZScsXG4gICdcXHUwMTFCJzogJ2UnLFxuICAnXFx1MDExQyc6ICdnJyxcbiAgJ1xcdTAxMUQnOiAnZycsXG4gICdcXHUwMTFFJzogJ2cnLFxuICAnXFx1MDExRic6ICdnJyxcbiAgJ1xcdTAxMjAnOiAnZycsXG4gICdcXHUwMTIxJzogJ2cnLFxuICAnXFx1MDEyMic6ICdnJyxcbiAgJ1xcdTAxMjMnOiAnZycsXG4gICdcXHUwMTI0JzogJ2gnLFxuICAnXFx1MDEyNSc6ICdoJyxcbiAgJ1xcdTAxMjYnOiAnaCcsXG4gICdcXHUwMTI3JzogJ2gnLFxuICAnXFx1MDEyOCc6ICdpJyxcbiAgJ1xcdTAxMjknOiAnaScsXG4gICdcXHUwMTJBJzogJ2knLFxuICAnXFx1MDEyQic6ICdpJyxcbiAgJ1xcdTAxMkMnOiAnaScsXG4gICdcXHUwMTJEJzogJ2knLFxuICAnXFx1MDEyRSc6ICdpJyxcbiAgJ1xcdTAxMkYnOiAnaScsXG4gICdcXHUwMTMwJzogJ2knLFxuICAnXFx1MDEzMSc6ICdpJyxcbiAgJ1xcdTAxMzInOiAnaWonLFxuICAnXFx1MDEzMyc6ICdpaicsXG4gICdcXHUwMTM0JzogJ2onLFxuICAnXFx1MDEzNSc6ICdqJyxcbiAgJ1xcdTAxMzYnOiAnaycsXG4gICdcXHUwMTM3JzogJ2snLFxuICAnXFx1MDEzOCc6ICdrJyxcbiAgJ1xcdTAxMzknOiAnbCcsXG4gICdcXHUwMTNBJzogJ2wnLFxuICAnXFx1MDEzQic6ICdsJyxcbiAgJ1xcdTAxM0MnOiAnbCcsXG4gICdcXHUwMTNEJzogJ2wnLFxuICAnXFx1MDEzRSc6ICdsJyxcbiAgJ1xcdTAxM0YnOiAnbCcsXG4gICdcXHUwMTQwJzogJ2wnLFxuICAnXFx1MDE0MSc6ICdsJyxcbiAgJ1xcdTAxNDInOiAnbCcsXG4gICdcXHUwMTQzJzogJ24nLFxuICAnXFx1MDE0NCc6ICduJyxcbiAgJ1xcdTAxNDUnOiAnbicsXG4gICdcXHUwMTQ2JzogJ24nLFxuICAnXFx1MDE0Nyc6ICduJyxcbiAgJ1xcdTAxNDgnOiAnbicsXG4gICdcXHUwMTQ5JzogJ24nLFxuICAnXFx1MDE0QSc6ICduJyxcbiAgJ1xcdTAxNEInOiAnbicsXG4gICdcXHUwMTRDJzogJ28nLFxuICAnXFx1MDE0RCc6ICdvJyxcbiAgJ1xcdTAxNEUnOiAnbycsXG4gICdcXHUwMTRGJzogJ28nLFxuICAnXFx1MDE1MCc6ICdvJyxcbiAgJ1xcdTAxNTEnOiAnbycsXG4gICdcXHUwMTUyJzogJ29lJyxcbiAgJ1xcdTAxNTMnOiAnb2UnLFxuICAnXFx1MDE1NCc6ICdyJyxcbiAgJ1xcdTAxNTUnOiAncicsXG4gICdcXHUwMTU2JzogJ3InLFxuICAnXFx1MDE1Nyc6ICdyJyxcbiAgJ1xcdTAxNTgnOiAncicsXG4gICdcXHUwMTU5JzogJ3InLFxuICAnXFx1MDE1QSc6ICdzJyxcbiAgJ1xcdTAxNUInOiAncycsXG4gICdcXHUwMTVDJzogJ3MnLFxuICAnXFx1MDE1RCc6ICdzJyxcbiAgJ1xcdTAxNUUnOiAncycsXG4gICdcXHUwMTVGJzogJ3MnLFxuICAnXFx1MDE2MCc6ICdzJyxcbiAgJ1xcdTAxNjEnOiAncycsXG4gICdcXHUwMTYyJzogJ3QnLFxuICAnXFx1MDE2Myc6ICd0JyxcbiAgJ1xcdTAxNjQnOiAndCcsXG4gICdcXHUwMTY1JzogJ3QnLFxuICAnXFx1MDE2Nic6ICd0JyxcbiAgJ1xcdTAxNjcnOiAndCcsXG4gICdcXHUwMTY4JzogJ3UnLFxuICAnXFx1MDE2OSc6ICd1JyxcbiAgJ1xcdTAxNkEnOiAndScsXG4gICdcXHUwMTZCJzogJ3UnLFxuICAnXFx1MDE2Qyc6ICd1JyxcbiAgJ1xcdTAxNkQnOiAndScsXG4gICdcXHUwMTZFJzogJ3UnLFxuICAnXFx1MDE2Ric6ICd1JyxcbiAgJ1xcdTAxNzAnOiAndScsXG4gICdcXHUwMTcxJzogJ3UnLFxuICAnXFx1MDE3Mic6ICd1JyxcbiAgJ1xcdTAxNzMnOiAndScsXG4gICdcXHUwMTc0JzogJ3cnLFxuICAnXFx1MDE3NSc6ICd3JyxcbiAgJ1xcdTAxNzYnOiAneScsXG4gICdcXHUwMTc3JzogJ3knLFxuICAnXFx1MDE3OCc6ICd5JyxcbiAgJ1xcdTAxNzknOiAneicsXG4gICdcXHUwMTdBJzogJ3onLFxuICAnXFx1MDE3Qic6ICd6JyxcbiAgJ1xcdTAxN0MnOiAneicsXG4gICdcXHUwMTdEJzogJ3onLFxuICAnXFx1MDE3RSc6ICd6JyxcbiAgJ1xcdTAxN0YnOiAnc3MnLFxuICAnXFx1MDE5MSc6ICdmJyxcbiAgJ1xcdTAxOTInOiAnZicsXG4gICdcXHUwMjE4JzogJ3MnLFxuICAnXFx1MDIxOSc6ICdzJyxcbiAgJ1xcdTAyMUEnOiAndCcsXG4gICdcXHUwMjFCJzogJ3QnLFxuICAnXFx1MDM4Nic6ICdhJyxcbiAgJ1xcdTAzODgnOiAnZScsXG4gICdcXHUwMzg5JzogJ2knLFxuICAnXFx1MDM4QSc6ICdpJyxcbiAgJ1xcdTAzOEMnOiAnbycsXG4gICdcXHUwMzhFJzogJ3knLFxuICAnXFx1MDM4Ric6ICdvJyxcbiAgJ1xcdTAzOTAnOiAnaScsXG4gICdcXHUwMzkxJzogJ2EnLFxuICAnXFx1MDM5Mic6ICd2JyxcbiAgJ1xcdTAzOTMnOiAnZycsXG4gICdcXHUwMzk0JzogJ2QnLFxuICAnXFx1MDM5NSc6ICdlJyxcbiAgJ1xcdTAzOTYnOiAneicsXG4gICdcXHUwMzk3JzogJ2knLFxuICAnXFx1MDM5OCc6ICd0aCcsXG4gICdcXHUwMzk5JzogJ2knLFxuICAnXFx1MDM5QSc6ICdrJyxcbiAgJ1xcdTAzOUInOiAnbCcsXG4gICdcXHUwMzlDJzogJ20nLFxuICAnXFx1MDM5RCc6ICduJyxcbiAgJ1xcdTAzOUUnOiAneCcsXG4gICdcXHUwMzlGJzogJ28nLFxuICAnXFx1MDNBMCc6ICdwJyxcbiAgJ1xcdTAzQTEnOiAncicsXG4gICdcXHUwM0EzJzogJ3MnLFxuICAnXFx1MDNBNCc6ICd0JyxcbiAgJ1xcdTAzQTUnOiAneScsXG4gICdcXHUwM0E2JzogJ2YnLFxuICAnXFx1MDNBNyc6ICdjaCcsXG4gICdcXHUwM0E4JzogJ3BzJyxcbiAgJ1xcdTAzQTknOiAnbycsXG4gICdcXHUwM0FBJzogJ2knLFxuICAnXFx1MDNBQic6ICd5JyxcbiAgJ1xcdTAzQUMnOiAnYScsXG4gICdcXHUwM0FEJzogJ2UnLFxuICAnXFx1MDNBRSc6ICdpJyxcbiAgJ1xcdTAzQUYnOiAnaScsXG4gICdcXHUwM0IwJzogJ3knLFxuICAnXFx1MDNCMSc6ICdhJyxcbiAgJ1xcdTAzQjInOiAndicsXG4gICdcXHUwM0IzJzogJ2cnLFxuICAnXFx1MDNCNCc6ICdkJyxcbiAgJ1xcdTAzQjUnOiAnZScsXG4gICdcXHUwM0I2JzogJ3onLFxuICAnXFx1MDNCNyc6ICdpJyxcbiAgJ1xcdTAzQjgnOiAndGgnLFxuICAnXFx1MDNCOSc6ICdpJyxcbiAgJ1xcdTAzQkEnOiAnaycsXG4gICdcXHUwM0JCJzogJ2wnLFxuICAnXFx1MDNCQyc6ICdtJyxcbiAgJ1xcdTAzQkQnOiAnbicsXG4gICdcXHUwM0JFJzogJ3gnLFxuICAnXFx1MDNCRic6ICdvJyxcbiAgJ1xcdTAzQzAnOiAncCcsXG4gICdcXHUwM0MxJzogJ3InLFxuICAnXFx1MDNDMic6ICdzJyxcbiAgJ1xcdTAzQzMnOiAncycsXG4gICdcXHUwM0M0JzogJ3QnLFxuICAnXFx1MDNDNSc6ICd5JyxcbiAgJ1xcdTAzQzYnOiAnZicsXG4gICdcXHUwM0M3JzogJ2NoJyxcbiAgJ1xcdTAzQzgnOiAncHMnLFxuICAnXFx1MDNDOSc6ICdvJyxcbiAgJ1xcdTAzQ0EnOiAnaScsXG4gICdcXHUwM0NCJzogJ3knLFxuICAnXFx1MDNDQyc6ICdvJyxcbiAgJ1xcdTAzQ0QnOiAneScsXG4gICdcXHUwM0NFJzogJ28nLFxuICAnXFx1MDNEMSc6ICd0aCcsXG4gICdcXHUwNDAxJzogJ2UnLFxuICAnXFx1MDQwMic6ICdkJyxcbiAgJ1xcdTA0MDMnOiAnZycsXG4gICdcXHUwNDA0JzogJ2UnLFxuICAnXFx1MDQwNSc6ICd6JyxcbiAgJ1xcdTA0MDYnOiAnaScsXG4gICdcXHUwNDA3JzogJ2knLFxuICAnXFx1MDQwOCc6ICdqJyxcbiAgJ1xcdTA0MDknOiAnbCcsXG4gICdcXHUwNDBBJzogJ24nLFxuICAnXFx1MDQwQic6ICdjJyxcbiAgJ1xcdTA0MEMnOiAnaycsXG4gICdcXHUwNDBFJzogJ3UnLFxuICAnXFx1MDQwRic6ICdkJyxcbiAgJ1xcdTA0MTAnOiAnYScsXG4gICdcXHUwNDExJzogJ2InLFxuICAnXFx1MDQxMic6ICd2JyxcbiAgJ1xcdTA0MTMnOiAnZycsXG4gICdcXHUwNDE0JzogJ2QnLFxuICAnXFx1MDQxNSc6ICdlJyxcbiAgJ1xcdTA0MTYnOiAneicsXG4gICdcXHUwNDE3JzogJ3onLFxuICAnXFx1MDQxOCc6ICdpJyxcbiAgJ1xcdTA0MTknOiAnaicsXG4gICdcXHUwNDFBJzogJ2snLFxuICAnXFx1MDQxQic6ICdsJyxcbiAgJ1xcdTA0MUMnOiAnbScsXG4gICdcXHUwNDFEJzogJ24nLFxuICAnXFx1MDQxRSc6ICdvJyxcbiAgJ1xcdTA0MUYnOiAncCcsXG4gICdcXHUwNDIwJzogJ3InLFxuICAnXFx1MDQyMSc6ICdzJyxcbiAgJ1xcdTA0MjInOiAndCcsXG4gICdcXHUwNDIzJzogJ3UnLFxuICAnXFx1MDQyNCc6ICdmJyxcbiAgJ1xcdTA0MjUnOiAnaCcsXG4gICdcXHUwNDI2JzogJ2MnLFxuICAnXFx1MDQyNyc6ICdjJyxcbiAgJ1xcdTA0MjgnOiAncycsXG4gICdcXHUwNDI5JzogJ3MnLFxuICAnXFx1MDQyQic6ICd5JyxcbiAgJ1xcdTA0MkQnOiAnZScsXG4gICdcXHUwNDJFJzogJ3UnLFxuICAnXFx1MDQyRic6ICdhJyxcbiAgJ1xcdTA0MzAnOiAnYScsXG4gICdcXHUwNDMxJzogJ2InLFxuICAnXFx1MDQzMic6ICd2JyxcbiAgJ1xcdTA0MzMnOiAnZycsXG4gICdcXHUwNDM0JzogJ2QnLFxuICAnXFx1MDQzNSc6ICdlJyxcbiAgJ1xcdTA0MzYnOiAneicsXG4gICdcXHUwNDM3JzogJ3onLFxuICAnXFx1MDQzOCc6ICdpJyxcbiAgJ1xcdTA0MzknOiAnaicsXG4gICdcXHUwNDNBJzogJ2snLFxuICAnXFx1MDQzQic6ICdsJyxcbiAgJ1xcdTA0M0MnOiAnbScsXG4gICdcXHUwNDNEJzogJ24nLFxuICAnXFx1MDQzRSc6ICdvJyxcbiAgJ1xcdTA0M0YnOiAncCcsXG4gICdcXHUwNDQwJzogJ3InLFxuICAnXFx1MDQ0MSc6ICdzJyxcbiAgJ1xcdTA0NDInOiAndCcsXG4gICdcXHUwNDQzJzogJ3UnLFxuICAnXFx1MDQ0NCc6ICdmJyxcbiAgJ1xcdTA0NDUnOiAnaCcsXG4gICdcXHUwNDQ2JzogJ2MnLFxuICAnXFx1MDQ0Nyc6ICdjJyxcbiAgJ1xcdTA0NDgnOiAncycsXG4gICdcXHUwNDQ5JzogJ3MnLFxuICAnXFx1MDQ0Qic6ICd5JyxcbiAgJ1xcdTA0NEQnOiAnZScsXG4gICdcXHUwNDRFJzogJ3UnLFxuICAnXFx1MDQ0Ric6ICdhJyxcbiAgJ1xcdTA0NTEnOiAnZScsXG4gICdcXHUwNDUyJzogJ2QnLFxuICAnXFx1MDQ1Myc6ICdnJyxcbiAgJ1xcdTA0NTQnOiAnZScsXG4gICdcXHUwNDU1JzogJ3onLFxuICAnXFx1MDQ1Nic6ICdpJyxcbiAgJ1xcdTA0NTcnOiAnaScsXG4gICdcXHUwNDU4JzogJ2onLFxuICAnXFx1MDQ1OSc6ICdsJyxcbiAgJ1xcdTA0NUEnOiAnbicsXG4gICdcXHUwNDVCJzogJ2MnLFxuICAnXFx1MDQ1Qyc6ICdrJyxcbiAgJ1xcdTA0NUUnOiAndScsXG4gICdcXHUwNDVGJzogJ2QnLFxuICAnXFx1MDQ2Mic6ICdlJyxcbiAgJ1xcdTA0NjMnOiAnZScsXG4gICdcXHUwNDZBJzogJ2EnLFxuICAnXFx1MDQ2Qic6ICdhJyxcbiAgJ1xcdTA0NzInOiAnZicsXG4gICdcXHUwNDczJzogJ2YnLFxuICAnXFx1MDQ3NCc6ICd5JyxcbiAgJ1xcdTA0NzUnOiAneScsXG4gICdcXHUwNDkwJzogJ2cnLFxuICAnXFx1MDQ5MSc6ICdnJyxcbiAgJ1xcdTA0OTInOiAnZycsXG4gICdcXHUwNDkzJzogJ2cnLFxuICAnXFx1MDQ5NCc6ICdnJyxcbiAgJ1xcdTA0OTUnOiAnZycsXG4gICdcXHUwNDk2JzogJ3onLFxuICAnXFx1MDQ5Nyc6ICd6JyxcbiAgJ1xcdTA0OUEnOiAnaycsXG4gICdcXHUwNDlCJzogJ2snLFxuICAnXFx1MDQ5Qyc6ICdrJyxcbiAgJ1xcdTA0OUQnOiAnaycsXG4gICdcXHUwNDlFJzogJ2snLFxuICAnXFx1MDQ5Ric6ICdrJyxcbiAgJ1xcdTA0QTAnOiAnaycsXG4gICdcXHUwNEExJzogJ2snLFxuICAnXFx1MDRBMic6ICduJyxcbiAgJ1xcdTA0QTMnOiAnbicsXG4gICdcXHUwNEE0JzogJ24nLFxuICAnXFx1MDRBNSc6ICduJyxcbiAgJ1xcdTA0QTYnOiAncCcsXG4gICdcXHUwNEE3JzogJ3AnLFxuICAnXFx1MDRBOCc6ICdvJyxcbiAgJ1xcdTA0QTknOiAnbycsXG4gICdcXHUwNEFBJzogJ3MnLFxuICAnXFx1MDRBQic6ICdzJyxcbiAgJ1xcdTA0QUMnOiAndCcsXG4gICdcXHUwNEFEJzogJ3QnLFxuICAnXFx1MDRBRSc6ICd1JyxcbiAgJ1xcdTA0QUYnOiAndScsXG4gICdcXHUwNEIwJzogJ3UnLFxuICAnXFx1MDRCMSc6ICd1JyxcbiAgJ1xcdTA0QjInOiAnaCcsXG4gICdcXHUwNEIzJzogJ2gnLFxuICAnXFx1MDRCNCc6ICdjJyxcbiAgJ1xcdTA0QjUnOiAnYycsXG4gICdcXHUwNEI2JzogJ2MnLFxuICAnXFx1MDRCNyc6ICdjJyxcbiAgJ1xcdTA0QjgnOiAnYycsXG4gICdcXHUwNEI5JzogJ2MnLFxuICAnXFx1MDRCQSc6ICdoJyxcbiAgJ1xcdTA0QkInOiAnaCcsXG4gICdcXHUwNEJDJzogJ2MnLFxuICAnXFx1MDRCRCc6ICdjJyxcbiAgJ1xcdTA0QkUnOiAnYycsXG4gICdcXHUwNEJGJzogJ2MnLFxuICAnXFx1MDRDMSc6ICd6JyxcbiAgJ1xcdTA0QzInOiAneicsXG4gICdcXHUwNEMzJzogJ2snLFxuICAnXFx1MDRDNCc6ICdrJyxcbiAgJ1xcdTA0QzUnOiAnbCcsXG4gICdcXHUwNEM2JzogJ2wnLFxuICAnXFx1MDRDNyc6ICduJyxcbiAgJ1xcdTA0QzgnOiAnbicsXG4gICdcXHUwNEM5JzogJ24nLFxuICAnXFx1MDRDQSc6ICduJyxcbiAgJ1xcdTA0Q0InOiAnYycsXG4gICdcXHUwNENDJzogJ2MnLFxuICAnXFx1MDREMCc6ICdhJyxcbiAgJ1xcdTA0RDEnOiAnYScsXG4gICdcXHUwNEQyJzogJ2EnLFxuICAnXFx1MDREMyc6ICdhJyxcbiAgJ1xcdTA0RDQnOiAnYWUnLFxuICAnXFx1MDRENSc6ICdhZScsXG4gICdcXHUwNEQ2JzogJ2UnLFxuICAnXFx1MDRENyc6ICdlJyxcbiAgJ1xcdTA0RDgnOiAnYScsXG4gICdcXHUwNEQ5JzogJ2EnLFxuICAnXFx1MDREQSc6ICdhJyxcbiAgJ1xcdTA0REInOiAnYScsXG4gICdcXHUwNERDJzogJ3onLFxuICAnXFx1MDRERCc6ICd6JyxcbiAgJ1xcdTA0REUnOiAneicsXG4gICdcXHUwNERGJzogJ3onLFxuICAnXFx1MDRFMCc6ICd6JyxcbiAgJ1xcdTA0RTEnOiAneicsXG4gICdcXHUwNEUyJzogJ2knLFxuICAnXFx1MDRFMyc6ICdpJyxcbiAgJ1xcdTA0RTQnOiAnaScsXG4gICdcXHUwNEU1JzogJ2knLFxuICAnXFx1MDRFNic6ICdvJyxcbiAgJ1xcdTA0RTcnOiAnbycsXG4gICdcXHUwNEU4JzogJ28nLFxuICAnXFx1MDRFOSc6ICdvJyxcbiAgJ1xcdTA0RUEnOiAnbycsXG4gICdcXHUwNEVCJzogJ28nLFxuICAnXFx1MDRFRSc6ICd1JyxcbiAgJ1xcdTA0RUYnOiAndScsXG4gICdcXHUwNEYwJzogJ3UnLFxuICAnXFx1MDRGMSc6ICd1JyxcbiAgJ1xcdTA0RjInOiAndScsXG4gICdcXHUwNEYzJzogJ3UnLFxuICAnXFx1MDRGNCc6ICdjJyxcbiAgJ1xcdTA0RjUnOiAnYycsXG4gICdcXHUwNEY4JzogJ3knLFxuICAnXFx1MDRGOSc6ICd5JyxcbiAgJ1xcdTA1MEEnOiAnbicsXG4gICdcXHUwNTBCJzogJ24nLFxuICAnXFx1MDUwRSc6ICd0JyxcbiAgJ1xcdTA1MEYnOiAndCcsXG4gICdcXHUwNTFBJzogJ3EnLFxuICAnXFx1MDUxQic6ICdxJyxcbiAgJ1xcdTA1MUMnOiAndycsXG4gICdcXHUwNTFEJzogJ3cnLFxufTtcbiIsCiAgICAiLyoqXG4gKiBTdHJpbmcgdXRpbGl0aWVzXG4gKi9cblxuaW1wb3J0IHsgc3BlY2lhbENoYXJNYXAgfSBmcm9tICcuL3RhYmxlL2NoYXItdGFibGUnO1xuXG4vKipcbiAqIENvbnZlcnQgc3RyaW5nIHRvIFVuaXggZm9ybWF0XG4gKlxuICogUGVyZm9ybXMgY29udmVyc2lvbiBmb2xsb3dpbmcgbGVnYWN5IHdpa2lkb3QgaW1wbGVtZW50YXRpb24uXG4gKiAtIENvbnZlcnRzIHNwZWNpYWwgY2hhcmFjdGVycyB0byBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAtIENvbnZlcnRzIHRvIGxvd2VyY2FzZVxuICogLSBDb252ZXJ0cyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBoeXBoZW5zXG4gKiAtIFJlZHVjZXMgY29uc2VjdXRpdmUgaHlwaGVucy9jb2xvbnMgdG8gc2luZ2xlXG4gKiAtIFJlbW92ZXMgbGVhZGluZy90cmFpbGluZyBoeXBoZW5zL2NvbG9uc1xuICpcbiAqIEBwYXJhbSB0YXJnZXRTdHIgLSBTdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybnMgQ29udmVydGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Vbml4KHRhcmdldFN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ29udmVydCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdGFyZ2V0U3RyKSB7XG4gICAgY29uc3QgbWFwcGVkID0gc3BlY2lhbENoYXJNYXBbY2hhcl07XG4gICAgcmVzdWx0ICs9IG1hcHBlZCAhPT0gdW5kZWZpbmVkID8gbWFwcGVkIDogY2hhcjtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gIHJlc3VsdCA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIFJlbW92ZSBub24tQVNDSUkgY2hhcmFjdGVyc1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvW15hLXowLTlcXC06X10vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL15fLywgJzpfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8oPzwhOilfL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eLSovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tKiQvLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tezIsfS9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOnsyLH0vZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzotL2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tOi9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXy0vZywgJ18nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLy1fL2csICdfJyk7XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNvbG9uc1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXjovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86JC8sICcnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZ1V0aWwgY2xhc3MgKFB5dGhvbiBjb21wYXRpYmxlKVxuICovXG5leHBvcnQgY29uc3QgU3RyaW5nVXRpbCA9IHtcbiAgdG9Vbml4LFxufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcblxuLyoqXG4gKiBVc2VyIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8VXNlciB8IG51bGw+IHtcbiAgY29uc3RydWN0b3IodXNlcnM/OiAoVXNlciB8IG51bGwpW10pIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh1c2Vycykge1xuICAgICAgdGhpcy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VybmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFVzZXIgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyTmFtZSkge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IHVzZXIgSURcbiAgICogQHBhcmFtIGlkIC0gVXNlciBJRFxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdXNlciBvZiB0aGlzKSB7XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gb25seSBub24tbnVsbCB1c2Vyc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBub24tbnVsbCB1c2Vyc1xuICAgKi9cbiAgZmlsdGVyTm9uTnVsbCgpOiBVc2VyW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcigodXNlcik6IHVzZXIgaXMgVXNlciA9PiB1c2VyICE9PSBudWxsKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHBMaW1pdCBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgdG9Vbml4IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJpbmctdXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5pbXBvcnQgeyBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4vdXNlci1jb2xsZWN0aW9uJztcblxuLyoqXG4gKiBVc2VyIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRGF0YSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBhdmF0YXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICB1bml4TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWd1bGFyIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERpc3BsYXkgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIElQIGFkZHJlc3MgKG51bGwgZm9yIHJlZ3VsYXIgdXNlcnMpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3VzZXInO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmLCBkYXRhOiBVc2VyRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGF0YS5kaXNwbGF5TmFtZSA/PyBudWxsO1xuICAgIHRoaXMuYXZhdGFyVXJsID0gZGF0YS5hdmF0YXJVcmwgPz8gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7ZGF0YS5pZH1gO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lID8/IHRvVW5peChkYXRhLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGZyb20gdXNlcm5hbWVcbiAgICogQHBhcmFtIGNsaWVudCAtIENsaWVudFxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFVzZXIgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgc3RhdGljIGZyb21OYW1lKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB1bml4TmFtZSA9IHRvVW5peChuYW1lKTtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL3VzZXI6aW5mby8ke3VuaXhOYW1lfWA7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbywgQ2hlZXJpb0FQSSB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSwgRWxlbWVudCB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBGb3J1bVRocmVhZFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuXG4vKipcbiAqIEZvcnVtIHBvc3QgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcnVtUG9zdERhdGEge1xuICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIGVkaXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgZWRpdGVkQXQ/OiBEYXRlIHwgbnVsbDtcbiAgcGFyZW50SWQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtUG9zdCB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50OiBFbGVtZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHJpdmF0ZSBfcGFyZW50SWQ6IG51bWJlciB8IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JldmlzaW9uczogRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1Qb3N0RGF0YSkge1xuICAgIHRoaXMudGhyZWFkID0gZGF0YS50aHJlYWQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xuICAgIHRoaXMuZWxlbWVudCA9IGRhdGEuZWxlbWVudDtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5lZGl0ZWRCeSA9IGRhdGEuZWRpdGVkQnkgPz8gbnVsbDtcbiAgICB0aGlzLmVkaXRlZEF0ID0gZGF0YS5lZGl0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuX3BhcmVudElkID0gZGF0YS5wYXJlbnRJZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcmVudCBwb3N0IElEXG4gICAqL1xuICBnZXQgcGFyZW50SWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtRWRpdFBvc3RGb3JtTW9kdWxlJyxcbiAgICAgICAgICAgIHRocmVhZElkOiB0aGlzLnRocmVhZC5pZCxcbiAgICAgICAgICAgIHBvc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpKTtcbiAgICAgICAgY29uc3Qgc291cmNlRWxlbSA9ICQoXCJ0ZXh0YXJlYVtuYW1lPSdzb3VyY2UnXVwiKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgdGV4dGFyZWEgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBlZGl0IHBvc3Q6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QgaGFzIGJlZW4gZWRpdGVkIChoYXMgcmV2aXNpb25zKVxuICAgKi9cbiAgZ2V0IGhhc1JldmlzaW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0ZWRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCByZXZpc2lvbnMgKGVkaXQgaGlzdG9yeSlcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcmV2aXNpb25zICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldmlzaW9ucyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5hY3F1aXJlQWxsKHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdChpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBwb3N0IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtUG9zdENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVBvc3Q+IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG5cbiAgY29uc3RydWN0b3IodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgcG9zdHM/OiBGb3J1bVBvc3RbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50aHJlYWQgPSB0aHJlYWQ7XG4gICAgaWYgKHBvc3RzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucG9zdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFBvc3QgSURcbiAgICogQHJldHVybnMgUG9zdCAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBGb3J1bVBvc3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHBvc3QpID0+IHBvc3QuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBwb3N0cyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZSh0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLCAkOiBDaGVlcmlvQVBJKTogRm9ydW1Qb3N0W10ge1xuICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgJCgnZGl2LnBvc3QnKS5lYWNoKChfaSwgcG9zdEVsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRwb3N0ID0gJChwb3N0RWxlbSk7XG4gICAgICBjb25zdCBwb3N0SWRBdHRyID0gJHBvc3QuYXR0cignaWQnKTtcbiAgICAgIGlmICghcG9zdElkQXR0cikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwb3N0SWQgPSBOdW1iZXIucGFyc2VJbnQocG9zdElkQXR0ci5yZXBsYWNlKCdwb3N0LScsICcnKSwgMTApO1xuICAgICAgaWYgKE51bWJlci5pc05hTihwb3N0SWQpKSByZXR1cm47XG5cbiAgICAgIC8vIEdldCBwYXJlbnQgcG9zdCBJRFxuICAgICAgbGV0IHBhcmVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0ICRwYXJlbnRDb250YWluZXIgPSAkcG9zdC5wYXJlbnQoKTtcbiAgICAgIGlmICgkcGFyZW50Q29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgJGdyYW5kcGFyZW50ID0gJHBhcmVudENvbnRhaW5lci5wYXJlbnQoKTtcbiAgICAgICAgaWYgKCRncmFuZHBhcmVudC5sZW5ndGggPiAwICYmICRncmFuZHBhcmVudFswXT8ubmFtZSAhPT0gJ2JvZHknKSB7XG4gICAgICAgICAgY29uc3QgZ3JhbmRwYXJlbnRDbGFzc2VzID0gJGdyYW5kcGFyZW50LmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgaWYgKGdyYW5kcGFyZW50Q2xhc3Nlcy5pbmNsdWRlcygncG9zdC1jb250YWluZXInKSkge1xuICAgICAgICAgICAgY29uc3QgJHBhcmVudFBvc3QgPSAkZ3JhbmRwYXJlbnQuZmluZCgnPiBkaXYucG9zdCcpO1xuICAgICAgICAgICAgaWYgKCRwYXJlbnRQb3N0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50UG9zdElkQXR0ciA9ICRwYXJlbnRQb3N0LmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICAgIGlmIChwYXJlbnRQb3N0SWRBdHRyKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50SWQgPSBOdW1iZXIucGFyc2VJbnQocGFyZW50UG9zdElkQXR0ci5yZXBsYWNlKCdwb3N0LScsICcnKSwgMTApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aXRsZSBhbmQgY29udGVudFxuICAgICAgY29uc3QgJHdyYXBwZXIgPSAkcG9zdC5maW5kKCdkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5oZWFkJyk7XG4gICAgICBpZiAoJGhlYWQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0ICR0aXRsZSA9ICRoZWFkLmZpbmQoJ2Rpdi50aXRsZScpO1xuICAgICAgY29uc3QgdGl0bGUgPSAkdGl0bGUudGV4dCgpLnRyaW0oKTtcblxuICAgICAgY29uc3QgJGNvbnRlbnQgPSAkd3JhcHBlci5maW5kKCdkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnZGl2LmluZm8nKTtcbiAgICAgIGlmICgkaW5mby5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJGluZm8uZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgIGlmICgkdXNlckVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcih0aHJlYWQuc2l0ZS5jbGllbnQgYXMgQ2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkaW5mby5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICBpZiAoJG9kYXRlRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgIC8vIEVkaXQgaW5mbyAoaWYgZXhpc3RzKVxuICAgICAgbGV0IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCBlZGl0ZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgJGNoYW5nZXMgPSAkd3JhcHBlci5maW5kKCdkaXYuY2hhbmdlcycpO1xuICAgICAgaWYgKCRjaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgJGVkaXRVc2VyRWxlbSA9ICRjaGFuZ2VzLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgIGNvbnN0ICRlZGl0T2RhdGVFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICBpZiAoJGVkaXRVc2VyRWxlbS5sZW5ndGggPiAwICYmICRlZGl0T2RhdGVFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlZGl0ZWRCeSA9IHBhcnNlVXNlcih0aHJlYWQuc2l0ZS5jbGllbnQgYXMgQ2xpZW50LCAkZWRpdFVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgIGVkaXRlZEF0ID0gcGFyc2VPZGF0ZSgkZWRpdE9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwb3N0cy5wdXNoKFxuICAgICAgICBuZXcgRm9ydW1Qb3N0KHtcbiAgICAgICAgICB0aHJlYWQsXG4gICAgICAgICAgaWQ6IHBvc3RJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGVsZW1lbnQ6IHBvc3RFbGVtIGFzIEVsZW1lbnQsXG4gICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICBlZGl0ZWRCeSxcbiAgICAgICAgICBlZGl0ZWRBdCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcG9zdHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBpbiBhIHRocmVhZFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJblRocmVhZCh0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86ICcxJyxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICBwb3N0cy5wdXNoKC4uLkZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJGZpcnN0KSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCAkcGFnZXIgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAoJHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICRwYWdlclRhcmdldHMgPSAkcGFnZXIuZmluZCgnc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgaWYgKCRwYWdlclRhcmdldHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBsYXN0IHBhZ2UgbnVtYmVyIGZyb20gc2Vjb25kIHRvIGxhc3QgcGFnZSBsaW5rXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRwYWdlclRhcmdldHNcbiAgICAgICAgICAuZXEoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyKVxuICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IG1vZHVsZU5hbWU6IHN0cmluZzsgcGFnZU5vOiBzdHJpbmc7IHQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gbGFzdFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86IFN0cmluZyhwYWdlKSxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCB0aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBwb3N0cy5wdXNoKC4uLkZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbyB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgRm9ydW1DYXRlZ29yeSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuaW1wb3J0IHsgRm9ydW1Qb3N0Q29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdCc7XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bVRocmVhZERhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcG9zdENvdW50OiBudW1iZXI7XG4gIGNhdGVnb3J5PzogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZCB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgcG9zdENvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG4gIHByaXZhdGUgX3Bvc3RzOiBGb3J1bVBvc3RDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1UaHJlYWREYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnBvc3RDb3VudCA9IGRhdGEucG9zdENvdW50O1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS9mb3J1bS90LSR7dGhpcy5pZH0vYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCBsaXN0XG4gICAqL1xuICBnZXRQb3N0cygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9wb3N0cyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9wb3N0cyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBseSB0byB0aHJlYWRcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVwbHkoXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBwYXJlbnRQb3N0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJlYWRJZDogU3RyaW5nKHRoaXMuaWQpLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHBhcmVudFBvc3RJZCAhPT0gbnVsbCA/IFN0cmluZyhwYXJlbnRQb3N0SWQpIDogJycsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVBvc3QnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3N0Q291bnQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVwbHk6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1UaHJlYWQoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgYnkgSURcbiAgICovXG4gIHN0YXRpYyBnZXRGcm9tSWQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZDogbnVtYmVyLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0sIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVRocmVhZD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCB0aHJlYWRzPzogRm9ydW1UaHJlYWRbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAodGhyZWFkcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnRocmVhZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1UaHJlYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHRocmVhZCkgPT4gdGhyZWFkLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aHJlYWRzIGluIGNhdGVnb3J5XG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluQ2F0ZWdvcnkoY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwOiAxLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICAkZmlyc3QoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkZmlyc3QoZWxlbSk7XG4gICAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJHJvdy5maW5kKCdkaXYudGl0bGUgYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgIGlmICghdGhyZWFkSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICRyb3cuZmluZCgnZGl2LmRlc2NyaXB0aW9uJykudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgJHVzZXJFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZTogY2F0ZWdvcnkuc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9IHBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VMaW5rID0gcGFnZXJMaW5rc1twYWdlckxpbmtzLmxlbmd0aCAtIDJdO1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSBsYXN0UGFnZUxpbmsgPyAkZmlyc3QobGFzdFBhZ2VMaW5rKS50ZXh0KCkudHJpbSgpIDogJzEnO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IHA6IG51bWJlcjsgYzogbnVtYmVyOyBtb2R1bGVOYW1lOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBwOiBwYWdlLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBjYXRlZ29yeS5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgJCgndGFibGUudGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWRNYXRjaCA9IGhyZWYubWF0Y2goL3QtKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgICAvLyBQYXJzZSB1c2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9XG4gICAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gKHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgRm9ydW1UaHJlYWQoe1xuICAgICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHRocmVhZCBieSB0aHJlYWQgSURcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0aHJlYWRJZCAtIFRocmVhZCBJRFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChzaXRlOiBTaXRlLCB0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZWFkID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXRocmVhZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgVGhyZWFkIG5vdCBmb3VuZDogJHt0aHJlYWRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRzIGJ5IHRocmVhZCBJRHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlRnJvbVRocmVhZElkcyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIHRocmVhZElkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRocmVhZElkcy5tYXAoKHRocmVhZElkKSA9PiAoe1xuICAgICAgICAgICAgdDogdGhyZWFkSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkTW9kdWxlJyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRzOiBGb3J1bVRocmVhZFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZElkc1tpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICF0aHJlYWRJZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICAvLyBQYXJzZSB0aHJlYWQgaW5mbyBmcm9tIHBhZ2VcbiAgICAgICAgICBjb25zdCBiY0VsZW0gPSAkKCdkaXYuZm9ydW0tYnJlYWRjcnVtYnMnKTtcbiAgICAgICAgICBpZiAoYmNFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdCcmVhZGNydW1icyBub3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmNQYXJ0cyA9IGJjRWxlbS50ZXh0KCkuc3BsaXQoJ8K7Jyk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBiY1BhcnRzLmxlbmd0aCA+IDAgPyAoYmNQYXJ0c1tiY1BhcnRzLmxlbmd0aCAtIDFdPy50cmltKCkgPz8gJycpIDogJyc7XG5cbiAgICAgICAgICBjb25zdCBkZXNjQmxvY2tFbGVtID0gJCgnZGl2LmRlc2NyaXB0aW9uLWJsb2NrJyk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjQmxvY2tFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0Q291bnRNYXRjaCA9ICQoJ2Rpdi5zdGF0aXN0aWNzJykudGV4dCgpLm1hdGNoKC8oXFxkKykvKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBwb3N0Q291bnRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHBvc3RDb3VudE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeTogbnVsbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oc2l0ZSwgdGhyZWFkcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSB0aHJlYWRzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIH0gZnJvbSAnLi9mb3J1bS10aHJlYWQnO1xuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bUNhdGVnb3J5RGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwb3N0c0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQ2F0ZWdvcnkge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zdHNDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF90aHJlYWRzOiBGb3J1bVRocmVhZENvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bUNhdGVnb3J5RGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnRocmVhZHNDb3VudCA9IGRhdGEudGhyZWFkc0NvdW50O1xuICAgIHRoaXMucG9zdHNDb3VudCA9IGRhdGEucG9zdHNDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGxpc3RcbiAgICovXG4gIGdldFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl90aHJlYWRzICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3RocmVhZHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZENvbGxlY3Rpb24uYWNxdWlyZUFsbEluQ2F0ZWdvcnkodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aHJlYWRzID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWFkcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhyZWFkIGxpc3RcbiAgICovXG4gIHJlbG9hZFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMuX3RocmVhZHMgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmdldFRocmVhZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNyZWF0ZVRocmVhZChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ25ld1RocmVhZCcsXG4gICAgICAgICAgICBjYXRlZ29yeV9pZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLnRocmVhZElkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVGhyZWFkIElEIG5vdCBmb3VuZCBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXNwb25zZS50aHJlYWRJZCBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkLCB0aGlzKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1DYXRlZ29yeShpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiBleHRlbmRzIEFycmF5PEZvcnVtQ2F0ZWdvcnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgY2F0ZWdvcmllcz86IEZvcnVtQ2F0ZWdvcnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAoY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5wdXNoKC4uLmNhdGVnb3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1DYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciBhIHNpdGVcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsKHNpdGU6IFNpdGUpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVN0YXJ0TW9kdWxlJyxcbiAgICAgICAgICAgIGhpZGRlbjogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzOiBGb3J1bUNhdGVnb3J5W10gPSBbXTtcblxuICAgICAgICAkKCd0YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKHJvdyk7XG4gICAgICAgICAgY29uc3QgbmFtZUVsZW0gPSAkcm93LmZpbmQoJ3RkLm5hbWUnKTtcbiAgICAgICAgICBjb25zdCBuYW1lTGlua0VsZW0gPSBuYW1lRWxlbS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IG5hbWVMaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkTWF0Y2ggPSBocmVmLm1hdGNoKC9jLShcXGQrKS8pO1xuICAgICAgICAgIGlmICghY2F0ZWdvcnlJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBOdW1iZXIucGFyc2VJbnQoY2F0ZWdvcnlJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBuYW1lTGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IG5hbWVFbGVtLmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgdGhyZWFkc0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQudGhyZWFkcycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuICAgICAgICAgIGNvbnN0IHBvc3RzQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtQ2F0ZWdvcnkoe1xuICAgICAgICAgICAgICBzaXRlLFxuICAgICAgICAgICAgICBpZDogY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0aHJlYWRzQ291bnQsXG4gICAgICAgICAgICAgIHBvc3RzQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24oc2l0ZSwgY2F0ZWdvcmllcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBjYXRlZ29yaWVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgdHlwZSBGb3J1bUNhdGVnb3J5RGF0YSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuZXhwb3J0IHsgRm9ydW1Qb3N0LCBGb3J1bVBvc3RDb2xsZWN0aW9uLCB0eXBlIEZvcnVtUG9zdERhdGEgfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuZXhwb3J0IHtcbiAgRm9ydW1Qb3N0UmV2aXNpb24sXG4gIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbixcbiAgdHlwZSBGb3J1bVBvc3RSZXZpc2lvbkRhdGEsXG59IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5leHBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLCB0eXBlIEZvcnVtVGhyZWFkRGF0YSB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcbiIsCiAgICAiLy8gQ29tbW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL3R5cGVzJztcblxuLy8gQ29ubmVjdG9yXG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rvcic7XG5cbi8vIE1vZHVsZVxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuXG4vLyBVdGlsXG5leHBvcnQgKiBmcm9tICcuL3V0aWwnO1xuIiwKICAgICJpbXBvcnQga3ksIHsgdHlwZSBLeUluc3RhbmNlIH0gZnJvbSAna3knO1xuaW1wb3J0IHBMaW1pdCwgeyB0eXBlIExpbWl0RnVuY3Rpb24gfSBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7XG4gIEFNQ0h0dHBFcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZXNwb25zZURhdGFFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90RXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICB0eXBlIEFNQ0NvbmZpZyxcbiAgREVGQVVMVF9BTUNfQ09ORklHLFxuICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUsXG4gIFdJS0lET1RfVE9LRU43LFxufSBmcm9tICcuL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmltcG9ydCB7IHR5cGUgQU1DUmVxdWVzdEJvZHksIHR5cGUgQU1DUmVzcG9uc2UsIGFtY1Jlc3BvbnNlU2NoZW1hIH0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuXG4vKipcbiAqIE1hc2sgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgbG9nZ2luZylcbiAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5IHRvIG1hc2tcbiAqIEByZXR1cm5zIE1hc2tlZCBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2Vuc2l0aXZlRGF0YShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFza2VkID0geyAuLi5ib2R5IH07XG4gIGNvbnN0IHNlbnNpdGl2ZUtleXMgPSBbJ3Bhc3N3b3JkJywgJ2xvZ2luJywgJ1dJS0lET1RfU0VTU0lPTl9JRCcsICd3aWtpZG90X3Rva2VuNyddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzZW5zaXRpdmVLZXlzKSB7XG4gICAgaWYgKGtleSBpbiBtYXNrZWQpIHtcbiAgICAgIG1hc2tlZFtrZXldID0gJyoqKk1BU0tFRCoqKic7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXNrZWQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgaW50ZXJ2YWwgKHdpdGggaml0dGVyKVxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBDdXJyZW50IHJldHJ5IGNvdW50IChzdGFydHMgZnJvbSAxKVxuICogQHBhcmFtIGJhc2VJbnRlcnZhbCAtIEJhc2UgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gQmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBDYWxjdWxhdGVkIGJhY2tvZmYgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZihcbiAgcmV0cnlDb3VudDogbnVtYmVyLFxuICBiYXNlSW50ZXJ2YWw6IG51bWJlcixcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyLFxuICBtYXhCYWNrb2ZmOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBiYXNlSW50ZXJ2YWwgKiBiYWNrb2ZmRmFjdG9yICoqIChyZXRyeUNvdW50IC0gMSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBiYWNrb2ZmICogMC4xO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiArIGppdHRlciwgbWF4QmFja29mZik7XG59XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBkdXJhdGlvblxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQU1DIHJlcXVlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KSAqL1xuICBzaXRlTmFtZT86IHN0cmluZztcbiAgLyoqIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpICovXG4gIHNzbFN1cHBvcnRlZD86IGJvb2xlYW47XG4gIC8qKiBJbmNsdWRlIGVycm9ycyBpbiByZXN1bHRzIGluc3RlYWQgb2YgdGhyb3dpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByZXR1cm5FeGNlcHRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY2xpZW50XG4gKiBNYW5hZ2VzIHJlcXVlc3RzIHRvIFdpa2lkb3QgQU1DIGVuZHBvaW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNDbGllbnQge1xuICAvKioga3kgaW5zdGFuY2UgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBreTogS3lJbnN0YW5jZTtcblxuICAvKiogQ29uY3VycmVudCByZXF1ZXN0IGxpbWl0ZXIgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaW1pdDogTGltaXRGdW5jdGlvbjtcblxuICAvKiogSGVhZGVyIG1hbmFnZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcjogQU1DSGVhZGVyO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IEFNQ0NvbmZpZztcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0wgc3VwcG9ydCBzdGF0dXMgY2FjaGUgKi9cbiAgcHJpdmF0ZSBzc2xDYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyBkZWZhdWx0cyBpZiBvbWl0dGVkKVxuICAgKiBAcGFyYW0gZG9tYWluIC0gQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEFNQ0NvbmZpZz4gPSB7fSwgZG9tYWluID0gJ3dpa2lkb3QuY29tJykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0FNQ19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuaGVhZGVyID0gbmV3IEFNQ0hlYWRlcigpO1xuICAgIHRoaXMubGltaXQgPSBwTGltaXQodGhpcy5jb25maWcuc2VtYXBob3JlTGltaXQpO1xuXG4gICAgdGhpcy5reSA9IGt5LmNyZWF0ZSh7XG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgcmV0cnk6IDAsIC8vIE1hbnVhbCByZXRyeSBjb250cm9sXG4gICAgfSk7XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIHRoaXMuc3NsQ2FjaGUuc2V0KCd3d3cnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzaXRlIGV4aXN0ZW5jZSBhbmQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZVxuICAgKiBAcmV0dXJucyBTU0wgc3VwcG9ydCBzdGF0dXMgKHRydWU6IEhUVFBTLCBmYWxzZTogSFRUUClcbiAgICovXG4gIGNoZWNrU2l0ZVNTTChzaXRlTmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPGJvb2xlYW4+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGV4aXN0c1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3NsQ2FjaGUuZ2V0KHNpdGVOYW1lKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIGlmIChzaXRlTmFtZSA9PT0gJ3d3dycpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmModHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgcmVkaXJlY3Q6ICdtYW51YWwnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyA0MDQgbWVhbnMgc2l0ZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgaXMgbm90IGZvdW5kOiAke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU1NMIHN1cHBvcnRlZCBpZiAzMDEgcmVkaXJlY3QgdG8gaHR0cHNcbiAgICAgICAgY29uc3QgaXNTU0wgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gMzAxICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpPy5zdGFydHNXaXRoKCdodHRwcycpID09PSB0cnVlO1xuXG4gICAgICAgIC8vIFNhdmUgdG8gY2FjaGVcbiAgICAgICAgdGhpcy5zc2xDYWNoZS5zZXQoc2l0ZU5hbWUsIGlzU1NMKTtcbiAgICAgICAgcmV0dXJuIGlzU1NMO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjaGVjayBTU0wgZm9yICR7c2l0ZU5hbWV9OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIHNpdGVOYW1lIC0gU2l0ZSBuYW1lIChkZWZhdWx0OiB3d3cpXG4gICAqIEBwYXJhbSBzc2xTdXBwb3J0ZWQgLSBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKVxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBhcnJheVxuICAgKi9cbiAgcmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgc2l0ZU5hbWUgPSAnd3d3JyxcbiAgICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKGJvZGllcywge1xuICAgICAgc2l0ZU5hbWUsXG4gICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBmYWxzZSxcbiAgICB9KSBhcyBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT47XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCAod2l0aCBvcHRpb25zKVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVxdWVzdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5IChpbmNsdWRlcyBlcnJvcnMgaWYgcmV0dXJuRXhjZXB0aW9ucyBpcyB0cnVlKVxuICAgKi9cbiAgcmVxdWVzdFdpdGhPcHRpb25zKFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiBBTUNSZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzwoQU1DUmVzcG9uc2UgfCBXaWtpZG90RXJyb3IpW10+IHtcbiAgICBjb25zdCB7IHNpdGVOYW1lID0gJ3d3dycsIHNzbFN1cHBvcnRlZCwgcmV0dXJuRXhjZXB0aW9ucyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gR2V0IFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgICAgICBsZXQgc3NsID0gc3NsU3VwcG9ydGVkO1xuICAgICAgICBpZiAoc3NsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzc2xSZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrU2l0ZVNTTChzaXRlTmFtZSk7XG4gICAgICAgICAgaWYgKHNzbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBzc2xSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNzbCA9IHNzbFJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gc3NsID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn0vYWpheC1tb2R1bGUtY29ubmVjdG9yLnBocGA7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSByZXF1ZXN0cyBpbiBwYXJhbGxlbFxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYm9kaWVzLm1hcCgoYm9keSkgPT4gdGhpcy5saW1pdCgoKSA9PiB0aGlzLnNpbmdsZVJlcXVlc3QoYm9keSwgdXJsKSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJldHVybkV4Y2VwdGlvbnMpIHtcbiAgICAgICAgICAvLyBSZXR1cm4gYWxsIHJlc3VsdHMgaW5jbHVkaW5nIGVycm9yc1xuICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHIuZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaHJvdyBmaXJzdCBlcnJvciBpZiBhbnlcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdHMuZmluZCgocikgPT4gci5pc0VycigpKTtcbiAgICAgICAgaWYgKGZpcnN0RXJyb3I/LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdEVycm9yLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiByZXN1bHQgcHJvY2Vzc2luZycpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBleGVjdXRlIGEgc2luZ2xlIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZHkgLSBSZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHVybCAtIFJlcXVlc3QgVVJMXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpbmdsZVJlcXVlc3QoXG4gICAgYm9keTogQU1DUmVxdWVzdEJvZHksXG4gICAgdXJsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+PiB7XG4gICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEFkZCB3aWtpZG90X3Rva2VuN1xuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHsgLi4uYm9keSwgd2lraWRvdF90b2tlbjc6IFdJS0lET1RfVE9LRU43IH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIFVSTC1lbmNvZGVkIGJvZHlcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RCb2R5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMua3kucG9zdCh1cmwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgYm9keTogZm9ybURhdGEudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgYXMgSlNPTlxuICAgICAgICBsZXQgcmVzcG9uc2VEYXRhOiB1bmtub3duO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEFNQyByZXNwb25kZWQgd2l0aCBub24tSlNPTiBkYXRhOiAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIHpvZFxuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGFtY1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgSW52YWxpZCBBTUMgcmVzcG9uc2UgZm9ybWF0OiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW1jUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAgIC8vIFJldHJ5IGlmIHRyeV9hZ2FpblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAndHJ5X2FnYWluJykge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgV2lraWRvdFN0YXR1c0Vycm9yKCdBTUMgcmVzcG9uZGVkIHdpdGggdHJ5X2FnYWluJywgJ3RyeV9hZ2FpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmJpZGRlbkVycm9yIGlmIG5vX3Blcm1pc3Npb25cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcnJvciBpZiBzdGF0dXMgaXMgbm90IG9rXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoXG4gICAgICAgICAgICAgIGBBTUMgcmVzcG9uZGVkIHdpdGggZXJyb3Igc3RhdHVzOiBcIiR7YW1jUmVzcG9uc2Uuc3RhdHVzfVwiYCxcbiAgICAgICAgICAgICAgYW1jUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZE9rQXN5bmMoYW1jUmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgb24gSFRUUCBlcnJvclxuICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgICAgICAgICA/ICgoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSlcbiAgICAgICAgICAgICAgOiBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREU7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgQU1DSHR0cEVycm9yKGBBTUMgSFRUUCByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWAsIHN0YXR1c0NvZGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qKlxuICogQ2xhc3MgZm9yIG1hbmFnaW5nIEFNQyByZXF1ZXN0IGhlYWRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0hlYWRlciB7XG4gIHByaXZhdGUgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBjb250ZW50VHlwZTogc3RyaW5nO1xuICBwcml2YXRlIHVzZXJBZ2VudDogc3RyaW5nO1xuICBwcml2YXRlIHJlZmVyZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBIZWFkZXIgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHsgY29udGVudFR5cGU/OiBzdHJpbmc7IHVzZXJBZ2VudD86IHN0cmluZzsgcmVmZXJlcj86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5jb250ZW50VHlwZSA9IG9wdGlvbnM/LmNvbnRlbnRUeXBlID8/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnO1xuICAgIHRoaXMudXNlckFnZW50ID0gb3B0aW9ucz8udXNlckFnZW50ID8/ICdXaWtpZG90VFMnO1xuICAgIHRoaXMucmVmZXJlciA9IG9wdGlvbnM/LnJlZmVyZXIgPz8gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tLyc7XG4gICAgdGhpcy5jb29raWVzID0gbmV3IE1hcChbWyd3aWtpZG90X3Rva2VuNycsICcxMjM0NTYnXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSAtIENvb2tpZSB2YWx1ZVxuICAgKi9cbiAgc2V0Q29va2llKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqL1xuICBkZWxldGVDb29raWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLmRlbGV0ZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcmV0dXJucyBDb29raWUgdmFsdWUsIHVuZGVmaW5lZCBpZiBub3QgZXhpc3RzXG4gICAqL1xuICBnZXRDb29raWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRUUCBoZWFkZXJzIG9iamVjdFxuICAgKiBAcmV0dXJucyBIZWFkZXJzIGRpY3Rpb25hcnlcbiAgICovXG4gIGdldEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgY29va2llU3RyaW5nID0gQXJyYXkuZnJvbSh0aGlzLmNvb2tpZXMuZW50cmllcygpKVxuICAgICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gYCR7bmFtZX09JHt2YWx1ZX1gKVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHRoaXMuY29udGVudFR5cGUsXG4gICAgICAnVXNlci1BZ2VudCc6IHRoaXMudXNlckFnZW50LFxuICAgICAgUmVmZXJlcjogdGhpcy5yZWZlcmVyLFxuICAgICAgQ29va2llOiBjb29raWVTdHJpbmcsXG4gICAgfTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBBTUMgcmVxdWVzdCBib2R5IHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVxdWVzdEJvZHlWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB8IEFNQ1JlcXVlc3RCb2R5VmFsdWVbXTtcblxuLyoqXG4gKiBBTUMgcmVxdWVzdCBib2R5IHR5cGUgZGVmaW5pdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RCb2R5IHtcbiAgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBldmVudD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogQU1DUmVxdWVzdEJvZHlWYWx1ZTtcbn1cblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgYmFzZSBzY2hlbWFcbiAqL1xuY29uc3QgYmFzZVNjaGVtYTogei5ab2RPYmplY3Q8e1xuICBzdGF0dXM6IHouWm9kU3RyaW5nO1xuICBib2R5OiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbiAgbWVzc2FnZTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG59PiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICBib2R5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIEFNQyByZXNwb25zZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IGFtY1Jlc3BvbnNlU2NoZW1hOiB6LlpvZFR5cGU8ei5pbmZlcjx0eXBlb2YgYmFzZVNjaGVtYT4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPVxuICBiYXNlU2NoZW1hLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBhbWNSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogU3VjY2Vzc2Z1bCBBTUMgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdvayc7XG4gIGJvZHk6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIEFNQyByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBBTUMgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdWNjZXNzUmVzcG9uc2UocmVzcG9uc2U6IEFNQ1Jlc3BvbnNlKTogcmVzcG9uc2UgaXMgQU1DU3VjY2Vzc1Jlc3BvbnNlIHtcbiAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gJ29rJztcbn1cbiIsCiAgICAiZXhwb3J0IHsgQU1DQ2xpZW50LCB0eXBlIEFNQ1JlcXVlc3RPcHRpb25zLCBtYXNrU2Vuc2l0aXZlRGF0YSB9IGZyb20gJy4vYW1jLWNsaWVudCc7XG5leHBvcnQgeyB0eXBlIEFNQ0NvbmZpZywgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmV4cG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5leHBvcnQge1xuICB0eXBlIEFNQ1JlcXVlc3RCb2R5LFxuICB0eXBlIEFNQ1Jlc3BvbnNlLFxuICB0eXBlIEFNQ1N1Y2Nlc3NSZXNwb25zZSxcbiAgYW1jUmVzcG9uc2VTY2hlbWEsXG4gIGlzU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tICcuL2FtYy10eXBlcyc7XG5leHBvcnQgeyBsb2dpbiwgbG9nb3V0IH0gZnJvbSAnLi9hdXRoJztcbiIsCiAgICAiaW1wb3J0IHsgU2Vzc2lvbkNyZWF0ZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEF1dGhDbGllbnRDb250ZXh0IH0gZnJvbSAnLi4vbW9kdWxlL3R5cGVzJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKipcbiAqIExvZ2luIHRvIFdpa2lkb3Qgd2l0aCB1c2VybmFtZSBhbmQgcGFzc3dvcmRcbiAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgY29udGV4dCAob2JqZWN0IHdpdGggQU1DQ2xpZW50KVxuICogQHBhcmFtIHVzZXJuYW1lIC0gVXNlcm5hbWVcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFBhc3N3b3JkXG4gKiBAcmV0dXJucyB2b2lkIG9uIHN1Y2Nlc3MsIFNlc3Npb25DcmVhdGVFcnJvciBvbiBmYWlsdXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dpbihcbiAgY2xpZW50OiBBdXRoQ2xpZW50Q29udGV4dCxcbiAgdXNlcm5hbWU6IHN0cmluZyxcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBsb2dpbjogdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dpbicsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChMT0dJTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgYm9keTogZm9ybURhdGEudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtVGhyZWFkLCBGb3J1bVRocmVhZENvbGxlY3Rpb24sIEZvcnVtUG9zdCB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZU1lbWJlciwgU2l0ZUFwcGxpY2F0aW9uIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUZpbGVDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkaXNjdXNzaW9uIHRocmVhZCBmb3IgdGhlIHBhZ2VcbiAgICovXG4gIGdldERpc2N1c3Npb24oKTogV2lraWRvdFJlc3VsdEFzeW5jPGltcG9ydCgnLi4vZm9ydW0nKS5Gb3J1bVRocmVhZCB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdnZXR0aW5nIGRpc2N1c3Npb24nKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtQ29tbWVudHNMaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgLy8gRXh0cmFjdCB0aHJlYWQgSURcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKFxuICAgICAgICAgIC9XSUtJRE9UXFwubW9kdWxlc1xcLkZvcnVtVmlld1RocmVhZE1vZHVsZVxcLnZhcnNcXC50aHJlYWRJZFxccyo9XFxzKihcXGQrKS9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFtYXRjaD8uWzFdKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xuXG4gICAgICAgIC8vIEdldCBGb3J1bVRocmVhZFxuICAgICAgICBjb25zdCB7IEZvcnVtVGhyZWFkIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2ZvcnVtJyk7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IGRpc2N1c3Npb246ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG1ldGEgdGFncyBmb3IgdGhlIHBhZ2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWV0YXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VNZXRhQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgbWV0YXMnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBzZXRNZXRhKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzZXR0aW5nIG1ldGEnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcywgbmFtZSwgY29udGVudCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBkZWxldGVNZXRhKG5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZGVsZXRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2Ugc291cmNlIChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUGFnZSBzb3VyY2VcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVNvdXJjZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHNvdXJjZVJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBzb3VyY2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugc291cmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gaGlzdG9yeSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJldmlzaW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJldlJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlUmV2aXNpb25zKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmV2UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJldlJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSByZXZpc2lvbnMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2b3RlIGluZm9ybWF0aW9uIChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgVm90ZSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRWb3RlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVZvdGVDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3ZvdGVzID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2b3Rlc1Jlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmICh2b3Rlc1Jlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyB2b3Rlc1Jlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3ZvdGVzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHZvdGVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZvdGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZShmdWxsbmFtZT0ke3RoaXMuZnVsbG5hbWV9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBwYWdlcz86IFBhZ2VbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAocGFnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5wYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgZnVsbG5hbWVcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0gUGFnZSBmdWxsbmFtZVxuICAgKiBAcmV0dXJucyBQYWdlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5RnVsbG5hbWUoZnVsbG5hbWU6IHN0cmluZyk6IFBhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHBhZ2UpID0+IHBhZ2UuZnVsbG5hbWUgPT09IGZ1bGxuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VJZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSByZXZpc2lvbnMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVJldmlzaW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugdm90ZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVZvdGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlSWRzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuaXNJZEFjcXVpcmVkKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgKHVzaW5nIHNhbWUgc2VtYXBob3JlTGltaXQgYXMgQU1DQ2xpZW50KVxuICAgICAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChzaXRlLmNsaWVudC5hbWNDbGllbnQuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICAvLyBBY2Nlc3Mgd2l0aCBub3JlbmRlciwgbm9yZWRpcmVjdFxuICAgICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+XG4gICAgICAgICAgICBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2UuZ2V0VXJsKCl9L25vcmVuZGVyL3RydWUvbm9yZWRpcmVjdC90cnVlYDtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBzaXRlLmNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IHBhZ2UsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcGFnZSwgcmVzcG9uc2UgfSBvZiByZXNwb25zZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwucGFnZUlkXFxzKj1cXHMqKFxcZCspOy8pO1xuICAgICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBwYWdlIGlkOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2UuaWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBJRHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VTb3VyY2VzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5zb3VyY2UgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICd2aWV3c291cmNlL1ZpZXdTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykucmVwbGFjZSgvJm5ic3A7L2csICcgJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYENhbm5vdCBmaW5kIHNvdXJjZSBlbGVtZW50IGZvciBwYWdlOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdpa2lUZXh0ID0gc291cmNlRWxlbWVudC50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL15cXHQvLCAnJyk7XG4gICAgICAgICAgcGFnZS5zb3VyY2UgPSBuZXcgUGFnZVNvdXJjZSh7IHBhZ2UsIHdpa2lUZXh0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVJldmlzaW9ucyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmV2aXNpb25zID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlUmV2aXNpb25MaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGFsbDogdHJ1ZSB9LFxuICAgICAgICAgICAgcGVycGFnZTogMTAwMDAwMDAwLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uczogUGFnZVJldmlzaW9uW10gPSBbXTtcblxuICAgICAgICAgICQoJ3RhYmxlLnBhZ2UtaGlzdG9yeSB0cltpZF49XCJyZXZpc2lvbi1yb3ctXCJdJykuZWFjaCgoX2osIHJldkVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRyZXYgPSAkKHJldkVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcmV2SWRBdHRyID0gJHJldi5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgaWYgKCFyZXZJZEF0dHIpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2SWQgPSBOdW1iZXIucGFyc2VJbnQocmV2SWRBdHRyLnJlcGxhY2UoJ3JldmlzaW9uLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2SWQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICR0ZHMgPSAkcmV2LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgICBpZiAoJHRkcy5sZW5ndGggPCA3KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldk5vVGV4dCA9ICR0ZHMuZXEoMCkudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9cXC4kLywgJycpO1xuICAgICAgICAgICAgY29uc3QgcmV2Tm8gPSBOdW1iZXIucGFyc2VJbnQocmV2Tm9UZXh0LCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldk5vKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEJ5RWxlbSA9ICR0ZHMuZXEoNCkuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEJ5RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJGNyZWF0ZWRCeUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQXRFbGVtID0gJHRkcy5lcSg1KS5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRBdEVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRjcmVhdGVkQXRFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSAkdGRzLmVxKDYpLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIHJldmlzaW9ucy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZVJldmlzaW9uKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIGlkOiByZXZJZCxcbiAgICAgICAgICAgICAgICByZXZObyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS5yZXZpc2lvbnMgPSBuZXcgUGFnZVJldmlzaW9uQ29sbGVjdGlvbihwYWdlLCByZXZpc2lvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVZvdGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS52b3RlcyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ3BhZ2VyYXRlL1dob1JhdGVkUGFnZU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2Ugdm90ZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIExpc3RQYWdlc01vZHVsZSByZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgNS1zdGFyIHJhdGluZ1xuICAgICAgY29uc3QgaXM1U3RhclJhdGluZyA9ICRwYWdlLmZpbmQoJ3NwYW4ucmF0aW5nIHNwYW4ucGFnZS1yYXRlLWxpc3QtcGFnZXMtc3RhcnQnKS5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBHZXQgZWFjaCB2YWx1ZVxuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZXkgY29udmVyc2lvblxuICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfbGlua2VkJykpIHtcbiAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2xpbmtlZCcsICcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NvbW1lbnRzJywgJ2NoaWxkcmVuJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBrZXkgPSBgJHtrZXl9X2NvdW50YDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfdm90ZXMnKSB7XG4gICAgICAgICAga2V5ID0gJ3ZvdGVzX2NvdW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1lcmdlIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB3aXRoIFpvZCBzY2hlbWEgYW5kIGFwcGx5IGRlZmF1bHRzXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYWdlUGFyYW1zU2NoZW1hLnBhcnNlKHBhZ2VQYXJhbXMpO1xuXG4gICAgICAvLyBDcmVhdGUgUGFnZSBvYmplY3RcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIG1vZHVsZSBib2R5XG4gICAgICAgIGNvbnN0IG1vZHVsZUJvZHkgPSBgW1tkaXYgY2xhc3M9XCJwYWdlXCJdXVxcbiR7REVGQVVMVF9NT0RVTEVfQk9EWS5tYXAoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIGBbW3NwYW4gY2xhc3M9XCJzZXQgJHtrZXl9XCJdXVtbc3BhbiBjbGFzcz1cIm5hbWVcIl1dICR7a2V5fSBbWy9zcGFuXV1bW3NwYW4gY2xhc3M9XCJ2YWx1ZVwiXV0gJSUke2tleX0lJSBbWy9zcGFuXV1bWy9zcGFuXV1gXG4gICAgICAgICkuam9pbignJyl9XFxuW1svZGl2XV1gO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgIG1vZHVsZV9ib2R5OiBtb2R1bGVCb2R5LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbcmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3Rfb2snKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdGYWlsZWQgdG8gZ2V0IHBhZ2VzLCB0YXJnZXQgc2l0ZSBtYXkgYmUgcHJpdmF0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgbGV0IHRvdGFsID0gMTtcbiAgICAgICAgY29uc3QgaHRtbEJvZGllczogY2hlZXJpby5DaGVlcmlvQVBJW10gPSBbJGZpcnN0XTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAodG90YWwgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbEJvZGllczogQU1DUmVxdWVzdEJvZHlbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgICAgYWRkaXRpb25hbEJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ucXVlcnlEaWN0LFxuICAgICAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiBpICogKHEucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFKSxcbiAgICAgICAgICAgIH0gYXMgQU1DUmVxdWVzdEJvZHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KGFkZGl0aW9uYWxCb2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwQm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBodG1sQm9kaWVzLnB1c2goY2hlZXJpby5sb2FkKHJlc3BCb2R5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VcbiAgICAgICAgY29uc3QgcGFnZXM6IFBhZ2VbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0ICRodG1sIG9mIGh0bWxCb2RpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBQYWdlQ29sbGVjdGlvbi5wYXJzZShzaXRlLCAkaHRtbCwgcGFyc2VVc2VyKTtcbiAgICAgICAgICBwYWdlcy5wdXNoKC4uLnBhcnNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIGVkaXQgYSBwYWdlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlT3JFZGl0KFxuICAgIHNpdGU6IFNpdGUsXG4gICAgZnVsbG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBwYWdlSWQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICAgIHJhaXNlT25FeGlzdHM/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBjcmVhdGUvZWRpdCBwYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhZ2VJZCA9IG51bGwsXG4gICAgICAgICAgdGl0bGUgPSAnJyxcbiAgICAgICAgICBzb3VyY2UgPSAnJyxcbiAgICAgICAgICBjb21tZW50ID0gJycsXG4gICAgICAgICAgZm9yY2VFZGl0ID0gZmFsc2UsXG4gICAgICAgICAgcmFpc2VPbkV4aXN0cyA9IGZhbHNlLFxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyBBY3F1aXJlIHBhZ2UgbG9ja1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIFNhdmUgcGFnZVxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2UgZmlsZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUZpbGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2UgYXR0YWNobWVudCBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWltZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlRmlsZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IGRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VGaWxlKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCBzaXplPSR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBmaWxlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIHRvIGJ5dGVzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVNpemUoc2l6ZVRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdGV4dCA9IHNpemVUZXh0LnRyaW0oKTtcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnQnl0ZXMnKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdCeXRlcycsICcnKS50cmltKCkpKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2tCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgna0InLCAnJykudHJpbSgpKSAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnTUInKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdNQicsICcnKS50cmltKCkpICogMTAwMDAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdHQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0dCJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwMDAwKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICAgICAgaWYgKGZpbGVzVGFibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXM6IFBhZ2VGaWxlW10gPSBbXTtcblxuICAgICAgICBmaWxlc1RhYmxlLmZpbmQoXCJ0Ym9keSB0cltpZF49J2ZpbGUtcm93LSddXCIpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgICAgIGlmICghcm93SWQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZpbGVJZCA9IE51bWJlci5wYXJzZUludChyb3dJZC5yZXBsYWNlKCdmaWxlLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgICAgICBpZiAodGRzLmxlbmd0aCA8IDMpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGxpbmtFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJ2EnKTtcbiAgICAgICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gbGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gbGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgICAgICBjb25zdCBtaW1lRWxlbSA9ICQodGRzWzFdKS5maW5kKCdzcGFuJyk7XG4gICAgICAgICAgY29uc3QgbWltZVR5cGUgPSBtaW1lRWxlbS5hdHRyKCd0aXRsZScpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBzaXplID0gUGFnZUZpbGVDb2xsZWN0aW9uLnBhcnNlU2l6ZShzaXplVGV4dCk7XG5cbiAgICAgICAgICBmaWxlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWdcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZU1ldGFEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGEgdGFnIHZhbHVlXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGUoY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKi9cbiAgZGVsZXRlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlTWV0YShuYW1lPSR7dGhpcy5uYW1lfSwgY29udGVudD0ke3RoaXMuY29udGVudH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGFDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZU1ldGE+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZVJlZiwgbWV0YXM/OiBQYWdlTWV0YVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChtZXRhcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1ldGFzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1ldGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKG1ldGEpID0+IG1ldGEubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgbWV0YSB0YWdzXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZVJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgbWV0YXM6IFBhZ2VNZXRhW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSBIVE1MLWVuY29kZWQgbWV0YSB0YWdzIHdpdGggcmVnZXhcbiAgICAgICAgLy8gRm9ybWF0OiAmbHQ7bWV0YSBuYW1lPVwieHh4XCIgY29udGVudD1cInl5eVwiLyZndDtcbiAgICAgICAgY29uc3QgbWV0YVJlZ2V4ID0gLyZsdDttZXRhIG5hbWU9XCIoW15cIl0rKVwiIGNvbnRlbnQ9XCIoW15cIl0qKVwiXFwvPyZndDsvZztcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBodG1sLm1hdGNoQWxsKG1ldGFSZWdleCkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZU1ldGEoe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50ID8/ICcnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VNZXRhQ29sbGVjdGlvbihwYWdlLCBtZXRhcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIG1ldGFzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YSB0YWdcbiAgICogQHBhcmFtIHBhZ2UgLSBQYWdlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHNldE1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIHNldCBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWV0YUNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgICAgbWV0YU5hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXZpc2lvbkRhdGEge1xuICBwYWdlOiBQYWdlO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSByZXZpc2lvbiAodmVyc2lvbiBpbiBlZGl0IGhpc3RvcnkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUmV2aXNpb24ge1xuICAvKiogUGFnZSB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFJldmlzaW9uIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBudW1iZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEVkaXQgY29tbWVudCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIVE1MIGRpc3BsYXkgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmV2aXNpb25EYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMucmV2Tm8gPSBkYXRhLnJldk5vO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzb3VyY2UgY29kZSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNTb3VyY2VBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgSFRNTCBkaXNwbGF5IGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0h0bWxBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIGNvZGUgKGNhY2hlZClcbiAgICovXG4gIGdldCBzb3VyY2UoKTogUGFnZVNvdXJjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBQYWdlU291cmNlIHwgbnVsbCkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGRpc3BsYXkgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGRpc3BsYXlcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBzb3VyY2UgKFJFVi0wMDEpXG4gICAqIEByZXR1cm5zIFNvdXJjZSBzdHJpbmdcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdoaXN0b3J5L1BhZ2VTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVNvdXJjZU1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBTb3VyY2UgY29kZSBpcyBpbnNpZGUgPGRpdiBjbGFzcz1cInBhZ2Utc291cmNlXCI+XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIEhUTUwgKFJFVi0wMDIpXG4gICAqIEByZXR1cm5zIEhUTUwgc3RyaW5nXG4gICAqL1xuICBnZXRIdG1sKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLl9odG1sKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlVmVyc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbl9pZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQYWdlVmVyc2lvbk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBIVE1MIGNvbnRlbnQgaXMgaW5zaWRlIDxkaXYgaWQ9XCJwYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSAkKCcjcGFnZS1jb250ZW50Jyk7XG4gICAgICAgIGlmIChjb250ZW50RWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZW50aXJlIGJvZHkgaWYgcGFnZS1jb250ZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudEVsZW0uaHRtbCgpID8/ICcnO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudEh0bWw7XG4gICAgICAgIHJldHVybiBjb250ZW50SHRtbDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb24gSFRNTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VSZXZpc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSB8IG51bGwsIHJldmlzaW9ucz86IFBhZ2VSZXZpc2lvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChyZXZpc2lvbnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5yZXZpc2lvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFJldmlzaW9uIElEXG4gICAqIEByZXR1cm5zIFJldmlzaW9uICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc291cmNlIHN0cmluZ3NcbiAgICovXG4gIGdldFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTb3VyY2VEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgd2lraVRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VTb3VyY2Uge1xuICAvKiogUGFnZSB0aGlzIHNvdXJjZSBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpICovXG4gIHB1YmxpYyByZWFkb25seSB3aWtpVGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VTb3VyY2VEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMud2lraVRleHQgPSBkYXRhLndpa2lUZXh0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VTb3VyY2UocGFnZT0ke3RoaXMucGFnZS5mdWxsbmFtZX0sIGxlbmd0aD0ke3RoaXMud2lraVRleHQubGVuZ3RofSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugdm90ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZvdGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2Ugdm90ZSAocmF0aW5nKVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGUge1xuICAvKiogUGFnZSB0aGlzIHZvdGUgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogVXNlciB3aG8gdm90ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcblxuICAvKiogVm90ZSB2YWx1ZSAoKzEvLTEgb3IgbnVtZXJpYykgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVZvdGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlVm90ZSh1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCB2YWx1ZT0ke3RoaXMudmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGVDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZVZvdGU+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSwgdm90ZXM/OiBQYWdlVm90ZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmICh2b3Rlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnZvdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIFZvdGUgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlVc2VyKHVzZXI6IEFic3RyYWN0VXNlcik6IFBhZ2VWb3RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh2b3RlKSA9PiB2b3RlLnVzZXIuaWQgPT09IHVzZXIuaWQpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogUGFnZSBzZWFyY2ggcXVlcnkgcGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMge1xuICAvKiogUGFnZSB0eXBlIChlLmcuLCAnbm9ybWFsJywgJ2FkbWluJykgKi9cbiAgcGFnZXR5cGU/OiBzdHJpbmc7XG4gIC8qKiBDYXRlZ29yeSBuYW1lICovXG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogVGFncyB0byBzZWFyY2ggKEFORCBjb25kaXRpb24pICovXG4gIHRhZ3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIFBhcmVudCBwYWdlIG5hbWUgKi9cbiAgcGFyZW50Pzogc3RyaW5nO1xuICAvKiogTGlua2VkIHBhZ2UgbmFtZSAqL1xuICBsaW5rVG8/OiBzdHJpbmc7XG4gIC8qKiBDcmVhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqIFVwZGF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKiogQ3JlYXRvciAqL1xuICBjcmVhdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmc7XG4gIC8qKiBSYXRpbmcgY29uZGl0aW9uICovXG4gIHJhdGluZz86IHN0cmluZztcbiAgLyoqIFZvdGUgY291bnQgY29uZGl0aW9uICovXG4gIHZvdGVzPzogc3RyaW5nO1xuICAvKiogUGFnZSBuYW1lIGNvbmRpdGlvbiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRnVsbG5hbWUgKGV4YWN0IG1hdGNoKSAqL1xuICBmdWxsbmFtZT86IHN0cmluZztcbiAgLyoqIFJhbmdlIHNwZWNpZmljYXRpb24gKi9cbiAgcmFuZ2U/OiBzdHJpbmc7XG4gIC8qKiBTb3J0IG9yZGVyIChlLmcuLCAnY3JlYXRlZF9hdCBkZXNjJykgKi9cbiAgb3JkZXI/OiBzdHJpbmc7XG4gIC8qKiBTdGFydCBvZmZzZXQgKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU/OiBzdHJpbmc7XG4gIC8qKiBXcmFwcGVyIGRpc3BsYXkgKi9cbiAgd3JhcHBlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGl0ZW1zIHBlciBwYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjUwO1xuXG4vKipcbiAqIERlZmF1bHQgbW9kdWxlIGJvZHkgZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PRFVMRV9CT0RZID0gW1xuICAnZnVsbG5hbWUnLFxuICAnY2F0ZWdvcnknLFxuICAnbmFtZScsXG4gICd0aXRsZScsXG4gICdjcmVhdGVkX2F0JyxcbiAgJ2NyZWF0ZWRfYnlfbGlua2VkJyxcbiAgJ3VwZGF0ZWRfYXQnLFxuICAndXBkYXRlZF9ieV9saW5rZWQnLFxuICAnY29tbWVudGVkX2F0JyxcbiAgJ2NvbW1lbnRlZF9ieV9saW5rZWQnLFxuICAncGFyZW50X2Z1bGxuYW1lJyxcbiAgJ2NvbW1lbnRzJyxcbiAgJ3NpemUnLFxuICAnY2hpbGRyZW4nLFxuICAncmF0aW5nX3ZvdGVzJyxcbiAgJ3JhdGluZycsXG4gICdyYXRpbmdfcGVyY2VudCcsXG4gICdyZXZpc2lvbnMnLFxuICAndGFncycsXG4gICdfdGFncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQYWdlc1F1ZXJ5IHtcbiAgLyoqIFBhZ2UgdHlwZSAqL1xuICBwYWdldHlwZTogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgKi9cbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgLyoqIFRhZ3MgKi9cbiAgdGFnczogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuICAvKiogUGFyZW50IHBhZ2UgKi9cbiAgcGFyZW50OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTGluayB0YXJnZXQgKi9cbiAgbGlua1RvOiBzdHJpbmcgfCBudWxsO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZ1bGxuYW1lIGNvbmRpdGlvbiAqL1xuICBmdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhbmdlICovXG4gIHJhbmdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU29ydCBvcmRlciAqL1xuICBvcmRlcjogc3RyaW5nO1xuICAvKiogT2Zmc2V0ICovXG4gIG9mZnNldDogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZTogbnVtYmVyO1xuICAvKiogU2VwYXJhdGUgZGlzcGxheSAqL1xuICBzZXBhcmF0ZTogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFnZXR5cGUgPSBwYXJhbXMucGFnZXR5cGUgPz8gJyonO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgPz8gJyonO1xuICAgIHRoaXMudGFncyA9IHBhcmFtcy50YWdzID8/IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5saW5rVG8gPSBwYXJhbXMubGlua1RvID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBwYXJhbXMuY3JlYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBwYXJhbXMudXBkYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBwYXJhbXMuY3JlYXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5yYXRpbmcgPSBwYXJhbXMucmF0aW5nID8/IG51bGw7XG4gICAgdGhpcy52b3RlcyA9IHBhcmFtcy52b3RlcyA/PyBudWxsO1xuICAgIHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lID8/IG51bGw7XG4gICAgdGhpcy5mdWxsbmFtZSA9IHBhcmFtcy5mdWxsbmFtZSA/PyBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBwYXJhbXMucmFuZ2UgPz8gbnVsbDtcbiAgICB0aGlzLm9yZGVyID0gcGFyYW1zLm9yZGVyID8/ICdjcmVhdGVkX2F0IGRlc2MnO1xuICAgIHRoaXMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldCA/PyAwO1xuICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gbnVsbDtcbiAgICB0aGlzLnBlclBhZ2UgPSBwYXJhbXMucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFO1xuICAgIHRoaXMuc2VwYXJhdGUgPSBwYXJhbXMuc2VwYXJhdGUgPz8gJ25vJztcbiAgICB0aGlzLndyYXBwZXIgPSBwYXJhbXMud3JhcHBlciA/PyAnbm8nO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gZGljdGlvbmFyeSBmb3JtYXRcbiAgICovXG4gIGFzRGljdCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gcGFnZXR5cGUgYW5kIGNhdGVnb3J5IG11c3QgYWx3YXlzIGJlIGluY2x1ZGVkXG4gICAgLy8gV2lraWRvdCBkZWZhdWx0czogcGFnZXR5cGU9XCJub3JtYWxcIiwgY2F0ZWdvcnk9XCIuXCIgKGN1cnJlbnQgY2F0ZWdvcnkpXG4gICAgLy8gVG8gZ2V0IGFsbCBwYWdlcywgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNlbmQgXCIqXCJcbiAgICByZXN1bHQucGFnZXR5cGUgPSB0aGlzLnBhZ2V0eXBlO1xuICAgIHJlc3VsdC5jYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcnk7XG4gICAgaWYgKHRoaXMudGFncyAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnRhZ3MgPSBBcnJheS5pc0FycmF5KHRoaXMudGFncykgPyB0aGlzLnRhZ3Muam9pbignICcpIDogdGhpcy50YWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAodGhpcy5saW5rVG8gIT09IG51bGwpIHJlc3VsdC5saW5rX3RvID0gdGhpcy5saW5rVG87XG4gICAgaWYgKHRoaXMuY3JlYXRlZEF0ICE9PSBudWxsKSByZXN1bHQuY3JlYXRlZF9hdCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgIGlmICh0aGlzLnVwZGF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LnVwZGF0ZWRfYXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5jcmVhdGVkX2J5ID0gdHlwZW9mIHRoaXMuY3JlYXRlZEJ5ID09PSAnc3RyaW5nJyA/IHRoaXMuY3JlYXRlZEJ5IDogdGhpcy5jcmVhdGVkQnkubmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmF0aW5nICE9PSBudWxsKSByZXN1bHQucmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgaWYgKHRoaXMudm90ZXMgIT09IG51bGwpIHJlc3VsdC52b3RlcyA9IHRoaXMudm90ZXM7XG4gICAgaWYgKHRoaXMubmFtZSAhPT0gbnVsbCkgcmVzdWx0Lm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuZnVsbG5hbWUgIT09IG51bGwpIHJlc3VsdC5mdWxsbmFtZSA9IHRoaXMuZnVsbG5hbWU7XG4gICAgaWYgKHRoaXMucmFuZ2UgIT09IG51bGwpIHJlc3VsdC5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgICByZXN1bHQub3JkZXIgPSB0aGlzLm9yZGVyO1xuICAgIHJlc3VsdC5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICBpZiAodGhpcy5saW1pdCAhPT0gbnVsbCkgcmVzdWx0LmxpbWl0ID0gdGhpcy5saW1pdDtcbiAgICByZXN1bHQucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICByZXN1bHQuc2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlO1xuICAgIHJlc3VsdC53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQ2hhbmdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgcmV2aXNpb25ObzogbnVtYmVyO1xuICBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbk5vOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxhZ3M6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVDaGFuZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMucGFnZUZ1bGxuYW1lID0gZGF0YS5wYWdlRnVsbG5hbWU7XG4gICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VUaXRsZTtcbiAgICB0aGlzLnJldmlzaW9uTm8gPSBkYXRhLnJldmlzaW9uTm87XG4gICAgdGhpcy5jaGFuZ2VkQnkgPSBkYXRhLmNoYW5nZWRCeTtcbiAgICB0aGlzLmNoYW5nZWRBdCA9IGRhdGEuY2hhbmdlZEF0O1xuICAgIHRoaXMuZmxhZ3MgPSBkYXRhLmZsYWdzO1xuICAgIHRoaXMuY29tbWVudCA9IGRhdGEuY29tbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFBhZ2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLnBhZ2VGdWxsbmFtZX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVDaGFuZ2UocGFnZT0ke3RoaXMucGFnZUZ1bGxuYW1lfSwgcmV2PSR7dGhpcy5yZXZpc2lvbk5vfSwgYnk9JHt0aGlzLmNoYW5nZWRCeX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUNoYW5nZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxTaXRlQ2hhbmdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNoYW5nZXM/OiBTaXRlQ2hhbmdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2UgaGlzdG9yeVxuICAgKiBAcGFyYW0gc2l0ZSAtIFNpdGUgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgb3B0aW9ucz86IHsgcGVyUGFnZT86IG51bWJlcjsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwZXJQYWdlID0gb3B0aW9ucz8ucGVyUGFnZSA/PyAyMDtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdjaGFuZ2VzL1NpdGVDaGFuZ2VzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwZXJwYWdlOiBwZXJQYWdlLFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpdGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIFBhcnNlIHRhYmxlIHJvd3NcbiAgICAgICAgJCgndGFibGUud2lraS1jb250ZW50LXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCA0KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBQYWdlIGxpbmtcbiAgICAgICAgICBjb25zdCBwYWdlTGluayA9ICQoJGNlbGxzWzBdKS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHBhZ2VMaW5rLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlRnVsbG5hbWUgPSBocmVmLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKVswXSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlVGl0bGUgPSBwYWdlTGluay50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyXG4gICAgICAgICAgY29uc3QgcmV2VGV4dCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHJldk1hdGNoID0gcmV2VGV4dC5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb25ObyA9IHJldk1hdGNoPy5bMV0gPyBOdW1iZXIucGFyc2VJbnQocmV2TWF0Y2hbMV0sIDEwKSA6IDA7XG5cbiAgICAgICAgICAvLyBGbGFnc1xuICAgICAgICAgIGNvbnN0IGZsYWdzQ2VsbCA9ICQoJGNlbGxzWzJdKTtcbiAgICAgICAgICBjb25zdCBmbGFnczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmbGFnc0NlbGwuZmluZCgnc3BhbicpLmVhY2goKF9qLCBmbGFnRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmxhZ0NsYXNzID0gJChmbGFnRWxlbSkuYXR0cignY2xhc3MnKSA/PyAnJztcbiAgICAgICAgICAgIGlmIChmbGFnQ2xhc3MuaW5jbHVkZXMoJ3NwYW50aXAnKSkge1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoZmxhZ0VsZW0pLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG4gICAgICAgICAgICAgIGlmICh0aXRsZSkgZmxhZ3MucHVzaCh0aXRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVc2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBpbmZvQ2VsbCA9ICQoJGNlbGxzWzNdKTtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEJ5ID0gdXNlckVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkQXQgPSBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlT2RhdGUob2RhdGVFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICAvLyBDb21tZW50XG4gICAgICAgICAgY29uc3QgY29tbWVudEVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLmNvbW1lbnRzJyk7XG4gICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRFbGVtXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXltcIlwiXXxbXCJcIl0kL2csICcnKTtcblxuICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBTaXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgcGFnZUZ1bGxuYW1lLFxuICAgICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICAgIHJldmlzaW9uTm8sXG4gICAgICAgICAgICAgIGNoYW5nZWRCeSxcbiAgICAgICAgICAgICAgY2hhbmdlZEF0LFxuICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGltaXQgcmVzdWx0cyBpZiBsaW1pdCBpcyBzcGVjaWZpZWRcbiAgICAgICAgY29uc3QgbGltaXRlZENoYW5nZXMgPSBsaW1pdCAhPT0gdW5kZWZpbmVkID8gY2hhbmdlcy5zbGljZSgwLCBsaW1pdCkgOiBjaGFuZ2VzO1xuICAgICAgICByZXR1cm4gbmV3IFNpdGVDaGFuZ2VDb2xsZWN0aW9uKHNpdGUsIGxpbWl0ZWRDaGFuZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNpdGUgY2hhbmdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHtcbiAgUGFnZSxcbiAgUGFnZUNvbGxlY3Rpb24sXG4gIFNlYXJjaFBhZ2VzUXVlcnksXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogUGFnZSBsaXN0IG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VzQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGFnZXMgbWF0Y2hpbmcgY29uZGl0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gU2VhcmNoIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgUGFnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBzZWFyY2gocGFyYW1zPzogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkocGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXNlclBhcnNlciA9IHBhcnNlVXNlci5iaW5kKG51bGwsIHRoaXMuc2l0ZS5jbGllbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLnNlYXJjaFBhZ2VzKHRoaXMuc2l0ZSwgdXNlclBhcnNlciwgcXVlcnkpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBhZ2VzXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgYWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaCh7fSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5wZXJQYWdlIC0gSXRlbXMgcGVyIHBhZ2UgKGRlZmF1bHQ6IDIwKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5wYWdlIC0gUGFnZSBudW1iZXIgKGRlZmF1bHQ6IDEpXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJlY2VudENoYW5nZXMob3B0aW9ucz86IHtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gU2l0ZUNoYW5nZUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzLnNpdGUsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSwgQU1DUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2xpZW50JztcbmltcG9ydCB7IEZvcnVtQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBNZW1iZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL21lbWJlci1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yJztcbmltcG9ydCB7IFBhZ2VzQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvcic7XG5cbi8qKlxuICogU2l0ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZURhdGEge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bml4TmFtZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNpdGUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgLyoqIFNpdGUgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFNpdGUgdGl0bGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggbmFtZSAoZS5nLiwgc2NwLWpwKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZztcblxuICAvKiogRG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgZmxhZyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKiBQYWdlIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX3BhZ2U6IFBhZ2VBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBQYWdlcyBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlczogUGFnZXNBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3J1bSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9mb3J1bTogRm9ydW1BY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBNZW1iZXIgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfbWVtYmVyOiBNZW1iZXJBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBTaXRlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lO1xuICAgIHRoaXMuZG9tYWluID0gZGF0YS5kb21haW47XG4gICAgdGhpcy5zc2xTdXBwb3J0ZWQgPSBkYXRhLnNzbFN1cHBvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IHBhZ2UoKTogUGFnZUFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSBuZXcgUGFnZUFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZXMgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlcygpOiBQYWdlc0FjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2VzKSB7XG4gICAgICB0aGlzLl9wYWdlcyA9IG5ldyBQYWdlc0FjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgZm9ydW0oKTogRm9ydW1BY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9mb3J1bSkge1xuICAgICAgdGhpcy5fZm9ydW0gPSBuZXcgRm9ydW1BY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvcnVtO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1iZXIgYWNjZXNzb3JcbiAgICovXG4gIGdldCBtZW1iZXIoKTogTWVtYmVyQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fbWVtYmVyKSB7XG4gICAgICB0aGlzLl9tZW1iZXIgPSBuZXcgTWVtYmVyQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJhc2UgVVJMIG9mIHRoZSBzaXRlXG4gICAqL1xuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnNzbFN1cHBvcnRlZCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7dGhpcy5kb21haW59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0IHRvIHRoaXMgc2l0ZVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZSBhcnJheVxuICAgKi9cbiAgYW1jUmVxdWVzdChib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMsIHRoaXMudW5peE5hbWUsIHRoaXMuc3NsU3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZVxuICAgKi9cbiAgYW1jUmVxdWVzdFNpbmdsZShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChbYm9keV0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdBTUMgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5leHBlY3RlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGZyb20gVU5JWCBuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlXG4gICAqL1xuICBzdGF0aWMgZnJvbVVuaXhOYW1lKGNsaWVudDogQ2xpZW50LCB1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBGZXRjaCBzaXRlIHBhZ2UgKEhUVFAgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0cylcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgbm90IGZvdW5kOiAke3VuaXhOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggc2l0ZTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIFBhcnNlIFdJS0lSRVFVRVNULmluZm9cbiAgICAgICAgY29uc3Qgc2NyaXB0cyA9ICQoJ3NjcmlwdCcpLnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IHNpdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzaXRlVW5peE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoc2NyaXB0KS5odG1sKCk7XG4gICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBTU0wgc3VwcG9ydCAoYmFzZWQgb24gd2hldGhlciB0aGUgcmVkaXJlY3QgVVJMIHN0YXJ0cyB3aXRoIGh0dHBzKVxuICAgICAgICBjb25zdCBzc2xTdXBwb3J0ZWQgPSByZXNwb25zZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNpdGUoY2xpZW50LCB7XG4gICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB1bml4TmFtZTogc2l0ZVVuaXhOYW1lLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNpdGU6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGUoaWQ9JHt0aGlzLmlkfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFNpdGUgfSBmcm9tICcuLi8uLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGJ5IFVOSVggbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGUgb2JqZWN0IHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogaWYgKCFzaXRlUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBzaXRlJyk7XG4gICAqIH1cbiAgICogY29uc3Qgc2l0ZSA9IHNpdGVSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFVzZXIgcmV0cmlldmFsIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaHJvdyBlcnJvciBpZiB1c2VyIG5vdCBmb3VuZCAoZGVmYXVsdDogZmFsc2UpICovXG4gIHJhaXNlV2hlbk5vdEZvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGJ5IHVzZXJuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVXNlcm5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGUgKG51bGwgaWYgbm90IGZvdW5kLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdXNlcicpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGZyb20gbXVsdGlwbGUgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgY29sbGVjdGlvbiAobnVsbCBmb3Igbm9uLWV4aXN0ZW50IHVzZXJzLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKi9cbiAgZ2V0TWFueShuYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZXModGhpcy5jbGllbnQsIG5hbWVzKS5hbmRUaGVuKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3Qgbm90Rm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbltpXSA9PT0gbnVsbCAmJiBuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vdEZvdW5kTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdEZvdW5kTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlcnMgbm90IGZvdW5kOiAke25vdEZvdW5kTmFtZXMuam9pbignLCAnKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY29sbGVjdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBmcm9tUHJvbWlzZSxcbiAgdHlwZSBXaWtpZG90UmVzdWx0LFxuICB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyxcbiAgd2RFcnIsXG4gIHdkT2ssXG4gIHdkT2tBc3luYyxcbn0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNDb25maWcsIGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgeyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcG0tYWNjZXNzb3InO1xuaW1wb3J0IHsgU2l0ZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBVc2VyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yJztcblxuLyoqXG4gKiBDbGllbnQgY3JlYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdCB1c2VybmFtZSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdCBwYXNzd29yZCAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiogQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQyBjb25maWd1cmF0aW9uIG92ZXJyaWRlICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG90IGNsaWVudFxuICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqIEFNQyBjbGllbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlckFjY2Vzc29yO1xuXG4gIC8qKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGVBY2Nlc3NvcjtcblxuICAvKiogUHJpdmF0ZSBtZXNzYWdlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiBVc2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIExvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3JcbiAgICogVXNlIHRoZSBjcmVhdGUgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihhbWNDbGllbnQ6IEFNQ0NsaWVudCwgZG9tYWluOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuYW1jQ2xpZW50ID0gYW1jQ2xpZW50O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjY2Vzc29yc1xuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGxvZ2dlZCBpblxuICAgKi9cbiAgZ2V0IG1lKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnNcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBDbGllbnQgfSBmcm9tICdAdWt3aGF0bi93aWtpZG90JztcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgY2xpZW50XG4gICAqIGNvbnN0IGNsaWVudFJlc3VsdCA9IGF3YWl0IENsaWVudC5jcmVhdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAneW91cl91c2VybmFtZScsXG4gICAqICAgcGFzc3dvcmQ6ICd5b3VyX3Bhc3N3b3JkJyxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFJlc3VsdCB0eXBlIHJlcXVpcmVzIGlzT2soKSBjaGVjayBiZWZvcmUgYWNjZXNzaW5nIC52YWx1ZVxuICAgKiBpZiAoIWNsaWVudFJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50Jyk7XG4gICAqIH1cbiAgICogY29uc3QgY2xpZW50ID0gY2xpZW50UmVzdWx0LnZhbHVlO1xuICAgKlxuICAgKiAvLyBOb3cgeW91IGNhbiBhY2Nlc3MgY2xpZW50LnNpdGUsIGV0Yy5cbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8Q2xpZW50PiB7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIEFNQyBjbGllbnRcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcblxuICAgIC8vIExvZ2luIGlmIGNyZWRlbnRpYWxzIGFyZSBwcm92aWRlZFxuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4sIHVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGxvZ2luKGNsaWVudCwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgbG9naW5SZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnMgKGV4Y2x1ZGluZyBjcmVkZW50aWFscylcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGxvZ2luIHN0YXR1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvZ2dlZCBpblxuICAgKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWUgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBsb2dpblxuICAgKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluXG4gICAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjbGllbnRcbiAgICogQXR0ZW1wdHMgdG8gbG9nb3V0IGlmIGEgc2Vzc2lvbiBleGlzdHNcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9xdWljay1tb2R1bGUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBSXNCLGNBa0JUO0FB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LElBQ3ZCLE9BQU87QUFBQTtBQUFBLEVBR1QsUUFBUSxHQUFXO0FBQUEsSUFDakIsT0FBTyxrQkFBa0IsS0FBSztBQUFBO0FBRWxDOzs7SUM5Q2E7QUFBQTtBQUFBLG1CQUF5QztBQUFBLElBQ3BELEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxFQUNaO0FBQUE7OztBQ3ZjTyxTQUFTLE1BQU0sQ0FBQyxXQUEyQjtBQUFBLEVBRWhELElBQUksVUFBUztBQUFBLEVBQ2IsV0FBVyxRQUFRLFdBQVc7QUFBQSxJQUM1QixNQUFNLFNB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
4870
+ //# debugId=16669DA309E6E02C64756E2164756E21
4871
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL21vZHVsZS91c2VyL2Fub255bW91cy11c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci9kZWxldGVkLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2d1ZXN0LXVzZXIudHMiLCAic3JjL3V0aWwvdGFibGUvY2hhci10YWJsZS50cyIsICJzcmMvdXRpbC9zdHJpbmctdXRpbC50cyIsICJzcmMvbW9kdWxlL3VzZXIvdXNlci1jb2xsZWN0aW9uLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci93aWtpZG90LXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2luZGV4LnRzIiwgInNyYy91dGlsL3BhcnNlci91c2VyLnRzIiwgInNyYy91dGlsL3BhcnNlci9pbmRleC50cyIsICJzcmMvY29tbW9uL2RlY29yYXRvcnMudHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tcG9zdC50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXRocmVhZC50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLWNhdGVnb3J5LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vaW5kZXgudHMiLCAic3JjL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWNsaWVudC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1oZWFkZXIudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtdHlwZXMudHMiLCAic3JjL2Nvbm5lY3Rvci9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2F1dGgudHMiLCAic3JjL21vZHVsZS9wcml2YXRlLW1lc3NhZ2UvcHJpdmF0ZS1tZXNzYWdlLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy9wbS1hY2Nlc3Nvci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL2ZvcnVtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvbWVtYmVyLWFjY2Vzc29yLnRzIiwgInNyYy91dGlsL3F1aWNrLW1vZHVsZS50cyIsICJzcmMvbW9kdWxlL3NpdGUvc2l0ZS1hcHBsaWNhdGlvbi50cyIsICJzcmMvbW9kdWxlL3NpdGUvc2l0ZS1tZW1iZXIudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLWZpbGUudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtbWV0YS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1yZXZpc2lvbi50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1zb3VyY2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2Utdm90ZS50cyIsICJzcmMvbW9kdWxlL3BhZ2Uvc2VhcmNoLXF1ZXJ5LnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zaXRlLWNoYW5nZS50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2VzLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy9zaXRlLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvY2xpZW50L2NsaWVudC50cyIsICJzcmMvbW9kdWxlL2luZGV4LnRzIiwgInNyYy91dGlsL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhlIFdpa2lkb3QgbGlicmFyeVxuICogQWxsIGN1c3RvbSBlcnJvcnMgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdpa2lkb3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIEVycm9yIG5hbWUgKi9cbiAgcHVibGljIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuZXhwZWN0ZWQgZXJyb3JcbiAqIFJlcHJlc2VudHMgaW50ZXJuYWwgaW5jb25zaXN0ZW5jaWVzIG9yIGJ1Z3NcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIEJhc2UgZXJyb3IgZm9yIEFqYXggTW9kdWxlIENvbm5lY3RvciByZWxhdGVkIGlzc3Vlc1xuICovXG5leHBvcnQgY2xhc3MgQU1DRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVFRQIHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBBTUMgcmVxdWVzdCBmYWlscyB3aXRoIGFuIEhUVFAgZXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0h0dHBFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHtcbiAgLyoqIEhUVFAgc3RhdHVzIGNvZGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gSFRUUCBzdGF0dXMgY29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICB9XG59XG5cbi8qKlxuICogV2lraWRvdCBzdGF0dXMgY29kZSBlcnJvclxuICogVGhyb3duIHdoZW4gQU1DIHJlc3BvbnNlIHN0YXR1cyBpcyBub3Qgb2tcbiAqL1xuZXhwb3J0IGNsYXNzIFdpa2lkb3RTdGF0dXNFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHtcbiAgLyoqIFdpa2lkb3Qgc3RhdHVzIGNvZGUgc3RyaW5nICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXNDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gc3RhdHVzQ29kZSAtIFN0YXR1cyBjb2RlIChlLmcuLCAnbm90X29rJywgJ3RyeV9hZ2FpbicpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNwb25zZSBkYXRhIGVycm9yXG4gKiBUaHJvd24gd2hlbiByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZURhdGFFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3Igc2Vzc2lvbiByZWxhdGVkIGlzc3Vlc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogU2Vzc2lvbiBjcmVhdGlvbiBmYWlsdXJlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIGxvZ2luIGF0dGVtcHQgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25DcmVhdGVFcnJvciBleHRlbmRzIFNlc3Npb25FcnJvciB7fVxuXG4vKipcbiAqIExvZ2luIHJlcXVpcmVkIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBhdXRoZW50aWNhdGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgd2l0aG91dCBsb2dpblxuICovXG5leHBvcnQgY2xhc3MgTG9naW5SZXF1aXJlZEVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdMb2dpbiBpcyByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBSZXNvdXJjZSBub3QgZm91bmQgZXJyb3JcbiAqIFRocm93biB3aGVuIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogUmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgZXJyb3JcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgcmVzb3VyY2UgdGhhdCBhbHJlYWR5IGV4aXN0c1xuICovXG5leHBvcnQgY2xhc3MgVGFyZ2V0RXhpc3RzRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBUYXJnZXQgc3RhdGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgcmVzb3VyY2UgaXMgaW4gYW4gaW5vcGVyYWJsZSBzdGF0ZSAoZS5nLiwgbG9ja2VkKVxuICovXG5leHBvcnQgY2xhc3MgVGFyZ2V0RXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBBY2Nlc3MgZGVuaWVkIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgZGVuaWVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICogSFRNTCBlbGVtZW50IG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXF1aXJlZCBlbGVtZW50IGlzIG5vdCBmb3VuZCBkdXJpbmcgcGFyc2luZ1xuICovXG5leHBvcnQgY2xhc3MgTm9FbGVtZW50RXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cbiIsCiAgICAiLy8gQmFzZSBlcnJvcnNcblxuLy8gQU1DIGVycm9yc1xuZXhwb3J0IHsgQU1DRXJyb3IsIEFNQ0h0dHBFcnJvciwgUmVzcG9uc2VEYXRhRXJyb3IsIFdpa2lkb3RTdGF0dXNFcnJvciB9IGZyb20gJy4vYW1jJztcbmV4cG9ydCB7IFVuZXhwZWN0ZWRFcnJvciwgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcbi8vIFNlc3Npb24gZXJyb3JzXG5leHBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIFNlc3Npb25DcmVhdGVFcnJvciwgU2Vzc2lvbkVycm9yIH0gZnJvbSAnLi9zZXNzaW9uJztcblxuLy8gVGFyZ2V0IGVycm9yc1xuZXhwb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXJyb3IsXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxufSBmcm9tICcuL3RhcmdldCc7XG4iLAogICAgIi8qKlxuICogTW9kdWxlIHByb3ZpZGluZyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBUaGlzIG1vZHVsZSBjb25maWd1cmVzIGFuZCBwcm92aWRlcyBsb2dnZXJzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqIEJ5IGRlZmF1bHQsIGl0IGRvZXMgbm90IG91dHB1dCBhbnl0aGluZywgYWxsb3dpbmcgYXBwbGljYXRpb24tc2lkZSBsb2cgY29udHJvbC5cbiAqL1xuXG4vKipcbiAqIExvZyBsZXZlbFxuICovXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4vKipcbiAqIExvZyBsZXZlbCBwcmlvcml0eSAoaGlnaGVyIG51bWJlciA9IG1vcmUgaW1wb3J0YW50KVxuICovXG5jb25zdCBMT0dfTEVWRUxfUFJJT1JJVFk6IFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPiA9IHtcbiAgZGVidWc6IDAsXG4gIGluZm86IDEsXG4gIHdhcm46IDIsXG4gIGVycm9yOiAzLFxufTtcblxuLyoqXG4gKiBMb2dnZXIgaGFuZGxlclxuICovXG5leHBvcnQgdHlwZSBMb2dIYW5kbGVyID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBOdWxsSGFuZGxlcjogT3V0cHV0cyBub3RoaW5nIChkZWZhdWx0KVxuICovXG5leHBvcnQgY29uc3QgbnVsbEhhbmRsZXI6IExvZ0hhbmRsZXIgPSAoKSA9PiB7XG4gIC8vIERvIG5vdGhpbmdcbn07XG5cbi8qKlxuICogQ29uc29sZUhhbmRsZXI6IE91dHB1dHMgdG8gY29uc29sZVxuICovXG5leHBvcnQgY29uc3QgY29uc29sZUhhbmRsZXI6IExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IGAke3RpbWVzdGFtcH0gWyR7bmFtZX0vJHtsZXZlbC50b1VwcGVyQ2FzZSgpfV0gJHttZXNzYWdlfWA7XG5cbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ2RlYnVnJzpcbiAgICAgIGNvbnNvbGUuZGVidWcoZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbmZvJzpcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgY29uc29sZS53YXJuKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZXJyb3InOlxuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vKipcbiAqIExvZ2dlciBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgaGFuZGxlcjogTG9nSGFuZGxlcjtcbiAgcHJpdmF0ZSBsZXZlbDogTG9nTGV2ZWw7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBoYW5kbGVyOiBMb2dIYW5kbGVyID0gbnVsbEhhbmRsZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGhhbmRsZXJcbiAgICovXG4gIHNldEhhbmRsZXIoaGFuZGxlcjogTG9nSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGxvZyBsZXZlbFxuICAgKi9cbiAgc2V0TGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbGV2ZWwgc2hvdWxkIGJlIGxvZ2dlZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRMb2cobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExPR19MRVZFTF9QUklPUklUWVtsZXZlbF0gPj0gTE9HX0xFVkVMX1BSSU9SSVRZW3RoaXMubGV2ZWxdO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBsb2dcbiAgICovXG4gIHByaXZhdGUgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGRMb2cobGV2ZWwpKSB7XG4gICAgICB0aGlzLmhhbmRsZXIobGV2ZWwsIHRoaXMubmFtZSwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZGVidWcnLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdlcnJvcicsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGxvZ2dlclxuICogQHBhcmFtIG5hbWUgLSBMb2dnZXIgbmFtZSAoZGVmYXVsdDogXCJ3aWtpZG90XCIpXG4gKiBAcmV0dXJucyBMb2dnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lID0gJ3dpa2lkb3QnKTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIobmFtZSk7XG59XG5cbi8qKlxuICogU2V0dXAgY29uc29sZSBvdXRwdXQgaGFuZGxlclxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byBjb25maWd1cmVcbiAqIEBwYXJhbSBsZXZlbCAtIExvZyBsZXZlbCAoZGVmYXVsdDogXCJ3YXJuXCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cENvbnNvbGVIYW5kbGVyKGxvZ2dlcjogTG9nZ2VyLCBsZXZlbDogTG9nTGV2ZWwgPSAnd2FybicpOiB2b2lkIHtcbiAgbG9nZ2VyLnNldEhhbmRsZXIoY29uc29sZUhhbmRsZXIpO1xuICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbG9nZ2VyIHVzZWQgdGhyb3VnaG91dCB0aGUgcGFja2FnZVxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiIsCiAgICAiaW1wb3J0IHsgZXJyLCBlcnJBc3luYywgb2ssIG9rQXN5bmMsIHR5cGUgUmVzdWx0LCBSZXN1bHRBc3luYyB9IGZyb20gJ25ldmVydGhyb3cnO1xuaW1wb3J0IHR5cGUgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKiogU3luY2hyb25vdXMgUmVzdWx0IHR5cGUgYWxpYXMgKi9cbmV4cG9ydCB0eXBlIFdpa2lkb3RSZXN1bHQ8VD4gPSBSZXN1bHQ8VCwgV2lraWRvdEVycm9yPjtcblxuLyoqIEFzeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0gUmVzdWx0QXN5bmM8VCwgV2lraWRvdEVycm9yPjtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkT2sgPSA8VD4odmFsdWU6IFQpOiBXaWtpZG90UmVzdWx0PFQ+ID0+IG9rKHZhbHVlKTtcblxuLyoqIENyZWF0ZSBlcnJvciBSZXN1bHQgKi9cbmV4cG9ydCBjb25zdCB3ZEVyciA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHQ8bmV2ZXI+ID0+IGVycihlcnJvcik7XG5cbi8qKiBDcmVhdGUgc3VjY2VzcyBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IHdkT2tBc3luYyA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHRBc3luYzxUPiA9PiBva0FzeW5jKHZhbHVlKTtcblxuLyoqIENyZWF0ZSBlcnJvciBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyQXN5bmMgPSA8RSBleHRlbmRzIFdpa2lkb3RFcnJvcj4oZXJyb3I6IEUpOiBXaWtpZG90UmVzdWx0QXN5bmM8bmV2ZXI+ID0+XG4gIGVyckFzeW5jKGVycm9yKTtcblxuLyoqIENvbnZlcnQgZnJvbSBQcm9taXNlICovXG5leHBvcnQgY29uc3QgZnJvbVByb21pc2UgPSA8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGVycm9yTWFwcGVyOiAoZXJyb3I6IHVua25vd24pID0+IFdpa2lkb3RFcnJvclxuKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yTWFwcGVyKTtcblxuLyoqIENvbWJpbmUgbXVsdGlwbGUgUmVzdWx0QXN5bmMgKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lUmVzdWx0cyA9IDxUPihyZXN1bHRzOiBXaWtpZG90UmVzdWx0QXN5bmM8VD5bXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxUW10+ID0+XG4gIFJlc3VsdEFzeW5jLmNvbWJpbmUocmVzdWx0cyk7XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vY29tbW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdWx0JztcbiIsCiAgICAiLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ0NvbmZpZyB7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgKG1pbGxpc2Vjb25kcykgKi9cbiAgdGltZW91dDogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIHJldHJ5IGNvdW50ICovXG4gIHJldHJ5TGltaXQ6IG51bWJlcjtcblxuICAvKiogQmFzZSByZXRyeSBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKSAqL1xuICByZXRyeUludGVydmFsOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gYmFja29mZiAobWlsbGlzZWNvbmRzKSAqL1xuICBtYXhCYWNrb2ZmOiBudW1iZXI7XG5cbiAgLyoqIEJhY2tvZmYgZmFjdG9yICovXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBjb25jdXJyZW50IHJlcXVlc3RzICovXG4gIHNlbWFwaG9yZUxpbWl0OiBudW1iZXI7XG59XG5cbi8qKiBEZWZhdWx0IEFNQyBjb25maWd1cmF0aW9uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTUNfQ09ORklHOiBBTUNDb25maWcgPSB7XG4gIHRpbWVvdXQ6IDIwMDAwLFxuICByZXRyeUxpbWl0OiA1LFxuICByZXRyeUludGVydmFsOiAxMDAwLFxuICBtYXhCYWNrb2ZmOiA2MDAwMCxcbiAgYmFja29mZkZhY3RvcjogMi4wLFxuICBzZW1hcGhvcmVMaW1pdDogMTAsXG59O1xuXG4vKipcbiAqIEZpeGVkIHRva2VuIHZhbHVlIHJlcXVpcmVkIGJ5IFdpa2lkb3RcbiAqIFRoaXMgaXMgYSBmaXhlZCB2YWx1ZSBvYnRhaW5lZCBmcm9tIFdpa2lkb3QncyBmcm9udGVuZCxcbiAqIHVzZWQgYXMgYW4gaWRlbnRpZmllciByYXRoZXIgdGhhbiBhIHNlY3VyaXR5IHRva2VuXG4gKi9cbmV4cG9ydCBjb25zdCBXSUtJRE9UX1RPS0VONyA9ICcxMjM0NTYnO1xuXG4vKipcbiAqIEZhbGxiYWNrIEhUVFAgc3RhdHVzIGNvZGUgZm9yIEhUVFAgZXJyb3JzXG4gKiBVc2VkIHdoZW4gc3RhdHVzIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUgPSA5OTk7XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBBbm9ueW1vdXMgdXNlclxuICovXG5leHBvcnQgY2xhc3MgQW5vbnltb3VzVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgYW5vbnltb3VzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIFVzZXJuYW1lIChcIkFub255bW91c1wiIGZvciBhbm9ueW1vdXMgdXNlcnMpICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnQW5vbnltb3VzJztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnYW5vbnltb3VzJztcblxuICAvKiogQXZhdGFyIFVSTCAobnVsbCBmb3IgYW5vbnltb3VzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZztcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnYW5vbnltb3VzJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgaXA6IHN0cmluZykge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaXAgPSBpcDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgQW5vbnltb3VzVXNlcihuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgaXA9JHt0aGlzLmlwfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBEZWxldGVkIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlbGV0ZWRVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBEZWxldGVkIHVzZXIgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFVzZXJuYW1lIChcImFjY291bnQgZGVsZXRlZFwiIGZvciBkZWxldGVkIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ2FjY291bnQgZGVsZXRlZCc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2FjY291bnRfZGVsZXRlZCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGRlbGV0ZWQpICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICdkZWxldGVkJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgaWQ6IG51bWJlcikge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRGVsZXRlZFVzZXIoaWQ9JHt0aGlzLmlkfSwgbmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogR3Vlc3QgdXNlclxuICovXG5leHBvcnQgY2xhc3MgR3Vlc3RVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICgwIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBHdWVzdCBuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lIChudWxsIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogQXZhdGFyIFVSTCAobWF5IGJlIEdyYXZhdGFyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciBndWVzdCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZ3Vlc3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lOiBzdHJpbmcsIGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXZhdGFyVXJsID0gYXZhdGFyVXJsO1xuICB9XG5cbiAgLy8gQWJzdHJhY3RVc2VyIGltcGxlbWVudGF0aW9uXG4gIGlzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBHdWVzdFVzZXIobmFtZT0ke3RoaXMubmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICIvKipcbiAqIE1hcHBpbmcgdGFibGUgZm9yIGNvbnZlcnRpbmcgc3BlY2lhbCBzeW1ib2xzIGFuZCBub24tRW5nbGlzaCBhbHBoYWJldHMgdG8gRW5nbGlzaCBhbHBoYWJldHNcbiAqXG4gKiBQcm92aWRlcyBtYXBwaW5nIGZvciBjb252ZXJ0aW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHRvIGNvcnJlc3BvbmRpbmcgQVNDSUkgY2hhcmFjdGVycy5cbiAqIE1haW5seSB1c2VkIGZvciBVUkwgZ2VuZXJhdGlvbiBhbmQgcGFnZSBuYW1lIGNvbnZlcnNpb24gdG8gdW5peCBmb3JtYXQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHNwZWNpYWxDaGFyTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnXFx1MDBDMCc6ICdhJyxcbiAgJ1xcdTAwQzEnOiAnYScsXG4gICdcXHUwMEMyJzogJ2EnLFxuICAnXFx1MDBDMyc6ICdhJyxcbiAgJ1xcdTAwQzQnOiAnYWUnLFxuICAnXFx1MDBDNSc6ICdhJyxcbiAgJ1xcdTAwQzYnOiAnYWUnLFxuICAnXFx1MDBDNyc6ICdjJyxcbiAgJ1xcdTAwQzgnOiAnZScsXG4gICdcXHUwMEM5JzogJ2UnLFxuICAnXFx1MDBDQSc6ICdlJyxcbiAgJ1xcdTAwQ0InOiAnZScsXG4gICdcXHUwMENDJzogJ2knLFxuICAnXFx1MDBDRCc6ICdpJyxcbiAgJ1xcdTAwQ0UnOiAnaScsXG4gICdcXHUwMENGJzogJ2knLFxuICAnXFx1MDBEMCc6ICdkJyxcbiAgJ1xcdTAwRDEnOiAnbicsXG4gICdcXHUwMEQyJzogJ28nLFxuICAnXFx1MDBEMyc6ICdvJyxcbiAgJ1xcdTAwRDQnOiAnbycsXG4gICdcXHUwMEQ1JzogJ28nLFxuICAnXFx1MDBENic6ICdvZScsXG4gICdcXHUwMEQ4JzogJ28nLFxuICAnXFx1MDBEOSc6ICd1JyxcbiAgJ1xcdTAwREEnOiAndScsXG4gICdcXHUwMERCJzogJ3UnLFxuICAnXFx1MDBEQyc6ICd1ZScsXG4gICdcXHUwMEREJzogJ3knLFxuICAnXFx1MDBERSc6ICd0JyxcbiAgJ1xcdTAwREYnOiAnc3MnLFxuICAnXFx1MDBFMCc6ICdhJyxcbiAgJ1xcdTAwRTEnOiAnYScsXG4gICdcXHUwMEUyJzogJ2EnLFxuICAnXFx1MDBFMyc6ICdhJyxcbiAgJ1xcdTAwRTQnOiAnYWUnLFxuICAnXFx1MDBFNSc6ICdhJyxcbiAgJ1xcdTAwRTYnOiAnYWUnLFxuICAnXFx1MDBFNyc6ICdjJyxcbiAgJ1xcdTAwRTgnOiAnZScsXG4gICdcXHUwMEU5JzogJ2UnLFxuICAnXFx1MDBFQSc6ICdlJyxcbiAgJ1xcdTAwRUInOiAnZScsXG4gICdcXHUwMEVDJzogJ2knLFxuICAnXFx1MDBFRCc6ICdpJyxcbiAgJ1xcdTAwRUUnOiAnaScsXG4gICdcXHUwMEVGJzogJ2knLFxuICAnXFx1MDBGMCc6ICdkJyxcbiAgJ1xcdTAwRjEnOiAnbicsXG4gICdcXHUwMEYyJzogJ28nLFxuICAnXFx1MDBGMyc6ICdvJyxcbiAgJ1xcdTAwRjQnOiAnbycsXG4gICdcXHUwMEY1JzogJ28nLFxuICAnXFx1MDBGNic6ICdvZScsXG4gICdcXHUwMEY4JzogJ28nLFxuICAnXFx1MDBGOSc6ICd1JyxcbiAgJ1xcdTAwRkEnOiAndScsXG4gICdcXHUwMEZCJzogJ3UnLFxuICAnXFx1MDBGQyc6ICd1ZScsXG4gICdcXHUwMEZEJzogJ3knLFxuICAnXFx1MDBGRSc6ICd0JyxcbiAgJ1xcdTAwRkYnOiAneScsXG4gICdcXHUwMTAwJzogJ2EnLFxuICAnXFx1MDEwMSc6ICdhJyxcbiAgJ1xcdTAxMDInOiAnYScsXG4gICdcXHUwMTAzJzogJ2EnLFxuICAnXFx1MDEwNCc6ICdhJyxcbiAgJ1xcdTAxMDUnOiAnYScsXG4gICdcXHUwMTA2JzogJ2MnLFxuICAnXFx1MDEwNyc6ICdjJyxcbiAgJ1xcdTAxMDgnOiAnYycsXG4gICdcXHUwMTA5JzogJ2MnLFxuICAnXFx1MDEwQSc6ICdjJyxcbiAgJ1xcdTAxMEInOiAnYycsXG4gICdcXHUwMTBDJzogJ2MnLFxuICAnXFx1MDEwRCc6ICdjJyxcbiAgJ1xcdTAxMEUnOiAnZCcsXG4gICdcXHUwMTBGJzogJ2QnLFxuICAnXFx1MDExMCc6ICdkJyxcbiAgJ1xcdTAxMTEnOiAnZCcsXG4gICdcXHUwMTEyJzogJ2UnLFxuICAnXFx1MDExMyc6ICdlJyxcbiAgJ1xcdTAxMTQnOiAnZScsXG4gICdcXHUwMTE1JzogJ2UnLFxuICAnXFx1MDExNic6ICdlJyxcbiAgJ1xcdTAxMTcnOiAnZScsXG4gICdcXHUwMTE4JzogJ2UnLFxuICAnXFx1MDExOSc6ICdlJyxcbiAgJ1xcdTAxMUEnOiAnZScsXG4gICdcXHUwMTFCJzogJ2UnLFxuICAnXFx1MDExQyc6ICdnJyxcbiAgJ1xcdTAxMUQnOiAnZycsXG4gICdcXHUwMTFFJzogJ2cnLFxuICAnXFx1MDExRic6ICdnJyxcbiAgJ1xcdTAxMjAnOiAnZycsXG4gICdcXHUwMTIxJzogJ2cnLFxuICAnXFx1MDEyMic6ICdnJyxcbiAgJ1xcdTAxMjMnOiAnZycsXG4gICdcXHUwMTI0JzogJ2gnLFxuICAnXFx1MDEyNSc6ICdoJyxcbiAgJ1xcdTAxMjYnOiAnaCcsXG4gICdcXHUwMTI3JzogJ2gnLFxuICAnXFx1MDEyOCc6ICdpJyxcbiAgJ1xcdTAxMjknOiAnaScsXG4gICdcXHUwMTJBJzogJ2knLFxuICAnXFx1MDEyQic6ICdpJyxcbiAgJ1xcdTAxMkMnOiAnaScsXG4gICdcXHUwMTJEJzogJ2knLFxuICAnXFx1MDEyRSc6ICdpJyxcbiAgJ1xcdTAxMkYnOiAnaScsXG4gICdcXHUwMTMwJzogJ2knLFxuICAnXFx1MDEzMSc6ICdpJyxcbiAgJ1xcdTAxMzInOiAnaWonLFxuICAnXFx1MDEzMyc6ICdpaicsXG4gICdcXHUwMTM0JzogJ2onLFxuICAnXFx1MDEzNSc6ICdqJyxcbiAgJ1xcdTAxMzYnOiAnaycsXG4gICdcXHUwMTM3JzogJ2snLFxuICAnXFx1MDEzOCc6ICdrJyxcbiAgJ1xcdTAxMzknOiAnbCcsXG4gICdcXHUwMTNBJzogJ2wnLFxuICAnXFx1MDEzQic6ICdsJyxcbiAgJ1xcdTAxM0MnOiAnbCcsXG4gICdcXHUwMTNEJzogJ2wnLFxuICAnXFx1MDEzRSc6ICdsJyxcbiAgJ1xcdTAxM0YnOiAnbCcsXG4gICdcXHUwMTQwJzogJ2wnLFxuICAnXFx1MDE0MSc6ICdsJyxcbiAgJ1xcdTAxNDInOiAnbCcsXG4gICdcXHUwMTQzJzogJ24nLFxuICAnXFx1MDE0NCc6ICduJyxcbiAgJ1xcdTAxNDUnOiAnbicsXG4gICdcXHUwMTQ2JzogJ24nLFxuICAnXFx1MDE0Nyc6ICduJyxcbiAgJ1xcdTAxNDgnOiAnbicsXG4gICdcXHUwMTQ5JzogJ24nLFxuICAnXFx1MDE0QSc6ICduJyxcbiAgJ1xcdTAxNEInOiAnbicsXG4gICdcXHUwMTRDJzogJ28nLFxuICAnXFx1MDE0RCc6ICdvJyxcbiAgJ1xcdTAxNEUnOiAnbycsXG4gICdcXHUwMTRGJzogJ28nLFxuICAnXFx1MDE1MCc6ICdvJyxcbiAgJ1xcdTAxNTEnOiAnbycsXG4gICdcXHUwMTUyJzogJ29lJyxcbiAgJ1xcdTAxNTMnOiAnb2UnLFxuICAnXFx1MDE1NCc6ICdyJyxcbiAgJ1xcdTAxNTUnOiAncicsXG4gICdcXHUwMTU2JzogJ3InLFxuICAnXFx1MDE1Nyc6ICdyJyxcbiAgJ1xcdTAxNTgnOiAncicsXG4gICdcXHUwMTU5JzogJ3InLFxuICAnXFx1MDE1QSc6ICdzJyxcbiAgJ1xcdTAxNUInOiAncycsXG4gICdcXHUwMTVDJzogJ3MnLFxuICAnXFx1MDE1RCc6ICdzJyxcbiAgJ1xcdTAxNUUnOiAncycsXG4gICdcXHUwMTVGJzogJ3MnLFxuICAnXFx1MDE2MCc6ICdzJyxcbiAgJ1xcdTAxNjEnOiAncycsXG4gICdcXHUwMTYyJzogJ3QnLFxuICAnXFx1MDE2Myc6ICd0JyxcbiAgJ1xcdTAxNjQnOiAndCcsXG4gICdcXHUwMTY1JzogJ3QnLFxuICAnXFx1MDE2Nic6ICd0JyxcbiAgJ1xcdTAxNjcnOiAndCcsXG4gICdcXHUwMTY4JzogJ3UnLFxuICAnXFx1MDE2OSc6ICd1JyxcbiAgJ1xcdTAxNkEnOiAndScsXG4gICdcXHUwMTZCJzogJ3UnLFxuICAnXFx1MDE2Qyc6ICd1JyxcbiAgJ1xcdTAxNkQnOiAndScsXG4gICdcXHUwMTZFJzogJ3UnLFxuICAnXFx1MDE2Ric6ICd1JyxcbiAgJ1xcdTAxNzAnOiAndScsXG4gICdcXHUwMTcxJzogJ3UnLFxuICAnXFx1MDE3Mic6ICd1JyxcbiAgJ1xcdTAxNzMnOiAndScsXG4gICdcXHUwMTc0JzogJ3cnLFxuICAnXFx1MDE3NSc6ICd3JyxcbiAgJ1xcdTAxNzYnOiAneScsXG4gICdcXHUwMTc3JzogJ3knLFxuICAnXFx1MDE3OCc6ICd5JyxcbiAgJ1xcdTAxNzknOiAneicsXG4gICdcXHUwMTdBJzogJ3onLFxuICAnXFx1MDE3Qic6ICd6JyxcbiAgJ1xcdTAxN0MnOiAneicsXG4gICdcXHUwMTdEJzogJ3onLFxuICAnXFx1MDE3RSc6ICd6JyxcbiAgJ1xcdTAxN0YnOiAnc3MnLFxuICAnXFx1MDE5MSc6ICdmJyxcbiAgJ1xcdTAxOTInOiAnZicsXG4gICdcXHUwMjE4JzogJ3MnLFxuICAnXFx1MDIxOSc6ICdzJyxcbiAgJ1xcdTAyMUEnOiAndCcsXG4gICdcXHUwMjFCJzogJ3QnLFxuICAnXFx1MDM4Nic6ICdhJyxcbiAgJ1xcdTAzODgnOiAnZScsXG4gICdcXHUwMzg5JzogJ2knLFxuICAnXFx1MDM4QSc6ICdpJyxcbiAgJ1xcdTAzOEMnOiAnbycsXG4gICdcXHUwMzhFJzogJ3knLFxuICAnXFx1MDM4Ric6ICdvJyxcbiAgJ1xcdTAzOTAnOiAnaScsXG4gICdcXHUwMzkxJzogJ2EnLFxuICAnXFx1MDM5Mic6ICd2JyxcbiAgJ1xcdTAzOTMnOiAnZycsXG4gICdcXHUwMzk0JzogJ2QnLFxuICAnXFx1MDM5NSc6ICdlJyxcbiAgJ1xcdTAzOTYnOiAneicsXG4gICdcXHUwMzk3JzogJ2knLFxuICAnXFx1MDM5OCc6ICd0aCcsXG4gICdcXHUwMzk5JzogJ2knLFxuICAnXFx1MDM5QSc6ICdrJyxcbiAgJ1xcdTAzOUInOiAnbCcsXG4gICdcXHUwMzlDJzogJ20nLFxuICAnXFx1MDM5RCc6ICduJyxcbiAgJ1xcdTAzOUUnOiAneCcsXG4gICdcXHUwMzlGJzogJ28nLFxuICAnXFx1MDNBMCc6ICdwJyxcbiAgJ1xcdTAzQTEnOiAncicsXG4gICdcXHUwM0EzJzogJ3MnLFxuICAnXFx1MDNBNCc6ICd0JyxcbiAgJ1xcdTAzQTUnOiAneScsXG4gICdcXHUwM0E2JzogJ2YnLFxuICAnXFx1MDNBNyc6ICdjaCcsXG4gICdcXHUwM0E4JzogJ3BzJyxcbiAgJ1xcdTAzQTknOiAnbycsXG4gICdcXHUwM0FBJzogJ2knLFxuICAnXFx1MDNBQic6ICd5JyxcbiAgJ1xcdTAzQUMnOiAnYScsXG4gICdcXHUwM0FEJzogJ2UnLFxuICAnXFx1MDNBRSc6ICdpJyxcbiAgJ1xcdTAzQUYnOiAnaScsXG4gICdcXHUwM0IwJzogJ3knLFxuICAnXFx1MDNCMSc6ICdhJyxcbiAgJ1xcdTAzQjInOiAndicsXG4gICdcXHUwM0IzJzogJ2cnLFxuICAnXFx1MDNCNCc6ICdkJyxcbiAgJ1xcdTAzQjUnOiAnZScsXG4gICdcXHUwM0I2JzogJ3onLFxuICAnXFx1MDNCNyc6ICdpJyxcbiAgJ1xcdTAzQjgnOiAndGgnLFxuICAnXFx1MDNCOSc6ICdpJyxcbiAgJ1xcdTAzQkEnOiAnaycsXG4gICdcXHUwM0JCJzogJ2wnLFxuICAnXFx1MDNCQyc6ICdtJyxcbiAgJ1xcdTAzQkQnOiAnbicsXG4gICdcXHUwM0JFJzogJ3gnLFxuICAnXFx1MDNCRic6ICdvJyxcbiAgJ1xcdTAzQzAnOiAncCcsXG4gICdcXHUwM0MxJzogJ3InLFxuICAnXFx1MDNDMic6ICdzJyxcbiAgJ1xcdTAzQzMnOiAncycsXG4gICdcXHUwM0M0JzogJ3QnLFxuICAnXFx1MDNDNSc6ICd5JyxcbiAgJ1xcdTAzQzYnOiAnZicsXG4gICdcXHUwM0M3JzogJ2NoJyxcbiAgJ1xcdTAzQzgnOiAncHMnLFxuICAnXFx1MDNDOSc6ICdvJyxcbiAgJ1xcdTAzQ0EnOiAnaScsXG4gICdcXHUwM0NCJzogJ3knLFxuICAnXFx1MDNDQyc6ICdvJyxcbiAgJ1xcdTAzQ0QnOiAneScsXG4gICdcXHUwM0NFJzogJ28nLFxuICAnXFx1MDNEMSc6ICd0aCcsXG4gICdcXHUwNDAxJzogJ2UnLFxuICAnXFx1MDQwMic6ICdkJyxcbiAgJ1xcdTA0MDMnOiAnZycsXG4gICdcXHUwNDA0JzogJ2UnLFxuICAnXFx1MDQwNSc6ICd6JyxcbiAgJ1xcdTA0MDYnOiAnaScsXG4gICdcXHUwNDA3JzogJ2knLFxuICAnXFx1MDQwOCc6ICdqJyxcbiAgJ1xcdTA0MDknOiAnbCcsXG4gICdcXHUwNDBBJzogJ24nLFxuICAnXFx1MDQwQic6ICdjJyxcbiAgJ1xcdTA0MEMnOiAnaycsXG4gICdcXHUwNDBFJzogJ3UnLFxuICAnXFx1MDQwRic6ICdkJyxcbiAgJ1xcdTA0MTAnOiAnYScsXG4gICdcXHUwNDExJzogJ2InLFxuICAnXFx1MDQxMic6ICd2JyxcbiAgJ1xcdTA0MTMnOiAnZycsXG4gICdcXHUwNDE0JzogJ2QnLFxuICAnXFx1MDQxNSc6ICdlJyxcbiAgJ1xcdTA0MTYnOiAneicsXG4gICdcXHUwNDE3JzogJ3onLFxuICAnXFx1MDQxOCc6ICdpJyxcbiAgJ1xcdTA0MTknOiAnaicsXG4gICdcXHUwNDFBJzogJ2snLFxuICAnXFx1MDQxQic6ICdsJyxcbiAgJ1xcdTA0MUMnOiAnbScsXG4gICdcXHUwNDFEJzogJ24nLFxuICAnXFx1MDQxRSc6ICdvJyxcbiAgJ1xcdTA0MUYnOiAncCcsXG4gICdcXHUwNDIwJzogJ3InLFxuICAnXFx1MDQyMSc6ICdzJyxcbiAgJ1xcdTA0MjInOiAndCcsXG4gICdcXHUwNDIzJzogJ3UnLFxuICAnXFx1MDQyNCc6ICdmJyxcbiAgJ1xcdTA0MjUnOiAnaCcsXG4gICdcXHUwNDI2JzogJ2MnLFxuICAnXFx1MDQyNyc6ICdjJyxcbiAgJ1xcdTA0MjgnOiAncycsXG4gICdcXHUwNDI5JzogJ3MnLFxuICAnXFx1MDQyQic6ICd5JyxcbiAgJ1xcdTA0MkQnOiAnZScsXG4gICdcXHUwNDJFJzogJ3UnLFxuICAnXFx1MDQyRic6ICdhJyxcbiAgJ1xcdTA0MzAnOiAnYScsXG4gICdcXHUwNDMxJzogJ2InLFxuICAnXFx1MDQzMic6ICd2JyxcbiAgJ1xcdTA0MzMnOiAnZycsXG4gICdcXHUwNDM0JzogJ2QnLFxuICAnXFx1MDQzNSc6ICdlJyxcbiAgJ1xcdTA0MzYnOiAneicsXG4gICdcXHUwNDM3JzogJ3onLFxuICAnXFx1MDQzOCc6ICdpJyxcbiAgJ1xcdTA0MzknOiAnaicsXG4gICdcXHUwNDNBJzogJ2snLFxuICAnXFx1MDQzQic6ICdsJyxcbiAgJ1xcdTA0M0MnOiAnbScsXG4gICdcXHUwNDNEJzogJ24nLFxuICAnXFx1MDQzRSc6ICdvJyxcbiAgJ1xcdTA0M0YnOiAncCcsXG4gICdcXHUwNDQwJzogJ3InLFxuICAnXFx1MDQ0MSc6ICdzJyxcbiAgJ1xcdTA0NDInOiAndCcsXG4gICdcXHUwNDQzJzogJ3UnLFxuICAnXFx1MDQ0NCc6ICdmJyxcbiAgJ1xcdTA0NDUnOiAnaCcsXG4gICdcXHUwNDQ2JzogJ2MnLFxuICAnXFx1MDQ0Nyc6ICdjJyxcbiAgJ1xcdTA0NDgnOiAncycsXG4gICdcXHUwNDQ5JzogJ3MnLFxuICAnXFx1MDQ0Qic6ICd5JyxcbiAgJ1xcdTA0NEQnOiAnZScsXG4gICdcXHUwNDRFJzogJ3UnLFxuICAnXFx1MDQ0Ric6ICdhJyxcbiAgJ1xcdTA0NTEnOiAnZScsXG4gICdcXHUwNDUyJzogJ2QnLFxuICAnXFx1MDQ1Myc6ICdnJyxcbiAgJ1xcdTA0NTQnOiAnZScsXG4gICdcXHUwNDU1JzogJ3onLFxuICAnXFx1MDQ1Nic6ICdpJyxcbiAgJ1xcdTA0NTcnOiAnaScsXG4gICdcXHUwNDU4JzogJ2onLFxuICAnXFx1MDQ1OSc6ICdsJyxcbiAgJ1xcdTA0NUEnOiAnbicsXG4gICdcXHUwNDVCJzogJ2MnLFxuICAnXFx1MDQ1Qyc6ICdrJyxcbiAgJ1xcdTA0NUUnOiAndScsXG4gICdcXHUwNDVGJzogJ2QnLFxuICAnXFx1MDQ2Mic6ICdlJyxcbiAgJ1xcdTA0NjMnOiAnZScsXG4gICdcXHUwNDZBJzogJ2EnLFxuICAnXFx1MDQ2Qic6ICdhJyxcbiAgJ1xcdTA0NzInOiAnZicsXG4gICdcXHUwNDczJzogJ2YnLFxuICAnXFx1MDQ3NCc6ICd5JyxcbiAgJ1xcdTA0NzUnOiAneScsXG4gICdcXHUwNDkwJzogJ2cnLFxuICAnXFx1MDQ5MSc6ICdnJyxcbiAgJ1xcdTA0OTInOiAnZycsXG4gICdcXHUwNDkzJzogJ2cnLFxuICAnXFx1MDQ5NCc6ICdnJyxcbiAgJ1xcdTA0OTUnOiAnZycsXG4gICdcXHUwNDk2JzogJ3onLFxuICAnXFx1MDQ5Nyc6ICd6JyxcbiAgJ1xcdTA0OUEnOiAnaycsXG4gICdcXHUwNDlCJzogJ2snLFxuICAnXFx1MDQ5Qyc6ICdrJyxcbiAgJ1xcdTA0OUQnOiAnaycsXG4gICdcXHUwNDlFJzogJ2snLFxuICAnXFx1MDQ5Ric6ICdrJyxcbiAgJ1xcdTA0QTAnOiAnaycsXG4gICdcXHUwNEExJzogJ2snLFxuICAnXFx1MDRBMic6ICduJyxcbiAgJ1xcdTA0QTMnOiAnbicsXG4gICdcXHUwNEE0JzogJ24nLFxuICAnXFx1MDRBNSc6ICduJyxcbiAgJ1xcdTA0QTYnOiAncCcsXG4gICdcXHUwNEE3JzogJ3AnLFxuICAnXFx1MDRBOCc6ICdvJyxcbiAgJ1xcdTA0QTknOiAnbycsXG4gICdcXHUwNEFBJzogJ3MnLFxuICAnXFx1MDRBQic6ICdzJyxcbiAgJ1xcdTA0QUMnOiAndCcsXG4gICdcXHUwNEFEJzogJ3QnLFxuICAnXFx1MDRBRSc6ICd1JyxcbiAgJ1xcdTA0QUYnOiAndScsXG4gICdcXHUwNEIwJzogJ3UnLFxuICAnXFx1MDRCMSc6ICd1JyxcbiAgJ1xcdTA0QjInOiAnaCcsXG4gICdcXHUwNEIzJzogJ2gnLFxuICAnXFx1MDRCNCc6ICdjJyxcbiAgJ1xcdTA0QjUnOiAnYycsXG4gICdcXHUwNEI2JzogJ2MnLFxuICAnXFx1MDRCNyc6ICdjJyxcbiAgJ1xcdTA0QjgnOiAnYycsXG4gICdcXHUwNEI5JzogJ2MnLFxuICAnXFx1MDRCQSc6ICdoJyxcbiAgJ1xcdTA0QkInOiAnaCcsXG4gICdcXHUwNEJDJzogJ2MnLFxuICAnXFx1MDRCRCc6ICdjJyxcbiAgJ1xcdTA0QkUnOiAnYycsXG4gICdcXHUwNEJGJzogJ2MnLFxuICAnXFx1MDRDMSc6ICd6JyxcbiAgJ1xcdTA0QzInOiAneicsXG4gICdcXHUwNEMzJzogJ2snLFxuICAnXFx1MDRDNCc6ICdrJyxcbiAgJ1xcdTA0QzUnOiAnbCcsXG4gICdcXHUwNEM2JzogJ2wnLFxuICAnXFx1MDRDNyc6ICduJyxcbiAgJ1xcdTA0QzgnOiAnbicsXG4gICdcXHUwNEM5JzogJ24nLFxuICAnXFx1MDRDQSc6ICduJyxcbiAgJ1xcdTA0Q0InOiAnYycsXG4gICdcXHUwNENDJzogJ2MnLFxuICAnXFx1MDREMCc6ICdhJyxcbiAgJ1xcdTA0RDEnOiAnYScsXG4gICdcXHUwNEQyJzogJ2EnLFxuICAnXFx1MDREMyc6ICdhJyxcbiAgJ1xcdTA0RDQnOiAnYWUnLFxuICAnXFx1MDRENSc6ICdhZScsXG4gICdcXHUwNEQ2JzogJ2UnLFxuICAnXFx1MDRENyc6ICdlJyxcbiAgJ1xcdTA0RDgnOiAnYScsXG4gICdcXHUwNEQ5JzogJ2EnLFxuICAnXFx1MDREQSc6ICdhJyxcbiAgJ1xcdTA0REInOiAnYScsXG4gICdcXHUwNERDJzogJ3onLFxuICAnXFx1MDRERCc6ICd6JyxcbiAgJ1xcdTA0REUnOiAneicsXG4gICdcXHUwNERGJzogJ3onLFxuICAnXFx1MDRFMCc6ICd6JyxcbiAgJ1xcdTA0RTEnOiAneicsXG4gICdcXHUwNEUyJzogJ2knLFxuICAnXFx1MDRFMyc6ICdpJyxcbiAgJ1xcdTA0RTQnOiAnaScsXG4gICdcXHUwNEU1JzogJ2knLFxuICAnXFx1MDRFNic6ICdvJyxcbiAgJ1xcdTA0RTcnOiAnbycsXG4gICdcXHUwNEU4JzogJ28nLFxuICAnXFx1MDRFOSc6ICdvJyxcbiAgJ1xcdTA0RUEnOiAnbycsXG4gICdcXHUwNEVCJzogJ28nLFxuICAnXFx1MDRFRSc6ICd1JyxcbiAgJ1xcdTA0RUYnOiAndScsXG4gICdcXHUwNEYwJzogJ3UnLFxuICAnXFx1MDRGMSc6ICd1JyxcbiAgJ1xcdTA0RjInOiAndScsXG4gICdcXHUwNEYzJzogJ3UnLFxuICAnXFx1MDRGNCc6ICdjJyxcbiAgJ1xcdTA0RjUnOiAnYycsXG4gICdcXHUwNEY4JzogJ3knLFxuICAnXFx1MDRGOSc6ICd5JyxcbiAgJ1xcdTA1MEEnOiAnbicsXG4gICdcXHUwNTBCJzogJ24nLFxuICAnXFx1MDUwRSc6ICd0JyxcbiAgJ1xcdTA1MEYnOiAndCcsXG4gICdcXHUwNTFBJzogJ3EnLFxuICAnXFx1MDUxQic6ICdxJyxcbiAgJ1xcdTA1MUMnOiAndycsXG4gICdcXHUwNTFEJzogJ3cnLFxufTtcbiIsCiAgICAiLyoqXG4gKiBTdHJpbmcgdXRpbGl0aWVzXG4gKi9cblxuaW1wb3J0IHsgc3BlY2lhbENoYXJNYXAgfSBmcm9tICcuL3RhYmxlL2NoYXItdGFibGUnO1xuXG4vKipcbiAqIENvbnZlcnQgc3RyaW5nIHRvIFVuaXggZm9ybWF0XG4gKlxuICogUGVyZm9ybXMgY29udmVyc2lvbiBmb2xsb3dpbmcgbGVnYWN5IHdpa2lkb3QgaW1wbGVtZW50YXRpb24uXG4gKiAtIENvbnZlcnRzIHNwZWNpYWwgY2hhcmFjdGVycyB0byBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAtIENvbnZlcnRzIHRvIGxvd2VyY2FzZVxuICogLSBDb252ZXJ0cyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBoeXBoZW5zXG4gKiAtIFJlZHVjZXMgY29uc2VjdXRpdmUgaHlwaGVucy9jb2xvbnMgdG8gc2luZ2xlXG4gKiAtIFJlbW92ZXMgbGVhZGluZy90cmFpbGluZyBoeXBoZW5zL2NvbG9uc1xuICpcbiAqIEBwYXJhbSB0YXJnZXRTdHIgLSBTdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybnMgQ29udmVydGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Vbml4KHRhcmdldFN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ29udmVydCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdGFyZ2V0U3RyKSB7XG4gICAgY29uc3QgbWFwcGVkID0gc3BlY2lhbENoYXJNYXBbY2hhcl07XG4gICAgcmVzdWx0ICs9IG1hcHBlZCAhPT0gdW5kZWZpbmVkID8gbWFwcGVkIDogY2hhcjtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gIHJlc3VsdCA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIFJlbW92ZSBub24tQVNDSUkgY2hhcmFjdGVyc1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvW15hLXowLTlcXC06X10vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL15fLywgJzpfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8oPzwhOilfL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eLSovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tKiQvLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tezIsfS9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOnsyLH0vZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzotL2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tOi9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXy0vZywgJ18nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLy1fL2csICdfJyk7XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNvbG9uc1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXjovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86JC8sICcnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZ1V0aWwgY2xhc3MgKFB5dGhvbiBjb21wYXRpYmxlKVxuICovXG5leHBvcnQgY29uc3QgU3RyaW5nVXRpbCA9IHtcbiAgdG9Vbml4LFxufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcblxuLyoqXG4gKiBVc2VyIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8VXNlciB8IG51bGw+IHtcbiAgY29uc3RydWN0b3IodXNlcnM/OiAoVXNlciB8IG51bGwpW10pIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh1c2Vycykge1xuICAgICAgdGhpcy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VybmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFVzZXIgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyTmFtZSkge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IHVzZXIgSURcbiAgICogQHBhcmFtIGlkIC0gVXNlciBJRFxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdXNlciBvZiB0aGlzKSB7XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gb25seSBub24tbnVsbCB1c2Vyc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBub24tbnVsbCB1c2Vyc1xuICAgKi9cbiAgZmlsdGVyTm9uTnVsbCgpOiBVc2VyW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcigodXNlcik6IHVzZXIgaXMgVXNlciA9PiB1c2VyICE9PSBudWxsKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHBMaW1pdCBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgdG9Vbml4IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJpbmctdXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5pbXBvcnQgeyBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4vdXNlci1jb2xsZWN0aW9uJztcblxuLyoqXG4gKiBVc2VyIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRGF0YSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBhdmF0YXJVcmw/OiBzdHJpbmcgfCBudWxsO1xuICB1bml4TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWd1bGFyIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERpc3BsYXkgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIElQIGFkZHJlc3MgKG51bGwgZm9yIHJlZ3VsYXIgdXNlcnMpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3VzZXInO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmLCBkYXRhOiBVc2VyRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGF0YS5kaXNwbGF5TmFtZSA/PyBudWxsO1xuICAgIHRoaXMuYXZhdGFyVXJsID0gZGF0YS5hdmF0YXJVcmwgPz8gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7ZGF0YS5pZH1gO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lID8/IHRvVW5peChkYXRhLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGZyb20gdXNlcm5hbWVcbiAgICogQHBhcmFtIGNsaWVudCAtIENsaWVudFxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFVzZXIgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgc3RhdGljIGZyb21OYW1lKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB1bml4TmFtZSA9IHRvVW5peChuYW1lKTtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL3VzZXI6aW5mby8ke3VuaXhOYW1lfWA7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbywgQ2hlZXJpb0FQSSB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSwgRWxlbWVudCB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBGb3J1bVRocmVhZFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuXG4vKipcbiAqIEZvcnVtIHBvc3QgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcnVtUG9zdERhdGEge1xuICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIGVkaXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgZWRpdGVkQXQ/OiBEYXRlIHwgbnVsbDtcbiAgcGFyZW50SWQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtUG9zdCB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50OiBFbGVtZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHJpdmF0ZSBfcGFyZW50SWQ6IG51bWJlciB8IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JldmlzaW9uczogRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1Qb3N0RGF0YSkge1xuICAgIHRoaXMudGhyZWFkID0gZGF0YS50aHJlYWQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xuICAgIHRoaXMuZWxlbWVudCA9IGRhdGEuZWxlbWVudDtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5lZGl0ZWRCeSA9IGRhdGEuZWRpdGVkQnkgPz8gbnVsbDtcbiAgICB0aGlzLmVkaXRlZEF0ID0gZGF0YS5lZGl0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuX3BhcmVudElkID0gZGF0YS5wYXJlbnRJZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcmVudCBwb3N0IElEXG4gICAqL1xuICBnZXQgcGFyZW50SWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtRWRpdFBvc3RGb3JtTW9kdWxlJyxcbiAgICAgICAgICAgIHRocmVhZElkOiB0aGlzLnRocmVhZC5pZCxcbiAgICAgICAgICAgIHBvc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpKTtcbiAgICAgICAgY29uc3Qgc291cmNlRWxlbSA9ICQoXCJ0ZXh0YXJlYVtuYW1lPSdzb3VyY2UnXVwiKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgdGV4dGFyZWEgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBlZGl0IHBvc3Q6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QgaGFzIGJlZW4gZWRpdGVkIChoYXMgcmV2aXNpb25zKVxuICAgKi9cbiAgZ2V0IGhhc1JldmlzaW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0ZWRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCByZXZpc2lvbnMgKGVkaXQgaGlzdG9yeSlcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcmV2aXNpb25zICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldmlzaW9ucyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5hY3F1aXJlQWxsKHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdChpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBwb3N0IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtUG9zdENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVBvc3Q+IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG5cbiAgY29uc3RydWN0b3IodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgcG9zdHM/OiBGb3J1bVBvc3RbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50aHJlYWQgPSB0aHJlYWQ7XG4gICAgaWYgKHBvc3RzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucG9zdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFBvc3QgSURcbiAgICogQHJldHVybnMgUG9zdCAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBGb3J1bVBvc3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHBvc3QpID0+IHBvc3QuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBwb3N0cyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZSh0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLCAkOiBDaGVlcmlvQVBJKTogRm9ydW1Qb3N0W10ge1xuICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgJCgnZGl2LnBvc3QnKS5lYWNoKChfaSwgcG9zdEVsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRwb3N0ID0gJChwb3N0RWxlbSk7XG4gICAgICBjb25zdCBwb3N0SWRBdHRyID0gJHBvc3QuYXR0cignaWQnKTtcbiAgICAgIGlmICghcG9zdElkQXR0cikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwb3N0SWQgPSBOdW1iZXIucGFyc2VJbnQocG9zdElkQXR0ci5yZXBsYWNlKCdwb3N0LScsICcnKSwgMTApO1xuICAgICAgaWYgKE51bWJlci5pc05hTihwb3N0SWQpKSByZXR1cm47XG5cbiAgICAgIC8vIEdldCBwYXJlbnQgcG9zdCBJRFxuICAgICAgbGV0IHBhcmVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0ICRwYXJlbnRDb250YWluZXIgPSAkcG9zdC5wYXJlbnQoKTtcbiAgICAgIGlmICgkcGFyZW50Q29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgJGdyYW5kcGFyZW50ID0gJHBhcmVudENvbnRhaW5lci5wYXJlbnQoKTtcbiAgICAgICAgaWYgKCRncmFuZHBhcmVudC5sZW5ndGggPiAwICYmICRncmFuZHBhcmVudFswXT8ubmFtZSAhPT0gJ2JvZHknKSB7XG4gICAgICAgICAgY29uc3QgZ3JhbmRwYXJlbnRDbGFzc2VzID0gJGdyYW5kcGFyZW50LmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgaWYgKGdyYW5kcGFyZW50Q2xhc3Nlcy5pbmNsdWRlcygncG9zdC1jb250YWluZXInKSkge1xuICAgICAgICAgICAgY29uc3QgJHBhcmVudFBvc3QgPSAkZ3JhbmRwYXJlbnQuZmluZCgnPiBkaXYucG9zdCcpO1xuICAgICAgICAgICAgaWYgKCRwYXJlbnRQb3N0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50UG9zdElkQXR0ciA9ICRwYXJlbnRQb3N0LmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICAgIGlmIChwYXJlbnRQb3N0SWRBdHRyKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50SWQgPSBOdW1iZXIucGFyc2VJbnQocGFyZW50UG9zdElkQXR0ci5yZXBsYWNlKCdwb3N0LScsICcnKSwgMTApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aXRsZSBhbmQgY29udGVudFxuICAgICAgY29uc3QgJHdyYXBwZXIgPSAkcG9zdC5maW5kKCdkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5oZWFkJyk7XG4gICAgICBpZiAoJGhlYWQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0ICR0aXRsZSA9ICRoZWFkLmZpbmQoJ2Rpdi50aXRsZScpO1xuICAgICAgY29uc3QgdGl0bGUgPSAkdGl0bGUudGV4dCgpLnRyaW0oKTtcblxuICAgICAgY29uc3QgJGNvbnRlbnQgPSAkd3JhcHBlci5maW5kKCdkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnZGl2LmluZm8nKTtcbiAgICAgIGlmICgkaW5mby5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJGluZm8uZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgIGlmICgkdXNlckVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcih0aHJlYWQuc2l0ZS5jbGllbnQgYXMgQ2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkaW5mby5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICBpZiAoJG9kYXRlRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgIC8vIEVkaXQgaW5mbyAoaWYgZXhpc3RzKVxuICAgICAgbGV0IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCBlZGl0ZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgJGNoYW5nZXMgPSAkd3JhcHBlci5maW5kKCdkaXYuY2hhbmdlcycpO1xuICAgICAgaWYgKCRjaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgJGVkaXRVc2VyRWxlbSA9ICRjaGFuZ2VzLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgIGNvbnN0ICRlZGl0T2RhdGVFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICBpZiAoJGVkaXRVc2VyRWxlbS5sZW5ndGggPiAwICYmICRlZGl0T2RhdGVFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlZGl0ZWRCeSA9IHBhcnNlVXNlcih0aHJlYWQuc2l0ZS5jbGllbnQgYXMgQ2xpZW50LCAkZWRpdFVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgIGVkaXRlZEF0ID0gcGFyc2VPZGF0ZSgkZWRpdE9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwb3N0cy5wdXNoKFxuICAgICAgICBuZXcgRm9ydW1Qb3N0KHtcbiAgICAgICAgICB0aHJlYWQsXG4gICAgICAgICAgaWQ6IHBvc3RJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIGVsZW1lbnQ6IHBvc3RFbGVtIGFzIEVsZW1lbnQsXG4gICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICBlZGl0ZWRCeSxcbiAgICAgICAgICBlZGl0ZWRBdCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcG9zdHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBpbiBhIHRocmVhZFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJblRocmVhZCh0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86ICcxJyxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICBwb3N0cy5wdXNoKC4uLkZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJGZpcnN0KSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCAkcGFnZXIgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAoJHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICRwYWdlclRhcmdldHMgPSAkcGFnZXIuZmluZCgnc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgaWYgKCRwYWdlclRhcmdldHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBsYXN0IHBhZ2UgbnVtYmVyIGZyb20gc2Vjb25kIHRvIGxhc3QgcGFnZSBsaW5rXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRwYWdlclRhcmdldHNcbiAgICAgICAgICAuZXEoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyKVxuICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IG1vZHVsZU5hbWU6IHN0cmluZzsgcGFnZU5vOiBzdHJpbmc7IHQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gbGFzdFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86IFN0cmluZyhwYWdlKSxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCB0aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBwb3N0cy5wdXNoKC4uLkZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbyB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgRm9ydW1DYXRlZ29yeSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuaW1wb3J0IHsgRm9ydW1Qb3N0Q29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdCc7XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bVRocmVhZERhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcG9zdENvdW50OiBudW1iZXI7XG4gIGNhdGVnb3J5PzogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZCB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgcG9zdENvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG4gIHByaXZhdGUgX3Bvc3RzOiBGb3J1bVBvc3RDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1UaHJlYWREYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnBvc3RDb3VudCA9IGRhdGEucG9zdENvdW50O1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS9mb3J1bS90LSR7dGhpcy5pZH0vYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCBsaXN0XG4gICAqL1xuICBnZXRQb3N0cygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9wb3N0cyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9wb3N0cyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBseSB0byB0aHJlYWRcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVwbHkoXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBwYXJlbnRQb3N0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJlYWRJZDogU3RyaW5nKHRoaXMuaWQpLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHBhcmVudFBvc3RJZCAhPT0gbnVsbCA/IFN0cmluZyhwYXJlbnRQb3N0SWQpIDogJycsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVBvc3QnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3N0Q291bnQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVwbHk6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1UaHJlYWQoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgYnkgSURcbiAgICovXG4gIHN0YXRpYyBnZXRGcm9tSWQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZDogbnVtYmVyLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0sIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVRocmVhZD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCB0aHJlYWRzPzogRm9ydW1UaHJlYWRbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAodGhyZWFkcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnRocmVhZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1UaHJlYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHRocmVhZCkgPT4gdGhyZWFkLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aHJlYWRzIGluIGNhdGVnb3J5XG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluQ2F0ZWdvcnkoY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwOiAxLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICAkZmlyc3QoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkZmlyc3QoZWxlbSk7XG4gICAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJHJvdy5maW5kKCdkaXYudGl0bGUgYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgIGlmICghdGhyZWFkSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICRyb3cuZmluZCgnZGl2LmRlc2NyaXB0aW9uJykudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgJHVzZXJFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZTogY2F0ZWdvcnkuc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9IHBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VMaW5rID0gcGFnZXJMaW5rc1twYWdlckxpbmtzLmxlbmd0aCAtIDJdO1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSBsYXN0UGFnZUxpbmsgPyAkZmlyc3QobGFzdFBhZ2VMaW5rKS50ZXh0KCkudHJpbSgpIDogJzEnO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IHA6IG51bWJlcjsgYzogbnVtYmVyOyBtb2R1bGVOYW1lOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBwOiBwYWdlLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBjYXRlZ29yeS5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgJCgndGFibGUudGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWRNYXRjaCA9IGhyZWYubWF0Y2goL3QtKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgICAvLyBQYXJzZSB1c2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9XG4gICAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gKHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgRm9ydW1UaHJlYWQoe1xuICAgICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHRocmVhZCBieSB0aHJlYWQgSURcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0aHJlYWRJZCAtIFRocmVhZCBJRFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChzaXRlOiBTaXRlLCB0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZWFkID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXRocmVhZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgVGhyZWFkIG5vdCBmb3VuZDogJHt0aHJlYWRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRzIGJ5IHRocmVhZCBJRHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlRnJvbVRocmVhZElkcyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIHRocmVhZElkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRocmVhZElkcy5tYXAoKHRocmVhZElkKSA9PiAoe1xuICAgICAgICAgICAgdDogdGhyZWFkSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkTW9kdWxlJyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRzOiBGb3J1bVRocmVhZFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZElkc1tpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICF0aHJlYWRJZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICAvLyBQYXJzZSB0aHJlYWQgaW5mbyBmcm9tIHBhZ2VcbiAgICAgICAgICBjb25zdCBiY0VsZW0gPSAkKCdkaXYuZm9ydW0tYnJlYWRjcnVtYnMnKTtcbiAgICAgICAgICBpZiAoYmNFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdCcmVhZGNydW1icyBub3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmNQYXJ0cyA9IGJjRWxlbS50ZXh0KCkuc3BsaXQoJ8K7Jyk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBiY1BhcnRzLmxlbmd0aCA+IDAgPyAoYmNQYXJ0c1tiY1BhcnRzLmxlbmd0aCAtIDFdPy50cmltKCkgPz8gJycpIDogJyc7XG5cbiAgICAgICAgICBjb25zdCBkZXNjQmxvY2tFbGVtID0gJCgnZGl2LmRlc2NyaXB0aW9uLWJsb2NrJyk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjQmxvY2tFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0Q291bnRNYXRjaCA9ICQoJ2Rpdi5zdGF0aXN0aWNzJykudGV4dCgpLm1hdGNoKC8oXFxkKykvKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBwb3N0Q291bnRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHBvc3RDb3VudE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeTogbnVsbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oc2l0ZSwgdGhyZWFkcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSB0aHJlYWRzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIH0gZnJvbSAnLi9mb3J1bS10aHJlYWQnO1xuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bUNhdGVnb3J5RGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwb3N0c0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQ2F0ZWdvcnkge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zdHNDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF90aHJlYWRzOiBGb3J1bVRocmVhZENvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bUNhdGVnb3J5RGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnRocmVhZHNDb3VudCA9IGRhdGEudGhyZWFkc0NvdW50O1xuICAgIHRoaXMucG9zdHNDb3VudCA9IGRhdGEucG9zdHNDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGxpc3RcbiAgICovXG4gIGdldFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl90aHJlYWRzICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3RocmVhZHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZENvbGxlY3Rpb24uYWNxdWlyZUFsbEluQ2F0ZWdvcnkodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aHJlYWRzID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWFkcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhyZWFkIGxpc3RcbiAgICovXG4gIHJlbG9hZFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMuX3RocmVhZHMgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmdldFRocmVhZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNyZWF0ZVRocmVhZChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ25ld1RocmVhZCcsXG4gICAgICAgICAgICBjYXRlZ29yeV9pZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLnRocmVhZElkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVGhyZWFkIElEIG5vdCBmb3VuZCBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXNwb25zZS50aHJlYWRJZCBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkLCB0aGlzKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1DYXRlZ29yeShpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiBleHRlbmRzIEFycmF5PEZvcnVtQ2F0ZWdvcnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgY2F0ZWdvcmllcz86IEZvcnVtQ2F0ZWdvcnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAoY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5wdXNoKC4uLmNhdGVnb3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1DYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciBhIHNpdGVcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsKHNpdGU6IFNpdGUpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVN0YXJ0TW9kdWxlJyxcbiAgICAgICAgICAgIGhpZGRlbjogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzOiBGb3J1bUNhdGVnb3J5W10gPSBbXTtcblxuICAgICAgICAkKCd0YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKHJvdyk7XG4gICAgICAgICAgY29uc3QgbmFtZUVsZW0gPSAkcm93LmZpbmQoJ3RkLm5hbWUnKTtcbiAgICAgICAgICBjb25zdCBuYW1lTGlua0VsZW0gPSBuYW1lRWxlbS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IG5hbWVMaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkTWF0Y2ggPSBocmVmLm1hdGNoKC9jLShcXGQrKS8pO1xuICAgICAgICAgIGlmICghY2F0ZWdvcnlJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBOdW1iZXIucGFyc2VJbnQoY2F0ZWdvcnlJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBuYW1lTGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IG5hbWVFbGVtLmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgdGhyZWFkc0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQudGhyZWFkcycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuICAgICAgICAgIGNvbnN0IHBvc3RzQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtQ2F0ZWdvcnkoe1xuICAgICAgICAgICAgICBzaXRlLFxuICAgICAgICAgICAgICBpZDogY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0aHJlYWRzQ291bnQsXG4gICAgICAgICAgICAgIHBvc3RzQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24oc2l0ZSwgY2F0ZWdvcmllcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBjYXRlZ29yaWVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgdHlwZSBGb3J1bUNhdGVnb3J5RGF0YSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuZXhwb3J0IHsgRm9ydW1Qb3N0LCBGb3J1bVBvc3RDb2xsZWN0aW9uLCB0eXBlIEZvcnVtUG9zdERhdGEgfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuZXhwb3J0IHtcbiAgRm9ydW1Qb3N0UmV2aXNpb24sXG4gIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbixcbiAgdHlwZSBGb3J1bVBvc3RSZXZpc2lvbkRhdGEsXG59IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5leHBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLCB0eXBlIEZvcnVtVGhyZWFkRGF0YSB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcbiIsCiAgICAiLy8gQ29tbW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL3R5cGVzJztcblxuLy8gQ29ubmVjdG9yXG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rvcic7XG5cbi8vIE1vZHVsZVxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuXG4vLyBVdGlsXG5leHBvcnQgKiBmcm9tICcuL3V0aWwnO1xuIiwKICAgICJpbXBvcnQga3ksIHsgdHlwZSBLeUluc3RhbmNlIH0gZnJvbSAna3knO1xuaW1wb3J0IHBMaW1pdCwgeyB0eXBlIExpbWl0RnVuY3Rpb24gfSBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7XG4gIEFNQ0h0dHBFcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZXNwb25zZURhdGFFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90RXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICB0eXBlIEFNQ0NvbmZpZyxcbiAgREVGQVVMVF9BTUNfQ09ORklHLFxuICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUsXG4gIFdJS0lET1RfVE9LRU43LFxufSBmcm9tICcuL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmltcG9ydCB7IHR5cGUgQU1DUmVxdWVzdEJvZHksIHR5cGUgQU1DUmVzcG9uc2UsIGFtY1Jlc3BvbnNlU2NoZW1hIH0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuXG4vKipcbiAqIE1hc2sgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgbG9nZ2luZylcbiAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5IHRvIG1hc2tcbiAqIEByZXR1cm5zIE1hc2tlZCBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2Vuc2l0aXZlRGF0YShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFza2VkID0geyAuLi5ib2R5IH07XG4gIGNvbnN0IHNlbnNpdGl2ZUtleXMgPSBbJ3Bhc3N3b3JkJywgJ2xvZ2luJywgJ1dJS0lET1RfU0VTU0lPTl9JRCcsICd3aWtpZG90X3Rva2VuNyddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzZW5zaXRpdmVLZXlzKSB7XG4gICAgaWYgKGtleSBpbiBtYXNrZWQpIHtcbiAgICAgIG1hc2tlZFtrZXldID0gJyoqKk1BU0tFRCoqKic7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXNrZWQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgaW50ZXJ2YWwgKHdpdGggaml0dGVyKVxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBDdXJyZW50IHJldHJ5IGNvdW50IChzdGFydHMgZnJvbSAxKVxuICogQHBhcmFtIGJhc2VJbnRlcnZhbCAtIEJhc2UgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gQmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBDYWxjdWxhdGVkIGJhY2tvZmYgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZihcbiAgcmV0cnlDb3VudDogbnVtYmVyLFxuICBiYXNlSW50ZXJ2YWw6IG51bWJlcixcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyLFxuICBtYXhCYWNrb2ZmOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBiYXNlSW50ZXJ2YWwgKiBiYWNrb2ZmRmFjdG9yICoqIChyZXRyeUNvdW50IC0gMSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBiYWNrb2ZmICogMC4xO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiArIGppdHRlciwgbWF4QmFja29mZik7XG59XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBkdXJhdGlvblxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQU1DIHJlcXVlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KSAqL1xuICBzaXRlTmFtZT86IHN0cmluZztcbiAgLyoqIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpICovXG4gIHNzbFN1cHBvcnRlZD86IGJvb2xlYW47XG4gIC8qKiBJbmNsdWRlIGVycm9ycyBpbiByZXN1bHRzIGluc3RlYWQgb2YgdGhyb3dpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByZXR1cm5FeGNlcHRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY2xpZW50XG4gKiBNYW5hZ2VzIHJlcXVlc3RzIHRvIFdpa2lkb3QgQU1DIGVuZHBvaW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNDbGllbnQge1xuICAvKioga3kgaW5zdGFuY2UgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBreTogS3lJbnN0YW5jZTtcblxuICAvKiogQ29uY3VycmVudCByZXF1ZXN0IGxpbWl0ZXIgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaW1pdDogTGltaXRGdW5jdGlvbjtcblxuICAvKiogSGVhZGVyIG1hbmFnZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcjogQU1DSGVhZGVyO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IEFNQ0NvbmZpZztcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0wgc3VwcG9ydCBzdGF0dXMgY2FjaGUgKi9cbiAgcHJpdmF0ZSBzc2xDYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyBkZWZhdWx0cyBpZiBvbWl0dGVkKVxuICAgKiBAcGFyYW0gZG9tYWluIC0gQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEFNQ0NvbmZpZz4gPSB7fSwgZG9tYWluID0gJ3dpa2lkb3QuY29tJykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0FNQ19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuaGVhZGVyID0gbmV3IEFNQ0hlYWRlcigpO1xuICAgIHRoaXMubGltaXQgPSBwTGltaXQodGhpcy5jb25maWcuc2VtYXBob3JlTGltaXQpO1xuXG4gICAgdGhpcy5reSA9IGt5LmNyZWF0ZSh7XG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgcmV0cnk6IDAsIC8vIE1hbnVhbCByZXRyeSBjb250cm9sXG4gICAgfSk7XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIHRoaXMuc3NsQ2FjaGUuc2V0KCd3d3cnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzaXRlIGV4aXN0ZW5jZSBhbmQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZVxuICAgKiBAcmV0dXJucyBTU0wgc3VwcG9ydCBzdGF0dXMgKHRydWU6IEhUVFBTLCBmYWxzZTogSFRUUClcbiAgICovXG4gIGNoZWNrU2l0ZVNTTChzaXRlTmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPGJvb2xlYW4+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGV4aXN0c1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3NsQ2FjaGUuZ2V0KHNpdGVOYW1lKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIGlmIChzaXRlTmFtZSA9PT0gJ3d3dycpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmModHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgcmVkaXJlY3Q6ICdtYW51YWwnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyA0MDQgbWVhbnMgc2l0ZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgaXMgbm90IGZvdW5kOiAke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU1NMIHN1cHBvcnRlZCBpZiAzMDEgcmVkaXJlY3QgdG8gaHR0cHNcbiAgICAgICAgY29uc3QgaXNTU0wgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gMzAxICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpPy5zdGFydHNXaXRoKCdodHRwcycpID09PSB0cnVlO1xuXG4gICAgICAgIC8vIFNhdmUgdG8gY2FjaGVcbiAgICAgICAgdGhpcy5zc2xDYWNoZS5zZXQoc2l0ZU5hbWUsIGlzU1NMKTtcbiAgICAgICAgcmV0dXJuIGlzU1NMO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjaGVjayBTU0wgZm9yICR7c2l0ZU5hbWV9OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIHNpdGVOYW1lIC0gU2l0ZSBuYW1lIChkZWZhdWx0OiB3d3cpXG4gICAqIEBwYXJhbSBzc2xTdXBwb3J0ZWQgLSBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKVxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBhcnJheVxuICAgKi9cbiAgcmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgc2l0ZU5hbWUgPSAnd3d3JyxcbiAgICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKGJvZGllcywge1xuICAgICAgc2l0ZU5hbWUsXG4gICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBmYWxzZSxcbiAgICB9KSBhcyBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT47XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCAod2l0aCBvcHRpb25zKVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVxdWVzdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5IChpbmNsdWRlcyBlcnJvcnMgaWYgcmV0dXJuRXhjZXB0aW9ucyBpcyB0cnVlKVxuICAgKi9cbiAgcmVxdWVzdFdpdGhPcHRpb25zKFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiBBTUNSZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzwoQU1DUmVzcG9uc2UgfCBXaWtpZG90RXJyb3IpW10+IHtcbiAgICBjb25zdCB7IHNpdGVOYW1lID0gJ3d3dycsIHNzbFN1cHBvcnRlZCwgcmV0dXJuRXhjZXB0aW9ucyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gR2V0IFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgICAgICBsZXQgc3NsID0gc3NsU3VwcG9ydGVkO1xuICAgICAgICBpZiAoc3NsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzc2xSZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrU2l0ZVNTTChzaXRlTmFtZSk7XG4gICAgICAgICAgaWYgKHNzbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBzc2xSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNzbCA9IHNzbFJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gc3NsID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn0vYWpheC1tb2R1bGUtY29ubmVjdG9yLnBocGA7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSByZXF1ZXN0cyBpbiBwYXJhbGxlbFxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYm9kaWVzLm1hcCgoYm9keSkgPT4gdGhpcy5saW1pdCgoKSA9PiB0aGlzLnNpbmdsZVJlcXVlc3QoYm9keSwgdXJsKSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJldHVybkV4Y2VwdGlvbnMpIHtcbiAgICAgICAgICAvLyBSZXR1cm4gYWxsIHJlc3VsdHMgaW5jbHVkaW5nIGVycm9yc1xuICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHIuZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaHJvdyBmaXJzdCBlcnJvciBpZiBhbnlcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdHMuZmluZCgocikgPT4gci5pc0VycigpKTtcbiAgICAgICAgaWYgKGZpcnN0RXJyb3I/LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdEVycm9yLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiByZXN1bHQgcHJvY2Vzc2luZycpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBleGVjdXRlIGEgc2luZ2xlIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZHkgLSBSZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHVybCAtIFJlcXVlc3QgVVJMXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpbmdsZVJlcXVlc3QoXG4gICAgYm9keTogQU1DUmVxdWVzdEJvZHksXG4gICAgdXJsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+PiB7XG4gICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEFkZCB3aWtpZG90X3Rva2VuN1xuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHsgLi4uYm9keSwgd2lraWRvdF90b2tlbjc6IFdJS0lET1RfVE9LRU43IH07XG5cbiAgICAgICAgLy8gQ3JlYXRlIFVSTC1lbmNvZGVkIGJvZHlcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RCb2R5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMua3kucG9zdCh1cmwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgYm9keTogZm9ybURhdGEudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgYXMgSlNPTlxuICAgICAgICBsZXQgcmVzcG9uc2VEYXRhOiB1bmtub3duO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzcG9uc2VEYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBSZXRyeSBvbiBKU09OIHBhcnNlIGVycm9yIChlLmcuLCBlbXB0eSByZXNwb25zZSlcbiAgICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgQU1DIHJlc3BvbmRlZCB3aXRoIG5vbi1KU09OIGRhdGE6ICR7cmVzcG9uc2VUZXh0fWApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgd2l0aCB6b2RcbiAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBhbWNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEludmFsaWQgQU1DIHJlc3BvbnNlIGZvcm1hdDogJHtwYXJzZVJlc3VsdC5lcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFtY1Jlc3BvbnNlID0gcGFyc2VSZXN1bHQuZGF0YTtcblxuICAgICAgICAvLyBSZXRyeSBpZiB0cnlfYWdhaW5cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ3RyeV9hZ2FpbicpIHtcbiAgICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IFdpa2lkb3RTdGF0dXNFcnJvcignQU1DIHJlc3BvbmRlZCB3aXRoIHRyeV9hZ2FpbicsICd0cnlfYWdhaW4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3JiaWRkZW5FcnJvciBpZiBub19wZXJtaXNzaW9uXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgPT09ICdub19wZXJtaXNzaW9uJykge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFN0ciA9IGJvZHkubW9kdWxlTmFtZVxuICAgICAgICAgICAgPyBgbW9kdWxlTmFtZTogJHtib2R5Lm1vZHVsZU5hbWV9YFxuICAgICAgICAgICAgOiBib2R5LmFjdGlvblxuICAgICAgICAgICAgICA/IGBhY3Rpb246ICR7Ym9keS5hY3Rpb259LyR7Ym9keS5ldmVudCA/PyAnJ31gXG4gICAgICAgICAgICAgIDogJ3Vua25vd24nO1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IEZvcmJpZGRlbkVycm9yKFxuICAgICAgICAgICAgICBgWW91ciBhY2NvdW50IGhhcyBubyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb246ICR7dGFyZ2V0U3RyfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXJyb3IgaWYgc3RhdHVzIGlzIG5vdCBva1xuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzICE9PSAnb2snKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgV2lraWRvdFN0YXR1c0Vycm9yKFxuICAgICAgICAgICAgICBgQU1DIHJlc3BvbmRlZCB3aXRoIGVycm9yIHN0YXR1czogXCIke2FtY1Jlc3BvbnNlLnN0YXR1c31cImAsXG4gICAgICAgICAgICAgIGFtY1Jlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2RPa0FzeW5jKGFtY1Jlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFJldHJ5IG9uIGFsbCBlcnJvcnMgKEhUVFAgZXJyb3JzLCBuZXR3b3JrIGVycm9ycywgdGltZW91dHMsIGV0Yy4pXG4gICAgICAgIC8vIFdpa2lkb3Qgc2VydmVyIGhhcyBhIHJlbGF0aXZlbHkgaGlnaCBlcnJvciByYXRlLCBzbyByZXRyeSBpcyBlc3NlbnRpYWxcbiAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgICAgICAgICAgPyAoKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0pLnJlc3BvbnNlPy5zdGF0dXMgPz9cbiAgICAgICAgICAgICAgICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUpXG4gICAgICAgICAgICAgIDogREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFO1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBBTUNIdHRwRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWAsIHN0YXR1c0NvZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qKlxuICogQ2xhc3MgZm9yIG1hbmFnaW5nIEFNQyByZXF1ZXN0IGhlYWRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0hlYWRlciB7XG4gIHByaXZhdGUgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBjb250ZW50VHlwZTogc3RyaW5nO1xuICBwcml2YXRlIHVzZXJBZ2VudDogc3RyaW5nO1xuICBwcml2YXRlIHJlZmVyZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBIZWFkZXIgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHsgY29udGVudFR5cGU/OiBzdHJpbmc7IHVzZXJBZ2VudD86IHN0cmluZzsgcmVmZXJlcj86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5jb250ZW50VHlwZSA9IG9wdGlvbnM/LmNvbnRlbnRUeXBlID8/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnO1xuICAgIHRoaXMudXNlckFnZW50ID0gb3B0aW9ucz8udXNlckFnZW50ID8/ICdXaWtpZG90VFMnO1xuICAgIHRoaXMucmVmZXJlciA9IG9wdGlvbnM/LnJlZmVyZXIgPz8gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tLyc7XG4gICAgdGhpcy5jb29raWVzID0gbmV3IE1hcChbWyd3aWtpZG90X3Rva2VuNycsICcxMjM0NTYnXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSAtIENvb2tpZSB2YWx1ZVxuICAgKi9cbiAgc2V0Q29va2llKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqL1xuICBkZWxldGVDb29raWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLmRlbGV0ZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcmV0dXJucyBDb29raWUgdmFsdWUsIHVuZGVmaW5lZCBpZiBub3QgZXhpc3RzXG4gICAqL1xuICBnZXRDb29raWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRUUCBoZWFkZXJzIG9iamVjdFxuICAgKiBAcmV0dXJucyBIZWFkZXJzIGRpY3Rpb25hcnlcbiAgICovXG4gIGdldEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgY29va2llU3RyaW5nID0gQXJyYXkuZnJvbSh0aGlzLmNvb2tpZXMuZW50cmllcygpKVxuICAgICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gYCR7bmFtZX09JHt2YWx1ZX1gKVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHRoaXMuY29udGVudFR5cGUsXG4gICAgICAnVXNlci1BZ2VudCc6IHRoaXMudXNlckFnZW50LFxuICAgICAgUmVmZXJlcjogdGhpcy5yZWZlcmVyLFxuICAgICAgQ29va2llOiBjb29raWVTdHJpbmcsXG4gICAgfTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBBTUMgcmVxdWVzdCBib2R5IHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVxdWVzdEJvZHlWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB8IEFNQ1JlcXVlc3RCb2R5VmFsdWVbXTtcblxuLyoqXG4gKiBBTUMgcmVxdWVzdCBib2R5IHR5cGUgZGVmaW5pdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RCb2R5IHtcbiAgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBldmVudD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogQU1DUmVxdWVzdEJvZHlWYWx1ZTtcbn1cblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgYmFzZSBzY2hlbWFcbiAqL1xuY29uc3QgYmFzZVNjaGVtYTogei5ab2RPYmplY3Q8e1xuICBzdGF0dXM6IHouWm9kU3RyaW5nO1xuICBib2R5OiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbiAgbWVzc2FnZTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG59PiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICBib2R5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIEFNQyByZXNwb25zZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IGFtY1Jlc3BvbnNlU2NoZW1hOiB6LlpvZFR5cGU8ei5pbmZlcjx0eXBlb2YgYmFzZVNjaGVtYT4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPVxuICBiYXNlU2NoZW1hLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBhbWNSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogU3VjY2Vzc2Z1bCBBTUMgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdvayc7XG4gIGJvZHk6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIEFNQyByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBBTUMgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdWNjZXNzUmVzcG9uc2UocmVzcG9uc2U6IEFNQ1Jlc3BvbnNlKTogcmVzcG9uc2UgaXMgQU1DU3VjY2Vzc1Jlc3BvbnNlIHtcbiAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gJ29rJztcbn1cbiIsCiAgICAiZXhwb3J0IHsgQU1DQ2xpZW50LCB0eXBlIEFNQ1JlcXVlc3RPcHRpb25zLCBtYXNrU2Vuc2l0aXZlRGF0YSB9IGZyb20gJy4vYW1jLWNsaWVudCc7XG5leHBvcnQgeyB0eXBlIEFNQ0NvbmZpZywgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmV4cG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5leHBvcnQge1xuICB0eXBlIEFNQ1JlcXVlc3RCb2R5LFxuICB0eXBlIEFNQ1Jlc3BvbnNlLFxuICB0eXBlIEFNQ1N1Y2Nlc3NSZXNwb25zZSxcbiAgYW1jUmVzcG9uc2VTY2hlbWEsXG4gIGlzU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tICcuL2FtYy10eXBlcyc7XG5leHBvcnQgeyBsb2dpbiwgbG9nb3V0IH0gZnJvbSAnLi9hdXRoJztcbiIsCiAgICAiaW1wb3J0IHsgU2Vzc2lvbkNyZWF0ZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEF1dGhDbGllbnRDb250ZXh0IH0gZnJvbSAnLi4vbW9kdWxlL3R5cGVzJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKipcbiAqIExvZ2luIHRvIFdpa2lkb3Qgd2l0aCB1c2VybmFtZSBhbmQgcGFzc3dvcmRcbiAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgY29udGV4dCAob2JqZWN0IHdpdGggQU1DQ2xpZW50KVxuICogQHBhcmFtIHVzZXJuYW1lIC0gVXNlcm5hbWVcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFBhc3N3b3JkXG4gKiBAcmV0dXJucyB2b2lkIG9uIHN1Y2Nlc3MsIFNlc3Npb25DcmVhdGVFcnJvciBvbiBmYWlsdXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dpbihcbiAgY2xpZW50OiBBdXRoQ2xpZW50Q29udGV4dCxcbiAgdXNlcm5hbWU6IHN0cmluZyxcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBsb2dpbjogdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dpbicsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChMT0dJTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgYm9keTogZm9ybURhdGEudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtVGhyZWFkLCBGb3J1bVRocmVhZENvbGxlY3Rpb24sIEZvcnVtUG9zdCB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZU1lbWJlciwgU2l0ZUFwcGxpY2F0aW9uIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUZpbGVDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkaXNjdXNzaW9uIHRocmVhZCBmb3IgdGhlIHBhZ2VcbiAgICovXG4gIGdldERpc2N1c3Npb24oKTogV2lraWRvdFJlc3VsdEFzeW5jPGltcG9ydCgnLi4vZm9ydW0nKS5Gb3J1bVRocmVhZCB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdnZXR0aW5nIGRpc2N1c3Npb24nKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtQ29tbWVudHNMaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgLy8gRXh0cmFjdCB0aHJlYWQgSURcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKFxuICAgICAgICAgIC9XSUtJRE9UXFwubW9kdWxlc1xcLkZvcnVtVmlld1RocmVhZE1vZHVsZVxcLnZhcnNcXC50aHJlYWRJZFxccyo9XFxzKihcXGQrKS9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFtYXRjaD8uWzFdKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xuXG4gICAgICAgIC8vIEdldCBGb3J1bVRocmVhZFxuICAgICAgICBjb25zdCB7IEZvcnVtVGhyZWFkIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2ZvcnVtJyk7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IGRpc2N1c3Npb246ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG1ldGEgdGFncyBmb3IgdGhlIHBhZ2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWV0YXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VNZXRhQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgbWV0YXMnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBzZXRNZXRhKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzZXR0aW5nIG1ldGEnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcywgbmFtZSwgY29udGVudCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBkZWxldGVNZXRhKG5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZGVsZXRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2Ugc291cmNlIChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUGFnZSBzb3VyY2VcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVNvdXJjZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHNvdXJjZVJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBzb3VyY2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugc291cmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gaGlzdG9yeSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJldmlzaW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJldlJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlUmV2aXNpb25zKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmV2UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJldlJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSByZXZpc2lvbnMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2b3RlIGluZm9ybWF0aW9uIChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgVm90ZSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRWb3RlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZVZvdGVDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3ZvdGVzID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2b3Rlc1Jlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmICh2b3Rlc1Jlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyB2b3Rlc1Jlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3ZvdGVzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHZvdGVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZvdGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZShmdWxsbmFtZT0ke3RoaXMuZnVsbG5hbWV9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBwYWdlcz86IFBhZ2VbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAocGFnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5wYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgZnVsbG5hbWVcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0gUGFnZSBmdWxsbmFtZVxuICAgKiBAcmV0dXJucyBQYWdlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5RnVsbG5hbWUoZnVsbG5hbWU6IHN0cmluZyk6IFBhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHBhZ2UpID0+IHBhZ2UuZnVsbG5hbWUgPT09IGZ1bGxuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VJZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSByZXZpc2lvbnMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVJldmlzaW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugdm90ZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZVZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVZvdGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlSWRzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuaXNJZEFjcXVpcmVkKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgKHVzaW5nIHNhbWUgc2VtYXBob3JlTGltaXQgYXMgQU1DQ2xpZW50KVxuICAgICAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChzaXRlLmNsaWVudC5hbWNDbGllbnQuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICAvLyBBY2Nlc3Mgd2l0aCBub3JlbmRlciwgbm9yZWRpcmVjdFxuICAgICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+XG4gICAgICAgICAgICBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2UuZ2V0VXJsKCl9L25vcmVuZGVyL3RydWUvbm9yZWRpcmVjdC90cnVlYDtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBzaXRlLmNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IHBhZ2UsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcGFnZSwgcmVzcG9uc2UgfSBvZiByZXNwb25zZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwucGFnZUlkXFxzKj1cXHMqKFxcZCspOy8pO1xuICAgICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBwYWdlIGlkOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2UuaWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBJRHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VTb3VyY2VzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5zb3VyY2UgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICd2aWV3c291cmNlL1ZpZXdTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykucmVwbGFjZSgvJm5ic3A7L2csICcgJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYENhbm5vdCBmaW5kIHNvdXJjZSBlbGVtZW50IGZvciBwYWdlOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdpa2lUZXh0ID0gc291cmNlRWxlbWVudC50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL15cXHQvLCAnJyk7XG4gICAgICAgICAgcGFnZS5zb3VyY2UgPSBuZXcgUGFnZVNvdXJjZSh7IHBhZ2UsIHdpa2lUZXh0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVJldmlzaW9ucyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmV2aXNpb25zID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlUmV2aXNpb25MaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGFsbDogdHJ1ZSB9LFxuICAgICAgICAgICAgcGVycGFnZTogMTAwMDAwMDAwLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uczogUGFnZVJldmlzaW9uW10gPSBbXTtcblxuICAgICAgICAgICQoJ3RhYmxlLnBhZ2UtaGlzdG9yeSB0cltpZF49XCJyZXZpc2lvbi1yb3ctXCJdJykuZWFjaCgoX2osIHJldkVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRyZXYgPSAkKHJldkVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcmV2SWRBdHRyID0gJHJldi5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgaWYgKCFyZXZJZEF0dHIpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2SWQgPSBOdW1iZXIucGFyc2VJbnQocmV2SWRBdHRyLnJlcGxhY2UoJ3JldmlzaW9uLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2SWQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICR0ZHMgPSAkcmV2LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgICBpZiAoJHRkcy5sZW5ndGggPCA3KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldk5vVGV4dCA9ICR0ZHMuZXEoMCkudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9cXC4kLywgJycpO1xuICAgICAgICAgICAgY29uc3QgcmV2Tm8gPSBOdW1iZXIucGFyc2VJbnQocmV2Tm9UZXh0LCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldk5vKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEJ5RWxlbSA9ICR0ZHMuZXEoNCkuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEJ5RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJGNyZWF0ZWRCeUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQXRFbGVtID0gJHRkcy5lcSg1KS5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRBdEVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRjcmVhdGVkQXRFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSAkdGRzLmVxKDYpLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIHJldmlzaW9ucy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZVJldmlzaW9uKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIGlkOiByZXZJZCxcbiAgICAgICAgICAgICAgICByZXZObyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS5yZXZpc2lvbnMgPSBuZXcgUGFnZVJldmlzaW9uQ29sbGVjdGlvbihwYWdlLCByZXZpc2lvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVZvdGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS52b3RlcyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ3BhZ2VyYXRlL1dob1JhdGVkUGFnZU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2Ugdm90ZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIExpc3RQYWdlc01vZHVsZSByZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgNS1zdGFyIHJhdGluZ1xuICAgICAgY29uc3QgaXM1U3RhclJhdGluZyA9ICRwYWdlLmZpbmQoJ3NwYW4ucmF0aW5nIHNwYW4ucGFnZS1yYXRlLWxpc3QtcGFnZXMtc3RhcnQnKS5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBHZXQgZWFjaCB2YWx1ZVxuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZXkgY29udmVyc2lvblxuICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfbGlua2VkJykpIHtcbiAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2xpbmtlZCcsICcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NvbW1lbnRzJywgJ2NoaWxkcmVuJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBrZXkgPSBgJHtrZXl9X2NvdW50YDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfdm90ZXMnKSB7XG4gICAgICAgICAga2V5ID0gJ3ZvdGVzX2NvdW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1lcmdlIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB3aXRoIFpvZCBzY2hlbWEgYW5kIGFwcGx5IGRlZmF1bHRzXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYWdlUGFyYW1zU2NoZW1hLnBhcnNlKHBhZ2VQYXJhbXMpO1xuXG4gICAgICAvLyBDcmVhdGUgUGFnZSBvYmplY3RcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIG1vZHVsZSBib2R5XG4gICAgICAgIGNvbnN0IG1vZHVsZUJvZHkgPSBgW1tkaXYgY2xhc3M9XCJwYWdlXCJdXVxcbiR7REVGQVVMVF9NT0RVTEVfQk9EWS5tYXAoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIGBbW3NwYW4gY2xhc3M9XCJzZXQgJHtrZXl9XCJdXVtbc3BhbiBjbGFzcz1cIm5hbWVcIl1dICR7a2V5fSBbWy9zcGFuXV1bW3NwYW4gY2xhc3M9XCJ2YWx1ZVwiXV0gJSUke2tleX0lJSBbWy9zcGFuXV1bWy9zcGFuXV1gXG4gICAgICAgICkuam9pbignJyl9XFxuW1svZGl2XV1gO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgIG1vZHVsZV9ib2R5OiBtb2R1bGVCb2R5LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbcmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3Rfb2snKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdGYWlsZWQgdG8gZ2V0IHBhZ2VzLCB0YXJnZXQgc2l0ZSBtYXkgYmUgcHJpdmF0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgbGV0IHRvdGFsID0gMTtcbiAgICAgICAgY29uc3QgaHRtbEJvZGllczogY2hlZXJpby5DaGVlcmlvQVBJW10gPSBbJGZpcnN0XTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAodG90YWwgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbEJvZGllczogQU1DUmVxdWVzdEJvZHlbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgICAgYWRkaXRpb25hbEJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ucXVlcnlEaWN0LFxuICAgICAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiBpICogKHEucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFKSxcbiAgICAgICAgICAgIH0gYXMgQU1DUmVxdWVzdEJvZHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KGFkZGl0aW9uYWxCb2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwQm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBodG1sQm9kaWVzLnB1c2goY2hlZXJpby5sb2FkKHJlc3BCb2R5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VcbiAgICAgICAgY29uc3QgcGFnZXM6IFBhZ2VbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0ICRodG1sIG9mIGh0bWxCb2RpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBQYWdlQ29sbGVjdGlvbi5wYXJzZShzaXRlLCAkaHRtbCwgcGFyc2VVc2VyKTtcbiAgICAgICAgICBwYWdlcy5wdXNoKC4uLnBhcnNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIGVkaXQgYSBwYWdlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlT3JFZGl0KFxuICAgIHNpdGU6IFNpdGUsXG4gICAgZnVsbG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBwYWdlSWQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICAgIHJhaXNlT25FeGlzdHM/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBjcmVhdGUvZWRpdCBwYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhZ2VJZCA9IG51bGwsXG4gICAgICAgICAgdGl0bGUgPSAnJyxcbiAgICAgICAgICBzb3VyY2UgPSAnJyxcbiAgICAgICAgICBjb21tZW50ID0gJycsXG4gICAgICAgICAgZm9yY2VFZGl0ID0gZmFsc2UsXG4gICAgICAgICAgcmFpc2VPbkV4aXN0cyA9IGZhbHNlLFxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyBBY3F1aXJlIHBhZ2UgbG9ja1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIFNhdmUgcGFnZVxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2UgZmlsZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUZpbGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2UgYXR0YWNobWVudCBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWltZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlRmlsZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IGRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VGaWxlKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCBzaXplPSR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBmaWxlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIHRvIGJ5dGVzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVNpemUoc2l6ZVRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdGV4dCA9IHNpemVUZXh0LnRyaW0oKTtcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnQnl0ZXMnKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdCeXRlcycsICcnKS50cmltKCkpKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2tCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgna0InLCAnJykudHJpbSgpKSAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnTUInKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdNQicsICcnKS50cmltKCkpICogMTAwMDAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdHQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0dCJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwMDAwKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICAgICAgaWYgKGZpbGVzVGFibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXM6IFBhZ2VGaWxlW10gPSBbXTtcblxuICAgICAgICBmaWxlc1RhYmxlLmZpbmQoXCJ0Ym9keSB0cltpZF49J2ZpbGUtcm93LSddXCIpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgICAgIGlmICghcm93SWQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZpbGVJZCA9IE51bWJlci5wYXJzZUludChyb3dJZC5yZXBsYWNlKCdmaWxlLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgICAgICBpZiAodGRzLmxlbmd0aCA8IDMpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGxpbmtFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJ2EnKTtcbiAgICAgICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gbGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gbGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgICAgICBjb25zdCBtaW1lRWxlbSA9ICQodGRzWzFdKS5maW5kKCdzcGFuJyk7XG4gICAgICAgICAgY29uc3QgbWltZVR5cGUgPSBtaW1lRWxlbS5hdHRyKCd0aXRsZScpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBzaXplID0gUGFnZUZpbGVDb2xsZWN0aW9uLnBhcnNlU2l6ZShzaXplVGV4dCk7XG5cbiAgICAgICAgICBmaWxlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWdcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZU1ldGFEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGEgdGFnIHZhbHVlXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGUoY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKi9cbiAgZGVsZXRlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlTWV0YShuYW1lPSR7dGhpcy5uYW1lfSwgY29udGVudD0ke3RoaXMuY29udGVudH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGFDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZU1ldGE+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZVJlZiwgbWV0YXM/OiBQYWdlTWV0YVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChtZXRhcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1ldGFzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1ldGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKG1ldGEpID0+IG1ldGEubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgbWV0YSB0YWdzXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZVJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgbWV0YXM6IFBhZ2VNZXRhW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSBIVE1MLWVuY29kZWQgbWV0YSB0YWdzIHdpdGggcmVnZXhcbiAgICAgICAgLy8gRm9ybWF0OiAmbHQ7bWV0YSBuYW1lPVwieHh4XCIgY29udGVudD1cInl5eVwiLyZndDtcbiAgICAgICAgY29uc3QgbWV0YVJlZ2V4ID0gLyZsdDttZXRhIG5hbWU9XCIoW15cIl0rKVwiIGNvbnRlbnQ9XCIoW15cIl0qKVwiXFwvPyZndDsvZztcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBodG1sLm1hdGNoQWxsKG1ldGFSZWdleCkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZU1ldGEoe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50ID8/ICcnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VNZXRhQ29sbGVjdGlvbihwYWdlLCBtZXRhcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIG1ldGFzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YSB0YWdcbiAgICogQHBhcmFtIHBhZ2UgLSBQYWdlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHNldE1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIHNldCBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWV0YUNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgICAgbWV0YU5hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXZpc2lvbkRhdGEge1xuICBwYWdlOiBQYWdlO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSByZXZpc2lvbiAodmVyc2lvbiBpbiBlZGl0IGhpc3RvcnkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUmV2aXNpb24ge1xuICAvKiogUGFnZSB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFJldmlzaW9uIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBudW1iZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEVkaXQgY29tbWVudCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIVE1MIGRpc3BsYXkgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmV2aXNpb25EYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMucmV2Tm8gPSBkYXRhLnJldk5vO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzb3VyY2UgY29kZSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNTb3VyY2VBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgSFRNTCBkaXNwbGF5IGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0h0bWxBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIGNvZGUgKGNhY2hlZClcbiAgICovXG4gIGdldCBzb3VyY2UoKTogUGFnZVNvdXJjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBQYWdlU291cmNlIHwgbnVsbCkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGRpc3BsYXkgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGRpc3BsYXlcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBzb3VyY2UgKFJFVi0wMDEpXG4gICAqIEByZXR1cm5zIFNvdXJjZSBzdHJpbmdcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdoaXN0b3J5L1BhZ2VTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVNvdXJjZU1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBTb3VyY2UgY29kZSBpcyBpbnNpZGUgPGRpdiBjbGFzcz1cInBhZ2Utc291cmNlXCI+XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIEhUTUwgKFJFVi0wMDIpXG4gICAqIEByZXR1cm5zIEhUTUwgc3RyaW5nXG4gICAqL1xuICBnZXRIdG1sKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLl9odG1sKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlVmVyc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbl9pZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQYWdlVmVyc2lvbk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBIVE1MIGNvbnRlbnQgaXMgaW5zaWRlIDxkaXYgaWQ9XCJwYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSAkKCcjcGFnZS1jb250ZW50Jyk7XG4gICAgICAgIGlmIChjb250ZW50RWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZW50aXJlIGJvZHkgaWYgcGFnZS1jb250ZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudEVsZW0uaHRtbCgpID8/ICcnO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudEh0bWw7XG4gICAgICAgIHJldHVybiBjb250ZW50SHRtbDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb24gSFRNTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VSZXZpc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSB8IG51bGwsIHJldmlzaW9ucz86IFBhZ2VSZXZpc2lvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChyZXZpc2lvbnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5yZXZpc2lvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFJldmlzaW9uIElEXG4gICAqIEByZXR1cm5zIFJldmlzaW9uICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc291cmNlIHN0cmluZ3NcbiAgICovXG4gIGdldFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTb3VyY2VEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgd2lraVRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VTb3VyY2Uge1xuICAvKiogUGFnZSB0aGlzIHNvdXJjZSBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpICovXG4gIHB1YmxpYyByZWFkb25seSB3aWtpVGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VTb3VyY2VEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMud2lraVRleHQgPSBkYXRhLndpa2lUZXh0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VTb3VyY2UocGFnZT0ke3RoaXMucGFnZS5mdWxsbmFtZX0sIGxlbmd0aD0ke3RoaXMud2lraVRleHQubGVuZ3RofSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugdm90ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZvdGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2Ugdm90ZSAocmF0aW5nKVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGUge1xuICAvKiogUGFnZSB0aGlzIHZvdGUgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogVXNlciB3aG8gdm90ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcblxuICAvKiogVm90ZSB2YWx1ZSAoKzEvLTEgb3IgbnVtZXJpYykgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVZvdGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlVm90ZSh1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCB2YWx1ZT0ke3RoaXMudmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGVDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZVZvdGU+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSwgdm90ZXM/OiBQYWdlVm90ZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmICh2b3Rlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnZvdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIFZvdGUgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlVc2VyKHVzZXI6IEFic3RyYWN0VXNlcik6IFBhZ2VWb3RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh2b3RlKSA9PiB2b3RlLnVzZXIuaWQgPT09IHVzZXIuaWQpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogUGFnZSBzZWFyY2ggcXVlcnkgcGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMge1xuICAvKiogUGFnZSB0eXBlIChlLmcuLCAnbm9ybWFsJywgJ2FkbWluJykgKi9cbiAgcGFnZXR5cGU/OiBzdHJpbmc7XG4gIC8qKiBDYXRlZ29yeSBuYW1lICovXG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogVGFncyB0byBzZWFyY2ggKEFORCBjb25kaXRpb24pICovXG4gIHRhZ3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIFBhcmVudCBwYWdlIG5hbWUgKi9cbiAgcGFyZW50Pzogc3RyaW5nO1xuICAvKiogTGlua2VkIHBhZ2UgbmFtZSAqL1xuICBsaW5rVG8/OiBzdHJpbmc7XG4gIC8qKiBDcmVhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqIFVwZGF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKiogQ3JlYXRvciAqL1xuICBjcmVhdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmc7XG4gIC8qKiBSYXRpbmcgY29uZGl0aW9uICovXG4gIHJhdGluZz86IHN0cmluZztcbiAgLyoqIFZvdGUgY291bnQgY29uZGl0aW9uICovXG4gIHZvdGVzPzogc3RyaW5nO1xuICAvKiogUGFnZSBuYW1lIGNvbmRpdGlvbiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRnVsbG5hbWUgKGV4YWN0IG1hdGNoKSAqL1xuICBmdWxsbmFtZT86IHN0cmluZztcbiAgLyoqIFJhbmdlIHNwZWNpZmljYXRpb24gKi9cbiAgcmFuZ2U/OiBzdHJpbmc7XG4gIC8qKiBTb3J0IG9yZGVyIChlLmcuLCAnY3JlYXRlZF9hdCBkZXNjJykgKi9cbiAgb3JkZXI/OiBzdHJpbmc7XG4gIC8qKiBTdGFydCBvZmZzZXQgKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU/OiBzdHJpbmc7XG4gIC8qKiBXcmFwcGVyIGRpc3BsYXkgKi9cbiAgd3JhcHBlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGl0ZW1zIHBlciBwYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjUwO1xuXG4vKipcbiAqIERlZmF1bHQgbW9kdWxlIGJvZHkgZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PRFVMRV9CT0RZID0gW1xuICAnZnVsbG5hbWUnLFxuICAnY2F0ZWdvcnknLFxuICAnbmFtZScsXG4gICd0aXRsZScsXG4gICdjcmVhdGVkX2F0JyxcbiAgJ2NyZWF0ZWRfYnlfbGlua2VkJyxcbiAgJ3VwZGF0ZWRfYXQnLFxuICAndXBkYXRlZF9ieV9saW5rZWQnLFxuICAnY29tbWVudGVkX2F0JyxcbiAgJ2NvbW1lbnRlZF9ieV9saW5rZWQnLFxuICAncGFyZW50X2Z1bGxuYW1lJyxcbiAgJ2NvbW1lbnRzJyxcbiAgJ3NpemUnLFxuICAnY2hpbGRyZW4nLFxuICAncmF0aW5nX3ZvdGVzJyxcbiAgJ3JhdGluZycsXG4gICdyYXRpbmdfcGVyY2VudCcsXG4gICdyZXZpc2lvbnMnLFxuICAndGFncycsXG4gICdfdGFncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQYWdlc1F1ZXJ5IHtcbiAgLyoqIFBhZ2UgdHlwZSAqL1xuICBwYWdldHlwZTogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgKi9cbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgLyoqIFRhZ3MgKi9cbiAgdGFnczogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuICAvKiogUGFyZW50IHBhZ2UgKi9cbiAgcGFyZW50OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTGluayB0YXJnZXQgKi9cbiAgbGlua1RvOiBzdHJpbmcgfCBudWxsO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZ1bGxuYW1lIGNvbmRpdGlvbiAqL1xuICBmdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhbmdlICovXG4gIHJhbmdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU29ydCBvcmRlciAqL1xuICBvcmRlcjogc3RyaW5nO1xuICAvKiogT2Zmc2V0ICovXG4gIG9mZnNldDogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZTogbnVtYmVyO1xuICAvKiogU2VwYXJhdGUgZGlzcGxheSAqL1xuICBzZXBhcmF0ZTogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFnZXR5cGUgPSBwYXJhbXMucGFnZXR5cGUgPz8gJyonO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgPz8gJyonO1xuICAgIHRoaXMudGFncyA9IHBhcmFtcy50YWdzID8/IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5saW5rVG8gPSBwYXJhbXMubGlua1RvID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBwYXJhbXMuY3JlYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBwYXJhbXMudXBkYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBwYXJhbXMuY3JlYXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5yYXRpbmcgPSBwYXJhbXMucmF0aW5nID8/IG51bGw7XG4gICAgdGhpcy52b3RlcyA9IHBhcmFtcy52b3RlcyA/PyBudWxsO1xuICAgIHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lID8/IG51bGw7XG4gICAgdGhpcy5mdWxsbmFtZSA9IHBhcmFtcy5mdWxsbmFtZSA/PyBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBwYXJhbXMucmFuZ2UgPz8gbnVsbDtcbiAgICB0aGlzLm9yZGVyID0gcGFyYW1zLm9yZGVyID8/ICdjcmVhdGVkX2F0IGRlc2MnO1xuICAgIHRoaXMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldCA/PyAwO1xuICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gbnVsbDtcbiAgICB0aGlzLnBlclBhZ2UgPSBwYXJhbXMucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFO1xuICAgIHRoaXMuc2VwYXJhdGUgPSBwYXJhbXMuc2VwYXJhdGUgPz8gJ25vJztcbiAgICB0aGlzLndyYXBwZXIgPSBwYXJhbXMud3JhcHBlciA/PyAnbm8nO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gZGljdGlvbmFyeSBmb3JtYXRcbiAgICovXG4gIGFzRGljdCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gcGFnZXR5cGUgYW5kIGNhdGVnb3J5IG11c3QgYWx3YXlzIGJlIGluY2x1ZGVkXG4gICAgLy8gV2lraWRvdCBkZWZhdWx0czogcGFnZXR5cGU9XCJub3JtYWxcIiwgY2F0ZWdvcnk9XCIuXCIgKGN1cnJlbnQgY2F0ZWdvcnkpXG4gICAgLy8gVG8gZ2V0IGFsbCBwYWdlcywgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNlbmQgXCIqXCJcbiAgICByZXN1bHQucGFnZXR5cGUgPSB0aGlzLnBhZ2V0eXBlO1xuICAgIHJlc3VsdC5jYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcnk7XG4gICAgaWYgKHRoaXMudGFncyAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnRhZ3MgPSBBcnJheS5pc0FycmF5KHRoaXMudGFncykgPyB0aGlzLnRhZ3Muam9pbignICcpIDogdGhpcy50YWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAodGhpcy5saW5rVG8gIT09IG51bGwpIHJlc3VsdC5saW5rX3RvID0gdGhpcy5saW5rVG87XG4gICAgaWYgKHRoaXMuY3JlYXRlZEF0ICE9PSBudWxsKSByZXN1bHQuY3JlYXRlZF9hdCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgIGlmICh0aGlzLnVwZGF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LnVwZGF0ZWRfYXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5jcmVhdGVkX2J5ID0gdHlwZW9mIHRoaXMuY3JlYXRlZEJ5ID09PSAnc3RyaW5nJyA/IHRoaXMuY3JlYXRlZEJ5IDogdGhpcy5jcmVhdGVkQnkubmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmF0aW5nICE9PSBudWxsKSByZXN1bHQucmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgaWYgKHRoaXMudm90ZXMgIT09IG51bGwpIHJlc3VsdC52b3RlcyA9IHRoaXMudm90ZXM7XG4gICAgaWYgKHRoaXMubmFtZSAhPT0gbnVsbCkgcmVzdWx0Lm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuZnVsbG5hbWUgIT09IG51bGwpIHJlc3VsdC5mdWxsbmFtZSA9IHRoaXMuZnVsbG5hbWU7XG4gICAgaWYgKHRoaXMucmFuZ2UgIT09IG51bGwpIHJlc3VsdC5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgICByZXN1bHQub3JkZXIgPSB0aGlzLm9yZGVyO1xuICAgIHJlc3VsdC5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICBpZiAodGhpcy5saW1pdCAhPT0gbnVsbCkgcmVzdWx0LmxpbWl0ID0gdGhpcy5saW1pdDtcbiAgICByZXN1bHQucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICByZXN1bHQuc2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlO1xuICAgIHJlc3VsdC53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQ2hhbmdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgcmV2aXNpb25ObzogbnVtYmVyO1xuICBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbk5vOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxhZ3M6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVDaGFuZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMucGFnZUZ1bGxuYW1lID0gZGF0YS5wYWdlRnVsbG5hbWU7XG4gICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VUaXRsZTtcbiAgICB0aGlzLnJldmlzaW9uTm8gPSBkYXRhLnJldmlzaW9uTm87XG4gICAgdGhpcy5jaGFuZ2VkQnkgPSBkYXRhLmNoYW5nZWRCeTtcbiAgICB0aGlzLmNoYW5nZWRBdCA9IGRhdGEuY2hhbmdlZEF0O1xuICAgIHRoaXMuZmxhZ3MgPSBkYXRhLmZsYWdzO1xuICAgIHRoaXMuY29tbWVudCA9IGRhdGEuY29tbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFBhZ2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLnBhZ2VGdWxsbmFtZX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVDaGFuZ2UocGFnZT0ke3RoaXMucGFnZUZ1bGxuYW1lfSwgcmV2PSR7dGhpcy5yZXZpc2lvbk5vfSwgYnk9JHt0aGlzLmNoYW5nZWRCeX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUNoYW5nZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxTaXRlQ2hhbmdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNoYW5nZXM/OiBTaXRlQ2hhbmdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2UgaGlzdG9yeVxuICAgKiBAcGFyYW0gc2l0ZSAtIFNpdGUgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgb3B0aW9ucz86IHsgcGVyUGFnZT86IG51bWJlcjsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwZXJQYWdlID0gb3B0aW9ucz8ucGVyUGFnZSA/PyAyMDtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdjaGFuZ2VzL1NpdGVDaGFuZ2VzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwZXJwYWdlOiBwZXJQYWdlLFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpdGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIFBhcnNlIHRhYmxlIHJvd3NcbiAgICAgICAgJCgndGFibGUud2lraS1jb250ZW50LXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCA0KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBQYWdlIGxpbmtcbiAgICAgICAgICBjb25zdCBwYWdlTGluayA9ICQoJGNlbGxzWzBdKS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHBhZ2VMaW5rLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlRnVsbG5hbWUgPSBocmVmLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKVswXSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlVGl0bGUgPSBwYWdlTGluay50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyXG4gICAgICAgICAgY29uc3QgcmV2VGV4dCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHJldk1hdGNoID0gcmV2VGV4dC5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb25ObyA9IHJldk1hdGNoPy5bMV0gPyBOdW1iZXIucGFyc2VJbnQocmV2TWF0Y2hbMV0sIDEwKSA6IDA7XG5cbiAgICAgICAgICAvLyBGbGFnc1xuICAgICAgICAgIGNvbnN0IGZsYWdzQ2VsbCA9ICQoJGNlbGxzWzJdKTtcbiAgICAgICAgICBjb25zdCBmbGFnczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmbGFnc0NlbGwuZmluZCgnc3BhbicpLmVhY2goKF9qLCBmbGFnRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmxhZ0NsYXNzID0gJChmbGFnRWxlbSkuYXR0cignY2xhc3MnKSA/PyAnJztcbiAgICAgICAgICAgIGlmIChmbGFnQ2xhc3MuaW5jbHVkZXMoJ3NwYW50aXAnKSkge1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoZmxhZ0VsZW0pLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG4gICAgICAgICAgICAgIGlmICh0aXRsZSkgZmxhZ3MucHVzaCh0aXRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVc2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBpbmZvQ2VsbCA9ICQoJGNlbGxzWzNdKTtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEJ5ID0gdXNlckVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkQXQgPSBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlT2RhdGUob2RhdGVFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICAvLyBDb21tZW50XG4gICAgICAgICAgY29uc3QgY29tbWVudEVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLmNvbW1lbnRzJyk7XG4gICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRFbGVtXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXltcIlwiXXxbXCJcIl0kL2csICcnKTtcblxuICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBTaXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgcGFnZUZ1bGxuYW1lLFxuICAgICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICAgIHJldmlzaW9uTm8sXG4gICAgICAgICAgICAgIGNoYW5nZWRCeSxcbiAgICAgICAgICAgICAgY2hhbmdlZEF0LFxuICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGltaXQgcmVzdWx0cyBpZiBsaW1pdCBpcyBzcGVjaWZpZWRcbiAgICAgICAgY29uc3QgbGltaXRlZENoYW5nZXMgPSBsaW1pdCAhPT0gdW5kZWZpbmVkID8gY2hhbmdlcy5zbGljZSgwLCBsaW1pdCkgOiBjaGFuZ2VzO1xuICAgICAgICByZXR1cm4gbmV3IFNpdGVDaGFuZ2VDb2xsZWN0aW9uKHNpdGUsIGxpbWl0ZWRDaGFuZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNpdGUgY2hhbmdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHtcbiAgUGFnZSxcbiAgUGFnZUNvbGxlY3Rpb24sXG4gIFNlYXJjaFBhZ2VzUXVlcnksXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogUGFnZSBsaXN0IG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VzQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGFnZXMgbWF0Y2hpbmcgY29uZGl0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gU2VhcmNoIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgUGFnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBzZWFyY2gocGFyYW1zPzogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkocGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXNlclBhcnNlciA9IHBhcnNlVXNlci5iaW5kKG51bGwsIHRoaXMuc2l0ZS5jbGllbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLnNlYXJjaFBhZ2VzKHRoaXMuc2l0ZSwgdXNlclBhcnNlciwgcXVlcnkpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBhZ2VzXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgYWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaCh7fSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5wZXJQYWdlIC0gSXRlbXMgcGVyIHBhZ2UgKGRlZmF1bHQ6IDIwKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5wYWdlIC0gUGFnZSBudW1iZXIgKGRlZmF1bHQ6IDEpXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJlY2VudENoYW5nZXMob3B0aW9ucz86IHtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gU2l0ZUNoYW5nZUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzLnNpdGUsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSwgQU1DUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2xpZW50JztcbmltcG9ydCB7IEZvcnVtQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBNZW1iZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL21lbWJlci1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yJztcbmltcG9ydCB7IFBhZ2VzQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvcic7XG5cbi8qKlxuICogU2l0ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZURhdGEge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bml4TmFtZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNpdGUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgLyoqIFNpdGUgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFNpdGUgdGl0bGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggbmFtZSAoZS5nLiwgc2NwLWpwKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZztcblxuICAvKiogRG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgZmxhZyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKiBQYWdlIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX3BhZ2U6IFBhZ2VBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBQYWdlcyBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlczogUGFnZXNBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3J1bSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9mb3J1bTogRm9ydW1BY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBNZW1iZXIgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfbWVtYmVyOiBNZW1iZXJBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBTaXRlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lO1xuICAgIHRoaXMuZG9tYWluID0gZGF0YS5kb21haW47XG4gICAgdGhpcy5zc2xTdXBwb3J0ZWQgPSBkYXRhLnNzbFN1cHBvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IHBhZ2UoKTogUGFnZUFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSBuZXcgUGFnZUFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZXMgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlcygpOiBQYWdlc0FjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2VzKSB7XG4gICAgICB0aGlzLl9wYWdlcyA9IG5ldyBQYWdlc0FjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgZm9ydW0oKTogRm9ydW1BY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9mb3J1bSkge1xuICAgICAgdGhpcy5fZm9ydW0gPSBuZXcgRm9ydW1BY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvcnVtO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1iZXIgYWNjZXNzb3JcbiAgICovXG4gIGdldCBtZW1iZXIoKTogTWVtYmVyQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fbWVtYmVyKSB7XG4gICAgICB0aGlzLl9tZW1iZXIgPSBuZXcgTWVtYmVyQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJhc2UgVVJMIG9mIHRoZSBzaXRlXG4gICAqL1xuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnNzbFN1cHBvcnRlZCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7dGhpcy5kb21haW59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0IHRvIHRoaXMgc2l0ZVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZSBhcnJheVxuICAgKi9cbiAgYW1jUmVxdWVzdChib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMsIHRoaXMudW5peE5hbWUsIHRoaXMuc3NsU3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZVxuICAgKi9cbiAgYW1jUmVxdWVzdFNpbmdsZShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChbYm9keV0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdBTUMgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5leHBlY3RlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGZyb20gVU5JWCBuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlXG4gICAqL1xuICBzdGF0aWMgZnJvbVVuaXhOYW1lKGNsaWVudDogQ2xpZW50LCB1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBGZXRjaCBzaXRlIHBhZ2UgKEhUVFAgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0cylcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgbm90IGZvdW5kOiAke3VuaXhOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggc2l0ZTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIFBhcnNlIFdJS0lSRVFVRVNULmluZm9cbiAgICAgICAgY29uc3Qgc2NyaXB0cyA9ICQoJ3NjcmlwdCcpLnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IHNpdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzaXRlVW5peE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoc2NyaXB0KS5odG1sKCk7XG4gICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBTU0wgc3VwcG9ydCAoYmFzZWQgb24gd2hldGhlciB0aGUgcmVkaXJlY3QgVVJMIHN0YXJ0cyB3aXRoIGh0dHBzKVxuICAgICAgICBjb25zdCBzc2xTdXBwb3J0ZWQgPSByZXNwb25zZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNpdGUoY2xpZW50LCB7XG4gICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB1bml4TmFtZTogc2l0ZVVuaXhOYW1lLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNpdGU6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGUoaWQ9JHt0aGlzLmlkfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFNpdGUgfSBmcm9tICcuLi8uLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGJ5IFVOSVggbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGUgb2JqZWN0IHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogaWYgKCFzaXRlUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBzaXRlJyk7XG4gICAqIH1cbiAgICogY29uc3Qgc2l0ZSA9IHNpdGVSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFVzZXIgcmV0cmlldmFsIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaHJvdyBlcnJvciBpZiB1c2VyIG5vdCBmb3VuZCAoZGVmYXVsdDogZmFsc2UpICovXG4gIHJhaXNlV2hlbk5vdEZvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGJ5IHVzZXJuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVXNlcm5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGUgKG51bGwgaWYgbm90IGZvdW5kLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdXNlcicpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGZyb20gbXVsdGlwbGUgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgY29sbGVjdGlvbiAobnVsbCBmb3Igbm9uLWV4aXN0ZW50IHVzZXJzLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKi9cbiAgZ2V0TWFueShuYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZXModGhpcy5jbGllbnQsIG5hbWVzKS5hbmRUaGVuKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3Qgbm90Rm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbltpXSA9PT0gbnVsbCAmJiBuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vdEZvdW5kTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdEZvdW5kTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlcnMgbm90IGZvdW5kOiAke25vdEZvdW5kTmFtZXMuam9pbignLCAnKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY29sbGVjdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBmcm9tUHJvbWlzZSxcbiAgdHlwZSBXaWtpZG90UmVzdWx0LFxuICB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyxcbiAgd2RFcnIsXG4gIHdkT2ssXG4gIHdkT2tBc3luYyxcbn0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNDb25maWcsIGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgeyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcG0tYWNjZXNzb3InO1xuaW1wb3J0IHsgU2l0ZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBVc2VyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yJztcblxuLyoqXG4gKiBDbGllbnQgY3JlYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdCB1c2VybmFtZSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdCBwYXNzd29yZCAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiogQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQyBjb25maWd1cmF0aW9uIG92ZXJyaWRlICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG90IGNsaWVudFxuICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqIEFNQyBjbGllbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlckFjY2Vzc29yO1xuXG4gIC8qKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGVBY2Nlc3NvcjtcblxuICAvKiogUHJpdmF0ZSBtZXNzYWdlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiBVc2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIExvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3JcbiAgICogVXNlIHRoZSBjcmVhdGUgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihhbWNDbGllbnQ6IEFNQ0NsaWVudCwgZG9tYWluOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuYW1jQ2xpZW50ID0gYW1jQ2xpZW50O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjY2Vzc29yc1xuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGxvZ2dlZCBpblxuICAgKi9cbiAgZ2V0IG1lKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnNcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBDbGllbnQgfSBmcm9tICdAdWt3aGF0bi93aWtpZG90JztcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgY2xpZW50XG4gICAqIGNvbnN0IGNsaWVudFJlc3VsdCA9IGF3YWl0IENsaWVudC5jcmVhdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAneW91cl91c2VybmFtZScsXG4gICAqICAgcGFzc3dvcmQ6ICd5b3VyX3Bhc3N3b3JkJyxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFJlc3VsdCB0eXBlIHJlcXVpcmVzIGlzT2soKSBjaGVjayBiZWZvcmUgYWNjZXNzaW5nIC52YWx1ZVxuICAgKiBpZiAoIWNsaWVudFJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50Jyk7XG4gICAqIH1cbiAgICogY29uc3QgY2xpZW50ID0gY2xpZW50UmVzdWx0LnZhbHVlO1xuICAgKlxuICAgKiAvLyBOb3cgeW91IGNhbiBhY2Nlc3MgY2xpZW50LnNpdGUsIGV0Yy5cbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8Q2xpZW50PiB7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIEFNQyBjbGllbnRcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcblxuICAgIC8vIExvZ2luIGlmIGNyZWRlbnRpYWxzIGFyZSBwcm92aWRlZFxuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4sIHVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGxvZ2luKGNsaWVudCwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgbG9naW5SZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnMgKGV4Y2x1ZGluZyBjcmVkZW50aWFscylcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGxvZ2luIHN0YXR1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvZ2dlZCBpblxuICAgKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWUgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBsb2dpblxuICAgKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluXG4gICAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjbGllbnRcbiAgICogQXR0ZW1wdHMgdG8gbG9nb3V0IGlmIGEgc2Vzc2lvbiBleGlzdHNcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9xdWljay1tb2R1bGUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBSXNCLGNBa0JUO0FBQUE7QUFBQSxFQWxCUyxlQUFmLE1BQWUscUJBQXFCLE1BQU07QUFBQSxJQUV0QjtBQUFBLElBS3pCLFdBQVcsQ0FBQyxTQUFpQjtBQUFBLE1BQzNCLE1BQU0sT0FBTztBQUFBLE1BQ2IsS0FBSyxPQUFPLEtBQUssWUFBWTtBQUFBLE1BQzdCLE9BQU8sZUFBZSxNQUFNLFdBQVcsU0FBUztBQUFBO0FBQUEsRUFFcEQ7QUFBQSxFQU1hLGtCQUFOLE1BQU0sd0JBQXdCLGFBQWE7QUFBQSxFQUFDO0FBQUE7OztJQ2pCdEMsVUFNQSxjQWtCQSxvQkFrQkE7QUFBQTtBQUFBLEVBL0NiO0FBQUEsRUFLYSxXQUFOLE1BQU0saUJBQWlCLGFBQWE7QUFBQSxFQUFDO0FBQUEsRUFNL0IsZUFBTixNQUFNLHFCQUFxQixT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QVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtB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QkFBNEIsT0FBTyxLQUFLLEdBQUc7QUFBQSxPQUU3RTtBQUFBLElBQ0Y7QUFBQSxJQUdBLE9BQU8sVUFBVSxJQUFJLE9BQU8sV0FBVyxNQUFNLENBQUM7QUFBQTtBQUFBLFNBUXpDLGVBQWUsQ0FBQyxVQUF3RCxDQUFDLEdBQVc7QUFBQSxJQUN6RixRQUFRLFNBQVMsZUFBZSxZQUFZLENBQUMsTUFBTTtBQUFBLElBQ25ELE1BQU0sWUFBWSxJQUFJLFVBQVUsV0FBVyxNQUFNO0FBQUEsSUFDakQsT0FBTyxJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUE7QUFBQSxFQU9yQyxVQUFVLEdBQVk7QUFBQSxJQUNwQixPQUFPLEtBQUssY0FBYztBQUFBO0FBQUEsRUFRNUIsWUFBWSxHQUF3QjtBQUFBLElBQ2xDLElBQUksQ0FBQyxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ3RCLE9BQU8sTUFBTSxJQUFJLGtCQUFvQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUztBQUFBO0FBQUEsRUFPdkIsS0FBSyxHQUE2QjtBQUFBLElBQ2hDLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksTUFBTTtBQUFBLFFBQzVCLEtBQUssWUFBWTtBQUFBLFFBQ2pCO0FBQUEsT0FDRDtBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU8sVUFBVSxTQUFTO0FBQUE7QUFFOUI7O0FDbE1BO0FBS0E7O0FDTkE7IiwKICAiZGVidWdJZCI6ICIxNjY2OURBMzA5RTZFMDJDNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==