diff --git a/.gitignore b/.gitignore index d08f1c46..220dd27d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ node_modules .env.development.local .env.test.local .env.production.local +build npm-debug.log* yarn-debug.log* diff --git a/Documentation.md b/Documentation.md index e91429d7..cede2959 100644 --- a/Documentation.md +++ b/Documentation.md @@ -648,6 +648,8 @@ Get the unique contactId of this contact. ### `contact.getOriginalContactId()` / `contact.getInitialContactId()` ```js var originalContactId = contact.getOriginalContactId(); +//OR +var initialContactId = contact.getInitialContactId(); ``` Get the original (initial) contact id from which this contact was transferred, or none if this is not an internal Connect transfer. This is typically a contact owned by another agent, thus this agent will not be able to diff --git a/gulpfile.js b/gulpfile.js index 54dbc2ed..f0e9dde3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,6 +6,7 @@ var istanbul = require('gulp-istanbul'), rename = require('gulp-rename'), watch = require('gulp-watch'), jshint = require('gulp-jshint'), + replace = require('gulp-replace'), pump = require('pump'); var source = [ "src/aws-client.js", @@ -50,6 +51,7 @@ gulp.task('script', function (cb) { pump([ gulp.src(source), jshint(), + replace("STREAMS_VERSION", process.env.npm_package_version), concat('connect-streams.js'), gulp.dest('./release/'), rename('connect-streams-min.js'), @@ -58,4 +60,4 @@ gulp.task('script', function (cb) { ], cb); }); -gulp.task('default',gulp.series('test','script')); +gulp.task('default', gulp.series('test','script')); diff --git a/package-lock.json b/package-lock.json index 3f885e81..1da03c0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "amazon-connect-streams", - "version": "1.4.5", + "version": "1.4.8", "lockfileVersion": 1, "requires": true, "dependencies": { "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -392,6 +392,12 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -767,9 +773,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -926,9 +932,9 @@ "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dom-serializer": { @@ -948,9 +954,9 @@ "dev": true }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz", + "integrity": "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==", "dev": true } } @@ -1002,6 +1008,12 @@ "object.defaults": "^1.1.0" } }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -1554,561 +1566,14 @@ "dev": true }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } + "nan": "^2.12.1" } }, "function-bind": { @@ -2281,9 +1746,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growl": { @@ -2305,9 +1770,9 @@ } }, "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.1.tgz", + "integrity": "sha512-yEMxrXqY8mJFlaauFQxNrCpzWJThu0sH1sqlToaTOT063Hub9s/Nt2C+GSLe6feQ/IMWrHvGOOsyES7CQc9O+A==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -2426,6 +1891,17 @@ "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", "dev": true }, + "gulp-replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", + "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", + "dev": true, + "requires": { + "istextorbinary": "2.2.1", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, "gulp-rev": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-8.1.1.tgz", @@ -2667,15 +2143,16 @@ } }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { "source-map": { @@ -2764,9 +2241,9 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "htmlparser2": { @@ -3173,10 +2650,21 @@ "lodash": "~4.17.2" } }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3192,9 +2680,9 @@ } }, "jshint": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz", - "integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.1.tgz", + "integrity": "sha512-WXWePB8ssAH3DlD05IoqolsY6arhbll/1+i2JkRPpihQAuiNaR/gSt8VKIcxpV5m6XChP0hCwESQUqpuQMA8Tg==", "dev": true, "requires": { "cli": "~1.0.0", @@ -3205,6 +2693,14 @@ "minimatch": "~3.0.2", "shelljs": "0.3.x", "strip-json-comments": "1.0.x" + }, + "dependencies": { + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } } }, "json-stable-stringify-without-jsonify": { @@ -3220,9 +2716,9 @@ "dev": true }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "kind-of": { @@ -3377,9 +2873,9 @@ "dev": true }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-error-cause": { @@ -3499,9 +2995,9 @@ } }, "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { @@ -3526,20 +3022,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "mocha": { @@ -3611,10 +3099,10 @@ "ms": "^2.1.1" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "find-up": { @@ -3658,11 +3146,15 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, "mkdirp": { "version": "0.5.4", @@ -3705,12 +3197,6 @@ "ansi-regex": "^4.1.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -3792,9 +3278,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, "optional": true }, @@ -4087,24 +3573,6 @@ "mimic-fn": "^2.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4607,9 +4075,9 @@ "dev": true }, "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, "replace-homedir": { @@ -4623,6 +4091,17 @@ "remove-trailing-separator": "^1.1.0" } }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4636,9 +4115,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4968,9 +4447,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -4978,15 +4457,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -5065,9 +4544,9 @@ } }, "string.prototype.trimend": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", - "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -5097,9 +4576,9 @@ } }, "string.prototype.trimstart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", - "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -5159,9 +4638,9 @@ "dev": true }, "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { @@ -5183,6 +4662,12 @@ "es6-symbol": "^3.1.1" } }, + "textextensions": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", + "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -5304,21 +4789,12 @@ "dev": true }, "uglify-js": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", - "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", "dev": true, "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "commander": "~2.20.3" } }, "unc-path-regex": { @@ -5602,9 +5078,9 @@ "dev": true }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -5619,16 +5095,17 @@ "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "yargs-parser": "5.0.0-security.0" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", "dev": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" } }, "yargs-unparser": { diff --git a/package.json b/package.json index 164236a3..7f891285 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "1.4.7", + "version": "1.4.8", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" @@ -46,6 +46,7 @@ "gulp-jshint": "^2.1.0", "gulp-mocha": "^7.0.2", "gulp-rename": "^1.2.2", + "gulp-replace": "^1.0.0", "gulp-rev": "^8.1.1", "gulp-uglify": "^3.0.0", "gulp-watch": "^5.0.1", diff --git a/release/connect-streams-min.js b/release/connect-streams-min.js index 30701db5..077bc7b8 100644 --- a/release/connect-streams-min.js +++ b/release/connect-streams-min.js @@ -1 +1 @@ -!function i(s,a,c){function u(t,e){if(!a[t]){if(!s[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(l)return l(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=a[t]={exports:{}};s[t][0].call(o.exports,function(e){return u(s[t][1][e]||e)},o,o.exports,i,s,a,c)}return a[t].exports}for(var l="function"==typeof require&&require,e=0;ee.BLOCK_SIZE){var r=new e;r.update(n),n=r.digest()}var o=new Uint8Array(e.BLOCK_SIZE);return o.set(n),o}(e,t),r=new Uint8Array(e.BLOCK_SIZE);r.set(n);for(var o=0;o>>32-o)+n&4294967295}function s(e,t,n,r,o,i,s){return c(t&n|~t&r,e,t,o,i,s)}function u(e,t,n,r,o,i,s){return c(t&r|n&~r,e,t,o,i,s)}function l(e,t,n,r,o,i,s){return c(t^n^r,e,t,o,i,s)}function p(e,t,n,r,o,i,s){return c(n^(t|~r),e,t,o,i,s)}t.exports=r,r.BLOCK_SIZE=64,r.prototype.update=function(e){if(o.isEmptyData(e))return this;if(this.finished)throw new Error("Attempted to update an already finished hash.");var t=o.convertToBuffer(e),n=0,r=t.byteLength;for(this.bytesHashed+=r;0>>0,!0),t.setUint32(60,Math.floor(r/4294967296),!0),this.hashBuffer(),this.finished=!0}var i=new DataView(new ArrayBuffer(16));for(o=0;o<4;o++)i.setUint32(4*o,this.state[o],!0);var s=new a(i.buffer,i.byteOffset,i.byteLength);return e?s.toString(e):s},r.prototype.hashBuffer=function(){var e=this.buffer,t=this.state,n=t[0],r=t[1],o=t[2],i=t[3];n=s(n,r,o,i,e.getUint32(0,!0),7,3614090360),i=s(i,n,r,o,e.getUint32(4,!0),12,3905402710),o=s(o,i,n,r,e.getUint32(8,!0),17,606105819),r=s(r,o,i,n,e.getUint32(12,!0),22,3250441966),n=s(n,r,o,i,e.getUint32(16,!0),7,4118548399),i=s(i,n,r,o,e.getUint32(20,!0),12,1200080426),o=s(o,i,n,r,e.getUint32(24,!0),17,2821735955),r=s(r,o,i,n,e.getUint32(28,!0),22,4249261313),n=s(n,r,o,i,e.getUint32(32,!0),7,1770035416),i=s(i,n,r,o,e.getUint32(36,!0),12,2336552879),o=s(o,i,n,r,e.getUint32(40,!0),17,4294925233),r=s(r,o,i,n,e.getUint32(44,!0),22,2304563134),n=s(n,r,o,i,e.getUint32(48,!0),7,1804603682),i=s(i,n,r,o,e.getUint32(52,!0),12,4254626195),o=s(o,i,n,r,e.getUint32(56,!0),17,2792965006),n=u(n,r=s(r,o,i,n,e.getUint32(60,!0),22,1236535329),o,i,e.getUint32(4,!0),5,4129170786),i=u(i,n,r,o,e.getUint32(24,!0),9,3225465664),o=u(o,i,n,r,e.getUint32(44,!0),14,643717713),r=u(r,o,i,n,e.getUint32(0,!0),20,3921069994),n=u(n,r,o,i,e.getUint32(20,!0),5,3593408605),i=u(i,n,r,o,e.getUint32(40,!0),9,38016083),o=u(o,i,n,r,e.getUint32(60,!0),14,3634488961),r=u(r,o,i,n,e.getUint32(16,!0),20,3889429448),n=u(n,r,o,i,e.getUint32(36,!0),5,568446438),i=u(i,n,r,o,e.getUint32(56,!0),9,3275163606),o=u(o,i,n,r,e.getUint32(12,!0),14,4107603335),r=u(r,o,i,n,e.getUint32(32,!0),20,1163531501),n=u(n,r,o,i,e.getUint32(52,!0),5,2850285829),i=u(i,n,r,o,e.getUint32(8,!0),9,4243563512),o=u(o,i,n,r,e.getUint32(28,!0),14,1735328473),n=l(n,r=u(r,o,i,n,e.getUint32(48,!0),20,2368359562),o,i,e.getUint32(20,!0),4,4294588738),i=l(i,n,r,o,e.getUint32(32,!0),11,2272392833),o=l(o,i,n,r,e.getUint32(44,!0),16,1839030562),r=l(r,o,i,n,e.getUint32(56,!0),23,4259657740),n=l(n,r,o,i,e.getUint32(4,!0),4,2763975236),i=l(i,n,r,o,e.getUint32(16,!0),11,1272893353),o=l(o,i,n,r,e.getUint32(28,!0),16,4139469664),r=l(r,o,i,n,e.getUint32(40,!0),23,3200236656),n=l(n,r,o,i,e.getUint32(52,!0),4,681279174),i=l(i,n,r,o,e.getUint32(0,!0),11,3936430074),o=l(o,i,n,r,e.getUint32(12,!0),16,3572445317),r=l(r,o,i,n,e.getUint32(24,!0),23,76029189),n=l(n,r,o,i,e.getUint32(36,!0),4,3654602809),i=l(i,n,r,o,e.getUint32(48,!0),11,3873151461),o=l(o,i,n,r,e.getUint32(60,!0),16,530742520),n=p(n,r=l(r,o,i,n,e.getUint32(8,!0),23,3299628645),o,i,e.getUint32(0,!0),6,4096336452),i=p(i,n,r,o,e.getUint32(28,!0),10,1126891415),o=p(o,i,n,r,e.getUint32(56,!0),15,2878612391),r=p(r,o,i,n,e.getUint32(20,!0),21,4237533241),n=p(n,r,o,i,e.getUint32(48,!0),6,1700485571),i=p(i,n,r,o,e.getUint32(12,!0),10,2399980690),o=p(o,i,n,r,e.getUint32(40,!0),15,4293915773),r=p(r,o,i,n,e.getUint32(4,!0),21,2240044497),n=p(n,r,o,i,e.getUint32(32,!0),6,1873313359),i=p(i,n,r,o,e.getUint32(60,!0),10,4264355552),o=p(o,i,n,r,e.getUint32(24,!0),15,2734768916),r=p(r,o,i,n,e.getUint32(52,!0),21,1309151649),n=p(n,r,o,i,e.getUint32(16,!0),6,4149444226),i=p(i,n,r,o,e.getUint32(44,!0),10,3174756917),o=p(o,i,n,r,e.getUint32(8,!0),15,718787259),r=p(r,o,i,n,e.getUint32(36,!0),21,3951481745),t[0]=n+t[0]&4294967295,t[1]=r+t[1]&4294967295,t[2]=o+t[2]&4294967295,t[3]=i+t[3]&4294967295}},{"./browserHashUtils":11,"buffer/":83}],14:[function(e,t,n){var o=e("buffer/").Buffer,r=e("./browserHashUtils");new Uint32Array([1518500249,1859775393,-1894007588,-899497514]),Math.pow(2,53);function i(){this.h0=1732584193,this.h1=4023233417,this.h2=2562383102,this.h3=271733878,this.h4=3285377520,this.block=new Uint32Array(80),this.offset=0,this.shift=24,this.totalLength=0}t.exports=i,i.BLOCK_SIZE=64,i.prototype.update=function(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");if(r.isEmptyData(e))return this;var t=(e=r.convertToBuffer(e)).length;this.totalLength+=8*t;for(var n=0;n>t);var n=new o(20),r=new DataView(n.buffer);return r.setUint32(0,this.h0,!1),r.setUint32(4,this.h1,!1),r.setUint32(8,this.h2,!1),r.setUint32(12,this.h3,!1),r.setUint32(16,this.h4,!1),e?n.toString(e):n},i.prototype.processBlock=function(){for(var e=16;e<80;e++){var t=this.block[e-3]^this.block[e-8]^this.block[e-14]^this.block[e-16];this.block[e]=t<<1|t>>>31}var n,r,o=this.h0,i=this.h1,s=this.h2,a=this.h3,c=this.h4;for(e=0;e<80;e++){r=e<20?(n=a^i&(s^a),1518500249):e<40?(n=i^s^a,1859775393):e<60?(n=i&s|a&(i|s),2400959708):(n=i^s^a,3395469782);var u=(o<<5|o>>>27)+n+c+r+(0|this.block[e]);c=a,a=s,s=i<<30|i>>>2,i=o,o=u}for(this.h0=this.h0+o|0,this.h1=this.h1+i|0,this.h2=this.h2+s|0,this.h3=this.h3+a|0,this.h4=this.h4+c|0,e=this.offset=0;e<16;e++)this.block[e]=0}},{"./browserHashUtils":11,"buffer/":83}],15:[function(e,t,n){var s=e("buffer/").Buffer,r=e("./browserHashUtils"),m=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),o=Math.pow(2,53)-1;function i(){this.state=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.temp=new Int32Array(64),this.buffer=new Uint8Array(64),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}t.exports=i,i.BLOCK_SIZE=64,i.prototype.update=function(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");if(r.isEmptyData(e))return this;var t=0,n=(e=r.convertToBuffer(e)).byteLength;if(this.bytesHashed+=n,8*this.bytesHashed>o)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;0>>24&255,i[4*o+1]=this.state[o]>>>16&255,i[4*o+2]=this.state[o]>>>8&255,i[4*o+3]=this.state[o]>>>0&255;return e?i.toString(e):i},i.prototype.hashBuffer=function(){for(var e=this.buffer,t=this.state,n=t[0],r=t[1],o=t[2],i=t[3],s=t[4],a=t[5],c=t[6],u=t[7],l=0;l<64;l++){if(l<16)this.temp[l]=(255&e[4*l])<<24|(255&e[4*l+1])<<16|(255&e[4*l+2])<<8|255&e[4*l+3];else{var p=this.temp[l-2],h=(p>>>17|p<<15)^(p>>>19|p<<13)^p>>>10,f=((p=this.temp[l-15])>>>7|p<<25)^(p>>>18|p<<14)^p>>>3;this.temp[l]=(h+this.temp[l-7]|0)+(f+this.temp[l-16]|0)}var d=(((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))+(s&a^~s&c)|0)+(u+(m[l]+this.temp[l]|0)|0)|0,g=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+(n&r^n&o^r&o)|0;u=c,c=a,a=s,s=i+d|0,i=o,o=r,r=n,n=d+g|0}t[0]+=n,t[1]+=r,t[2]+=o,t[3]+=i,t[4]+=s,t[5]+=a,t[6]+=c,t[7]+=u}},{"./browserHashUtils":11,"buffer/":83}],16:[function(r,o,e){(function(e){var t=r("./util");t.crypto.lib=r("./browserCryptoLib"),t.Buffer=r("buffer/").Buffer,t.url=r("url/"),t.querystring=r("querystring/"),t.realClock=r("./realclock/browserClock"),t.environment="js",t.createEventStream=r("./event-stream/buffered-create-event-stream").createEventStream,t.isBrowser=function(){return!0},t.isNode=function(){return!1};var n=r("./core");if(o.exports=n,r("./credentials"),r("./credentials/credential_provider_chain"),r("./credentials/temporary_credentials"),r("./credentials/chainable_temporary_credentials"),r("./credentials/web_identity_credentials"),r("./credentials/cognito_identity_credentials"),r("./credentials/saml_credentials"),n.XML.Parser=r("./xml/browser_parser"),r("./http/xhr"),void 0===e)e={browser:!0}}).call(this,r("_process"))},{"./browserCryptoLib":10,"./core":18,"./credentials":19,"./credentials/chainable_temporary_credentials":20,"./credentials/cognito_identity_credentials":21,"./credentials/credential_provider_chain":22,"./credentials/saml_credentials":23,"./credentials/temporary_credentials":24,"./credentials/web_identity_credentials":25,"./event-stream/buffered-create-event-stream":27,"./http/xhr":35,"./realclock/browserClock":52,"./util":71,"./xml/browser_parser":72,_process:87,"buffer/":83,"querystring/":94,"url/":96}],17:[function(e,t,n){var r,i=e("./core");e("./credentials"),e("./credentials/credential_provider_chain"),i.Config=i.util.inherit({constructor:function(n){void 0===n&&(n={}),n=this.extractCredentials(n),i.util.each.call(this,this.keys,function(e,t){this.set(e,n[e],t)})},getCredentials:function(t){var e,n=this;function r(e){t(e,e?null:n.credentials)}function o(e,t){return new i.util.error(t||new Error,{code:"CredentialsError",message:e,name:"CredentialsError"})}n.credentials?"function"==typeof n.credentials.get?n.credentials.get(function(e){e=e&&o("Could not load credentials from "+n.credentials.constructor.name,e);r(e)}):(e=null,n.credentials.accessKeyId&&n.credentials.secretAccessKey||(e=o("Missing credentials")),r(e)):n.credentialProvider?n.credentialProvider.resolve(function(e,t){e=e&&o("Could not load credentials from any providers",e),n.credentials=t,r(e)}):r(o("No credentials to load"))},update:function(e,n){n=n||!1,e=this.extractCredentials(e),i.util.each.call(this,e,function(e,t){(n||Object.prototype.hasOwnProperty.call(this.keys,e)||i.Service.hasService(e))&&this.set(e,t)})},loadFromPath:function(e){this.clear();var n=JSON.parse(i.util.readFileSync(e)),t=new i.FileSystemCredentials(e),r=new i.CredentialProviderChain;return r.providers.unshift(t),r.resolve(function(e,t){if(e)throw e;n.credentials=t}),this.constructor(n),this},clear:function(){i.util.each.call(this,this.keys,function(e){delete this[e]}),this.set("credentials",void 0),this.set("credentialProvider",void 0)},set:function(e,t,n){void 0===t?(void 0===n&&(n=this.keys[e]),this[e]="function"==typeof n?n.call(this):n):"httpOptions"===e&&this[e]?this[e]=i.util.merge(this[e],t):this[e]=t},keys:{credentials:null,credentialProvider:null,region:null,logger:null,apiVersions:{},apiVersion:null,endpoint:void 0,httpOptions:{timeout:12e4},maxRetries:void 0,maxRedirects:10,paramValidation:!0,sslEnabled:!0,s3ForcePathStyle:!1,s3BucketEndpoint:!1,s3DisableBodySigning:!0,computeChecksums:!0,convertResponseTypes:!0,correctClockSkew:!1,customUserAgent:null,dynamoDbCrc32:!0,systemClockOffset:0,signatureVersion:null,signatureCache:!0,retryDelayOptions:{},useAccelerateEndpoint:!1,clientSideMonitoring:!1,endpointDiscoveryEnabled:!1,endpointCacheSize:1e3,hostPrefixEnabled:!0,stsRegionalEndpoints:null},extractCredentials:function(e){return e.accessKeyId&&e.secretAccessKey&&((e=i.util.copy(e)).credentials=new i.Credentials(e)),e},setPromisesDependency:function(e){null===(r=e)&&"function"==typeof Promise&&(r=Promise);var t=[i.Request,i.Credentials,i.CredentialProviderChain];i.S3&&(t.push(i.S3),i.S3.ManagedUpload&&t.push(i.S3.ManagedUpload)),i.util.addPromises(t,r)},getPromisesDependency:function(){return r}}),i.config=new i.Config},{"./core":18,"./credentials":19,"./credentials/credential_provider_chain":22}],18:[function(e,t,n){var r={util:e("./util")};({}).toString(),(t.exports=r).util.update(r,{VERSION:"2.553.0",Signers:{},Protocol:{Json:e("./protocol/json"),Query:e("./protocol/query"),Rest:e("./protocol/rest"),RestJson:e("./protocol/rest_json"),RestXml:e("./protocol/rest_xml")},XML:{Builder:e("./xml/builder"),Parser:null},JSON:{Builder:e("./json/builder"),Parser:e("./json/parser")},Model:{Api:e("./model/api"),Operation:e("./model/operation"),Shape:e("./model/shape"),Paginator:e("./model/paginator"),ResourceWaiter:e("./model/resource_waiter")},apiLoader:e("./api_loader"),EndpointCache:e("../vendor/endpoint-cache").EndpointCache}),e("./sequential_executor"),e("./service"),e("./config"),e("./http"),e("./event_listeners"),e("./request"),e("./response"),e("./resource_waiter"),e("./signers/request_signer"),e("./param_validator"),r.events=new r.SequentialExecutor,r.util.memoizedProperty(r,"endpointCache",function(){return new r.EndpointCache(r.config.endpointCacheSize)},!0)},{"../vendor/endpoint-cache":105,"./api_loader":9,"./config":17,"./event_listeners":33,"./http":34,"./json/builder":36,"./json/parser":37,"./model/api":38,"./model/operation":40,"./model/paginator":41,"./model/resource_waiter":42,"./model/shape":43,"./param_validator":44,"./protocol/json":46,"./protocol/query":47,"./protocol/rest":48,"./protocol/rest_json":49,"./protocol/rest_xml":50,"./request":55,"./resource_waiter":56,"./response":57,"./sequential_executor":58,"./service":59,"./signers/request_signer":63,"./util":71,"./xml/builder":73}],19:[function(e,t,n){var o=e("./core");o.Credentials=o.util.inherit({constructor:function(e,t,n){if(o.util.hideProperties(this,["secretAccessKey"]),this.expired=!1,this.expireTime=null,this.refreshCallbacks=[],1===arguments.length&&"object"==typeof e){var r=e.credentials||e;this.accessKeyId=r.accessKeyId,this.secretAccessKey=r.secretAccessKey,this.sessionToken=r.sessionToken}else this.accessKeyId=e,this.secretAccessKey=t,this.sessionToken=n},expiryWindow:15,needsRefresh:function(){var e=o.util.date.getDate().getTime(),t=new Date(e+1e3*this.expiryWindow);return!!(this.expireTime&&t>this.expireTime)||(this.expired||!this.accessKeyId||!this.secretAccessKey)},get:function(t){var n=this;this.needsRefresh()?this.refresh(function(e){e||(n.expired=!1),t&&t(e)}):t&&t()},refresh:function(e){this.expired=!1,e()},coalesceRefresh:function(e,n){var r=this;1===r.refreshCallbacks.push(e)&&r.load(function(t){o.util.arrayEach(r.refreshCallbacks,function(e){n?e(t):o.util.defer(function(){e(t)})}),r.refreshCallbacks.length=0})},load:function(e){e()}}),o.Credentials.addPromisesToClass=function(e){this.prototype.getPromise=o.util.promisifyMethod("get",e),this.prototype.refreshPromise=o.util.promisifyMethod("refresh",e)},o.Credentials.deletePromisesFromClass=function(){delete this.prototype.getPromise,delete this.prototype.refreshPromise},o.util.addPromises(o.Credentials)},{"./core":18}],20:[function(e,t,n){var i=e("../core"),r=e("../../clients/sts");i.ChainableTemporaryCredentials=i.util.inherit(i.Credentials,{constructor:function(e){i.Credentials.call(this),e=e||{},this.errorCode="ChainableTemporaryCredentialsProviderFailure",this.expired=!0,this.tokenCodeFn=null;var t=i.util.copy(e.params)||{};if(t.RoleArn&&(t.RoleSessionName=t.RoleSessionName||"temporary-credentials"),t.SerialNumber){if(!e.tokenCodeFn||"function"!=typeof e.tokenCodeFn)throw new i.util.error(new Error("tokenCodeFn must be a function when params.SerialNumber is given"),{code:this.errorCode});this.tokenCodeFn=e.tokenCodeFn}var n=i.util.merge({params:t,credentials:e.masterCredentials||i.config.credentials},e.stsConfig||{});this.service=new r(n)},refresh:function(e){this.coalesceRefresh(e||i.util.fn.callback)},load:function(r){var o=this,i=o.service.config.params.RoleArn?"assumeRole":"getSessionToken";this.getTokenCode(function(e,t){var n={};e?r(e):(t&&(n.TokenCode=t),o.service[i](n,function(e,t){e||o.service.credentialsFrom(t,o),r(e)}))})},getTokenCode:function(r){var o=this;this.tokenCodeFn?this.tokenCodeFn(this.service.config.params.SerialNumber,function(e,t){if(e){var n=e;return e instanceof Error&&(n=e.message),void r(i.util.error(new Error("Error fetching MFA token: "+n),{code:o.errorCode}))}r(null,t)}):r(null)}})},{"../../clients/sts":8,"../core":18}],21:[function(e,t,n){var r=e("../core"),o=e("../../clients/cognitoidentity"),i=e("../../clients/sts");r.CognitoIdentityCredentials=r.util.inherit(r.Credentials,{localStorageKey:{id:"aws.cognito.identity-id.",providers:"aws.cognito.identity-providers."},constructor:function(e,t){r.Credentials.call(this),this.expired=!0,this.params=e,this.data=null,this._identityId=null,this._clientConfig=r.util.copy(t||{}),this.loadCachedId();var n=this;Object.defineProperty(this,"identityId",{get:function(){return n.loadCachedId(),n._identityId||n.params.IdentityId},set:function(e){n._identityId=e}})},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(t){var n=this;n.createClients(),n.data=null,n._identityId=null,n.getId(function(e){e?(n.clearIdOnNotAuthorized(e),t(e)):n.params.RoleArn?n.getCredentialsFromSTS(t):n.getCredentialsForIdentity(t)})},clearCachedId:function(){this._identityId=null,delete this.params.IdentityId;var e=this.params.IdentityPoolId,t=this.params.LoginId||"";delete this.storage[this.localStorageKey.id+e+t],delete this.storage[this.localStorageKey.providers+e+t]},clearIdOnNotAuthorized:function(e){"NotAuthorizedException"==e.code&&this.clearCachedId()},getId:function(n){var r=this;if("string"==typeof r.params.IdentityId)return n(null,r.params.IdentityId);r.cognito.getId(function(e,t){!e&&t.IdentityId?(r.params.IdentityId=t.IdentityId,n(null,t.IdentityId)):n(e)})},loadCredentials:function(e,t){e&&t&&(t.expired=!1,t.accessKeyId=e.Credentials.AccessKeyId,t.secretAccessKey=e.Credentials.SecretKey,t.sessionToken=e.Credentials.SessionToken,t.expireTime=e.Credentials.Expiration)},getCredentialsForIdentity:function(n){var r=this;r.cognito.getCredentialsForIdentity(function(e,t){e?r.clearIdOnNotAuthorized(e):(r.cacheId(t),r.data=t,r.loadCredentials(r.data,r)),n(e)})},getCredentialsFromSTS:function(n){var r=this;r.cognito.getOpenIdToken(function(e,t){e?(r.clearIdOnNotAuthorized(e),n(e)):(r.cacheId(t),r.params.WebIdentityToken=t.Token,r.webIdentityCredentials.refresh(function(e){e||(r.data=r.webIdentityCredentials.data,r.sts.credentialsFrom(r.data,r)),n(e)}))})},loadCachedId:function(){var e=this;if(r.util.isBrowser()&&!e.params.IdentityId){var t=e.getStorage("id");if(t&&e.params.Logins){var n=Object.keys(e.params.Logins);0!==(e.getStorage("providers")||"").split(",").filter(function(e){return-1!==n.indexOf(e)}).length&&(e.params.IdentityId=t)}else t&&(e.params.IdentityId=t)}},createClients:function(){var e=this._clientConfig;if(this.webIdentityCredentials=this.webIdentityCredentials||new r.WebIdentityCredentials(this.params,e),!this.cognito){var t=r.util.merge({},e);t.params=this.params,this.cognito=new o(t)}this.sts=this.sts||new i(e)},cacheId:function(e){this._identityId=e.IdentityId,this.params.IdentityId=this._identityId,r.util.isBrowser()&&(this.setStorage("id",e.IdentityId),this.params.Logins&&this.setStorage("providers",Object.keys(this.params.Logins).join(",")))},getStorage:function(e){return this.storage[this.localStorageKey[e]+this.params.IdentityPoolId+(this.params.LoginId||"")]},setStorage:function(e,t){try{this.storage[this.localStorageKey[e]+this.params.IdentityPoolId+(this.params.LoginId||"")]=t}catch(e){}},storage:function(){try{var e=r.util.isBrowser()&&null!==window.localStorage&&"object"==typeof window.localStorage?window.localStorage:{};return e["aws.test-storage"]="foobar",delete e["aws.test-storage"],e}catch(e){return{}}}()})},{"../../clients/cognitoidentity":7,"../../clients/sts":8,"../core":18}],22:[function(e,t,n){var a=e("../core");a.CredentialProviderChain=a.util.inherit(a.Credentials,{constructor:function(e){this.providers=e||a.CredentialProviderChain.defaultProviders.slice(0),this.resolveCallbacks=[]},resolve:function(e){var o=this;if(0===o.providers.length)return e(new Error("No providers")),o;if(1===o.resolveCallbacks.push(e)){var i=0,s=o.providers.slice(0);!function t(n,r){if(!n&&r||i===s.length)return a.util.arrayEach(o.resolveCallbacks,function(e){e(n,r)}),void(o.resolveCallbacks.length=0);var e=s[i++];(r="function"==typeof e?e.call():e).get?r.get(function(e){t(e,e?null:r)}):t(null,r)}()}return o}}),a.CredentialProviderChain.defaultProviders=[],a.CredentialProviderChain.addPromisesToClass=function(e){this.prototype.resolvePromise=a.util.promisifyMethod("resolve",e)},a.CredentialProviderChain.deletePromisesFromClass=function(){delete this.prototype.resolvePromise},a.util.addPromises(a.CredentialProviderChain)},{"../core":18}],23:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.SAMLCredentials=r.util.inherit(r.Credentials,{constructor:function(e){r.Credentials.call(this),this.expired=!0,this.params=e},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.service.assumeRoleWithSAML(function(e,t){e||r.service.credentialsFrom(t,r),n(e)})},createClients:function(){this.service=this.service||new o({params:this.params})}})},{"../../clients/sts":8,"../core":18}],24:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.TemporaryCredentials=r.util.inherit(r.Credentials,{constructor:function(e,t){r.Credentials.call(this),this.loadMasterCredentials(t),this.expired=!0,this.params=e||{},this.params.RoleArn&&(this.params.RoleSessionName=this.params.RoleSessionName||"temporary-credentials")},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.masterCredentials.get(function(){r.service.config.credentials=r.masterCredentials,(r.params.RoleArn?r.service.assumeRole:r.service.getSessionToken).call(r.service,function(e,t){e||r.service.credentialsFrom(t,r),n(e)})})},loadMasterCredentials:function(e){for(this.masterCredentials=e||r.config.credentials;this.masterCredentials.masterCredentials;)this.masterCredentials=this.masterCredentials.masterCredentials;"function"!=typeof this.masterCredentials.get&&(this.masterCredentials=new r.Credentials(this.masterCredentials))},createClients:function(){this.service=this.service||new o({params:this.params})}})},{"../../clients/sts":8,"../core":18}],25:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.WebIdentityCredentials=r.util.inherit(r.Credentials,{constructor:function(e,t){r.Credentials.call(this),this.expired=!0,this.params=e,this.params.RoleSessionName=this.params.RoleSessionName||"web-identity",this.data=null,this._clientConfig=r.util.copy(t||{})},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.service.assumeRoleWithWebIdentity(function(e,t){r.data=null,e||(r.data=t,r.service.credentialsFrom(t,r)),n(e)})},createClients:function(){if(!this.service){var e=r.util.merge({},this._clientConfig);e.params=this.params,this.service=new o(e)}}})},{"../../clients/sts":8,"../core":18}],26:[function(e,t,n){(function(i){var p=e("./core"),h=e("./util"),s=["AWS_ENABLE_ENDPOINT_DISCOVERY","AWS_ENDPOINT_DISCOVERY_ENABLED"];function f(e){var t=e.service,n=t.api||{},r={};return t.config.region&&(r.region=t.config.region),n.serviceId&&(r.serviceId=n.serviceId),t.config.credentials.accessKeyId&&(r.accessKeyId=t.config.credentials.accessKeyId),r}function d(e,t){var n={};return function r(o,i,s){s&&null!=i&&"structure"===s.type&&s.required&&0=this.HEADERS_RECEIVED&&!u&&(s.statusCode=c.status,s.headers=o.parseHeaders(c.getAllResponseHeaders()),s.emit("headers",s.statusCode,s.headers,c.statusText),u=!0),this.readyState===this.DONE&&o.finishRequest(c,s)},!1),c.upload.addEventListener("progress",function(e){s.emit("sendProgress",e)}),c.addEventListener("progress",function(e){s.emit("receiveProgress",e)},!1),c.addEventListener("timeout",function(){r(l.util.error(new Error("Timeout"),{code:"TimeoutError"}))},!1),c.addEventListener("error",function(){r(l.util.error(new Error("Network Failure"),{code:"NetworkingError"}))},!1),c.addEventListener("abort",function(){r(l.util.error(new Error("Request aborted"),{code:"RequestAbortedError"}))},!1),n(s),c.open(t.method,a,!1!==e.xhrAsync),l.util.each(t.headers,function(e,t){"Content-Length"!==e&&"User-Agent"!==e&&"Host"!==e&&c.setRequestHeader(e,t)}),e.timeout&&!1!==e.xhrAsync&&(c.timeout=e.timeout),e.xhrWithCredentials&&(c.withCredentials=!0);try{c.responseType="arraybuffer"}catch(e){}try{t.body?c.send(t.body):c.send()}catch(e){if(!t.body||"object"!=typeof t.body.buffer)throw e;c.send(t.body.buffer)}return s},parseHeaders:function(e){var r={};return l.util.arrayEach(e.split(/\r?\n/),function(e){var t=e.split(":",1)[0],n=e.substring(t.length+2);0= 1, but found "'+t+'" for '+n)},validatePattern:function(e,t,n){this.validation.pattern&&void 0!==e.pattern&&(new RegExp(e.pattern).test(t)||this.fail("PatternMatchError",'Provided value "'+t+'" does not match regex pattern /'+e.pattern+"/ for "+n))},validateRange:function(e,t,n,r){this.validation.min&&void 0!==e.min&&t= "+e.min+", but found "+t+" for "+n),this.validation.max&&void 0!==e.max&&t>e.max&&this.fail("MaxRangeError","Expected "+r+" <= "+e.max+", but found "+t+" for "+n)},validateEnum:function(e,t,n){this.validation.enum&&void 0!==e.enum&&-1===e.enum.indexOf(t)&&this.fail("EnumError","Found string value of "+t+", but expected "+e.enum.join("|")+" for "+n)},validateType:function(e,t,n,r){if(null==e)return!1;for(var o=!1,i=0;i=n.maxRetries&&(e.MaxRetriesExceeded=1),u.emit("apiCall",[e])}})},setupRequestListeners:function(){},getSignerClass:function(e){var t,n=null,r="";e&&(r=(n=(e.service.api.operations||{})[e.operation]||null)?n.authtype:"");return t=this.config.signatureVersion?this.config.signatureVersion:"v4"===r||"v4-unsigned-body"===r?"v4":this.api.signatureVersion,l.Signers.RequestSigner.getVersion(t)},serviceInterface:function(){switch(this.api.protocol){case"ec2":case"query":return l.EventListeners.Query;case"json":return l.EventListeners.Json;case"rest-json":return l.EventListeners.RestJson;case"rest-xml":return l.EventListeners.RestXml}if(this.api.protocol)throw new Error("Invalid service `protocol' "+this.api.protocol+" in API config")},successfulResponse:function(e){return e.httpResponse.statusCode<300},numRetries:function(){return void 0!==this.config.maxRetries?this.config.maxRetries:this.defaultRetryCount},retryDelays:function(e){return l.util.calculateRetryDelay(e,this.config.retryDelayOptions)},retryableError:function(e){return!!this.timeoutError(e)||(!!this.networkingError(e)||(!!this.expiredCredentialsError(e)||(!!this.throttledError(e)||500<=e.statusCode)))},networkingError:function(e){return"NetworkingError"===e.code},timeoutError:function(e){return"TimeoutError"===e.code},expiredCredentialsError:function(e){return"ExpiredTokenException"===e.code},clockSkewError:function(e){switch(e.code){case"RequestTimeTooSkewed":case"RequestExpired":case"InvalidSignatureException":case"SignatureDoesNotMatch":case"AuthFailure":case"RequestInTheFuture":return!0;default:return!1}},getSkewCorrectedDate:function(){return new Date(Date.now()+this.config.systemClockOffset)},applyClockOffset:function(e){e&&(this.config.systemClockOffset=e-Date.now())},isClockSkewed:function(e){if(e)return 3e4<=Math.abs(this.getSkewCorrectedDate().getTime()-e)},throttledError:function(e){if(429===e.statusCode)return!0;switch(e.code){case"ProvisionedThroughputExceededException":case"Throttling":case"ThrottlingException":case"RequestLimitExceeded":case"RequestThrottled":case"RequestThrottledException":case"TooManyRequestsException":case"TransactionInProgressException":return!0;default:return!1}},endpointFromTemplate:function(e){if("string"!=typeof e)return e;var t=e;return t=(t=(t=t.replace(/\{service\}/g,this.api.endpointPrefix)).replace(/\{region\}/g,this.config.region)).replace(/\{scheme\}/g,this.config.sslEnabled?"https":"http")},setEndpoint:function(e){this.endpoint=new l.Endpoint(e,this.config)},paginationConfig:function(e,t){var n=this.api.operations[e].paginator;if(n)return n;if(t){var r=new Error;throw l.util.error(r,"No pagination configuration for "+e)}return null}}),l.util.update(l.Service,{defineMethods:function(e){l.util.each(e.prototype.api.operations,function(n){e.prototype[n]||("none"===e.prototype.api.operations[n].authtype?e.prototype[n]=function(e,t){return this.makeUnauthenticatedRequest(n,e,t)}:e.prototype[n]=function(e,t){return this.makeRequest(n,e,t)})})},defineService:function(e,t,n){l.Service._serviceMap[e]=!0,Array.isArray(t)||(n=t,t=[]);var r=a(l.Service,n||{});if("string"==typeof e){l.Service.addVersions(r,t);var o=r.serviceIdentifier||e;r.serviceIdentifier=o}else r.prototype.api=e,l.Service.defineMethods(r);if(l.SequentialExecutor.call(this.prototype),!this.prototype.publisher&&l.util.clientSideMonitoring){var i=l.util.clientSideMonitoring.Publisher,s=(0,l.util.clientSideMonitoring.configProvider)();this.prototype.publisher=new i(s),s.enabled&&(l.Service._clientSideMonitoring=!0)}return l.SequentialExecutor.call(r.prototype),l.Service.addDefaultMonitoringListeners(r.prototype),r},addVersions:function(e,t){Array.isArray(t)||(t=[t]),e.services=e.services||{};for(var n=0;n=n.length)return r.push(null);var t=o+e;t>n.length&&(t=n.length),r.push(n.slice(o,t)),o=t},r},concat:function(e){var t,n,r=0,o=0;for(n=0;n>>8^t[255&(n^e.readUInt8(r))]}return(-1^n)>>>0},hmac:function(e,t,n,r){return"buffer"===(n=n||"binary")&&(n=void 0),r=r||"sha256","string"==typeof t&&(t=l.buffer.toBuffer(t)),l.crypto.lib.createHmac(r,e).update(t).digest(n)},md5:function(e,t,n){return l.crypto.hash("md5",e,t,n)},sha256:function(e,t,n){return l.crypto.hash("sha256",e,t,n)},hash:function(e,t,n,r){var o=l.crypto.createHash(e);"buffer"===(n=n||"binary")&&(n=void 0),"string"==typeof t&&(t=l.buffer.toBuffer(t));var i=l.arraySliceFn(t),s=l.Buffer.isBuffer(t);if(l.isBrowser()&&"undefined"!=typeof ArrayBuffer&&t&&t.buffer instanceof ArrayBuffer&&(s=!0),r&&"object"==typeof t&&"function"==typeof t.on&&!s)t.on("data",function(e){o.update(e)}),t.on("error",function(e){r(e)}),t.on("end",function(){r(null,o.digest(n))});else{if(!r||!i||s||"undefined"==typeof FileReader){l.isBrowser()&&"object"==typeof t&&!s&&(t=new l.Buffer(new Uint8Array(t)));var a=o.update(t).digest(n);return r&&r(null,a),a}var c=0,u=new FileReader;u.onerror=function(){r(new Error("Failed to read data."))},u.onload=function(){var e=new l.Buffer(new Uint8Array(u.result));o.update(e),c+=e.length,u._continueReading()},u._continueReading=function(){if(c>=t.size)r(null,o.digest(n));else{var e=c+524288;e>t.size&&(e=t.size),u.readAsArrayBuffer(i.call(t,c,e))}},u._continueReading()}},toHex:function(e){for(var t=[],n=0;n/g,">").replace(/"/g,""")}}},{}],75:[function(e,t,n){t.exports={escapeElement:function(e){return e.replace(/&/g,"&").replace(//g,">")}}},{}],76:[function(e,t,n){var a=e("./escape-attribute").escapeAttribute;function r(e,t){void 0===t&&(t=[]),this.name=e,this.children=t,this.attributes={}}r.prototype.addAttribute=function(e,t){return this.attributes[e]=t,this},r.prototype.addChildNode=function(e){return this.children.push(e),this},r.prototype.removeAttribute=function(e){return delete this.attributes[e],this},r.prototype.toString=function(){for(var e=Boolean(this.children.length),t="<"+this.name,n=this.attributes,r=0,o=Object.keys(n);r"+this.children.map(function(e){return e.toString()}).join("")+"":"/>")},t.exports={XmlNode:r}},{"./escape-attribute":74}],77:[function(e,t,n){var r=e("./escape-element").escapeElement;function o(e){this.value=e}o.prototype.toString=function(){return r(""+this.value)},t.exports={XmlText:o}},{"./escape-element":75}],78:[function(e,t,n){"use strict";n.byteLength=function(e){var t=p(e),n=t[0],r=t[1];return 3*(n+r)/4-r},n.toByteArray=function(e){var t,n,r=p(e),o=r[0],i=r[1],s=new l(function(e,t){return 3*(e+t)/4-t}(o,i)),a=0,c=0>16&255,s[a++]=t>>8&255,s[a++]=255&t;2===i&&(t=u[e.charCodeAt(n)]<<2|u[e.charCodeAt(n+1)]>>4,s[a++]=255&t);1===i&&(t=u[e.charCodeAt(n)]<<10|u[e.charCodeAt(n+1)]<<4|u[e.charCodeAt(n+2)]>>2,s[a++]=t>>8&255,s[a++]=255&t);return s},n.fromByteArray=function(e){for(var t,n=e.length,r=n%3,o=[],i=0,s=n-r;i>2]+a[t<<4&63]+"==")):2==r&&(t=(e[n-2]<<8)+e[n-1],o.push(a[t>>10]+a[t>>4&63]+a[t<<2&63]+"="));return o.join("")};for(var a=[],u=[],l="undefined"!=typeof Uint8Array?Uint8Array:Array,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,i=r.length;o>18&63]+a[o>>12&63]+a[o>>6&63]+a[63&o]);return i.join("")}u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63},{}],79:[function(e,t,n){},{}],80:[function(t,e,F){(function(e,p){"use strict";var r=t("base64-js"),i=t("ieee754"),s=t("isarray");function n(){return p.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(n()=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function f(e,t){if(p.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return D(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(e).length;default:if(r)return D(e).length;t=(""+t).toLowerCase(),r=!0}}function d(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=p.from(t,r)),p.isBuffer(t))return 0===t.length?-1:m(e,t,n,r,o);if("number"==typeof t)return t&=255,p.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):m(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function m(e,t,n,r,o){var i,s=1,a=e.length,c=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a/=s=2,c/=2,n/=2}function u(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(o){var l=-1;for(i=n;i>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function E(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function S(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rthis.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return _(this,t,n);case"utf8":case"utf-8":return S(this,t,n);case"ascii":return T(this,t,n);case"latin1":case"binary":return w(this,t,n);case"base64":return E(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}.apply(this,arguments)},p.prototype.equals=function(e){if(!p.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===p.compare(this,e)},p.prototype.inspect=function(){var e="",t=F.INSPECT_MAX_BYTES;return 0t&&(e+=" ... ")),""},p.prototype.compare=function(e,t,n,r,o){if(!p.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(o<=r&&n<=t)return 0;if(o<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),a=Math.min(i,s),c=this.slice(r,o),u=e.slice(t,n),l=0;lthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var i,s,a,c,u,l,p=!1;;)switch(r){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return u=t,l=n,q(D(e,(c=this).length-u),c,u,l);case"ascii":return v(this,e,t,n);case"latin1":case"binary":return v(this,e,t,n);case"base64":return i=this,s=t,a=n,q(U(e),i,s,a);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return b(this,e,t,n);default:if(p)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),p=!0}},p.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function T(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;oe.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function k(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function x(e,t,n,r){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function O(e,t,n,r,o){return o||x(e,0,n,4),i.write(e,t,n,r,23,4),n+4}function L(e,t,n,r,o){return o||x(e,0,n,8),i.write(e,t,n,r,52,8),n+8}p.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):N(this,e,t,!0),t+2},p.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},p.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):k(this,e,t,!0),t+4},p.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):k(this,e,t,!1),t+4},p.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var i=0,s=1,a=0;for(this[t]=255&e;++i>0)-a&255;return t+n},p.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var i=n-1,s=1,a=0;for(this[t+i]=255&e;0<=--i&&(s*=256);)e<0&&0===a&&0!==this[t+i+1]&&(a=1),this[t+i]=(e/s>>0)-a&255;return t+n},p.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),p.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},p.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},p.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},p.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):k(this,e,t,!0),t+4},p.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):k(this,e,t,!1),t+4},p.prototype.writeFloatLE=function(e,t,n){return O(this,e,t,!0,n)},p.prototype.writeFloatBE=function(e,t,n){return O(this,e,t,!1,n)},p.prototype.writeDoubleLE=function(e,t,n){return L(this,e,t,!0,n)},p.prototype.writeDoubleBE=function(e,t,n){return L(this,e,t,!1,n)},p.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(i=t;i>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function U(e){return r.toByteArray(function(e){var t;if((e=((t=e).trim?t.trim():t.replace(/^\s+|\s+$/g,"")).replace(P,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t("buffer").Buffer)},{"base64-js":78,buffer:80,ieee754:82,isarray:85}],81:[function(e,t,n){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function c(e){return"function"==typeof e}function u(e){return"object"==typeof e&&null!==e}function l(e){return void 0===e}((t.exports=r).EventEmitter=r).prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,o,i,s;if(this._events||(this._events={}),"error"===e&&(!this._events.error||u(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var a=new Error('Uncaught, unspecified "error" event. ('+t+")");throw a.context=t,a}if(l(n=this._events[e]))return!1;if(c(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),n.apply(this,o)}else if(u(n))for(o=Array.prototype.slice.call(arguments,1),r=(s=n.slice()).length,i=0;in&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.once=function(e,t){if(!c(t))throw TypeError("listener must be a function");var n=!1;function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,o,i;if(!c(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(o=(n=this._events[e]).length,r=-1,n===t||c(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(u(n)){for(i=o;0>1,l=-7,p=n?o-1:0,h=n?-1:1,f=e[t+p];for(p+=h,i=f&(1<<-l)-1,f>>=-l,l+=a;0>=-l,l+=r;0>1,h=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,f=r?0:i-1,d=r?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),2<=(t+=1<=s+p?h/c:h*Math.pow(2,1-p))*c&&(s++,c/=2),l<=s+p?(a=0,s=l):1<=s+p?(a=(t*c-1)*Math.pow(2,o),s+=p):(a=t*Math.pow(2,p-1)*Math.pow(2,o),s=0));8<=o;e[n+f]=255&a,f+=d,a/=256,o-=8);for(s=s<":!0,"=":!0,"!":!0},F={" ":!0,"\t":!0,"\n":!0};function j(e){return"0"<=e&&e<="9"||"-"===e}function r(){}r.prototype={tokenize:function(e){var t,n,r,o,i=[];for(this._current=0;this._current"===n?"="===e[this._current]?(this._current++,{type:P,value:">=",start:t}):{type:"GT",value:">",start:t}:"="===n&&"="===e[this._current]?(this._current++,{type:"EQ",value:"==",start:t}):void 0},_consumeLiteral:function(e){this._current++;for(var t,n=this._current,r=e.length;"`"!==e[this._current]&&this._current= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=v-b,w=Math.floor,_=String.fromCharCode;function A(e){throw new RangeError(p[e])}function f(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function d(e,t){var n=e.split("@"),r="";return 1>>10&1023|55296),e=56320|1023&e),t+=_(e)}).join("")}function N(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function k(e,t,n){var r=0;for(e=n?w(e/a):e>>1,e+=w(e/t);h*E>>1w((y-d)/s))&&A("overflow"),d+=c*s,!(c<(u=a<=m?b:m+E<=a?E:a-m));a+=v)s>w(y/(l=v-u))&&A("overflow"),s*=l;m=k(d-i,t=h.length+1,0==i),w(d/t)>y-g&&A("overflow"),g+=w(d/t),d%=t,h.splice(d++,0,g)}return R(h)}function m(e){var t,n,r,o,i,s,a,c,u,l,p,h,f,d,g,m=[];for(h=(e=I(e)).length,t=C,i=S,s=n=0;sw((y-n)/(f=r+1))&&A("overflow"),n+=(a-t)*f,t=a,s=0;sy&&A("overflow"),p==t){for(c=n,u=v;!(c<(l=u<=i?b:i+E<=u?E:u-i));u+=v)g=c-l,d=v-l,m.push(_(N(l+g%d,0))),c=w(g/d);m.push(_(N(c,0))),i=k(n,f,r==o),n=0,++r}++n,++t}return m.join("")}if(o={version:"1.4.1",ucs2:{decode:I,encode:R},decode:g,encode:m,toASCII:function(e){return d(e,function(e){return u.test(e)?"xn--"+m(e):e})},toUnicode:function(e){return d(e,function(e){return c.test(e)?g(e.slice(4).toLowerCase()):e})}},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return o});else if(t&&n)if(O.exports==t)n.exports=o;else for(i in o)o.hasOwnProperty(i)&&(t[i]=o[i]);else e.punycode=o}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],89:[function(e,t,n){"use strict";t.exports=function(e,t,n,r){t=t||"&",n=n||"=";var o={};if("string"!=typeof e||0===e.length)return o;var i=/\+/g;e=e.split(t);var s=1e3;r&&"number"==typeof r.maxKeys&&(s=r.maxKeys);var a,c,u=e.length;0",'"',"`"," ","\r","\n","\t"]),L=["'"].concat(o),P=["%","/","?",";","#"].concat(L),M=["/","?","#"],D=/^[a-z0-9A-Z_-]{0,63}$/,U=/^([a-z0-9A-Z_-]{0,63})(.*)$/,q={javascript:!0,"javascript:":!0},F={javascript:!0,"javascript:":!0},j={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},B=e("querystring");function i(e,t,n){if(e&&a(e)&&e instanceof v)return e;var r=new v;return r.parse(e,t,n),r}function H(e){return"string"==typeof e}function a(e){return"object"==typeof e&&null!==e}function b(e){return null===e}v.prototype.parse=function(e,t,n){if(!H(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var r=e;r=r.trim();var o=O.exec(r);if(o){var i=(o=o[0]).toLowerCase();this.protocol=i,r=r.substr(o.length)}if(n||o||r.match(/^\/\/[^@\/]+@[^@\/]+/)){var s="//"===r.substr(0,2);!s||o&&F[o]||(r=r.substr(2),this.slashes=!0)}if(!F[o]&&(s||o&&!j[o])){for(var a,c,u=-1,l=0;l>>((3&t)<<3)&255;return i}}},{}],103:[function(e,t,n){var d,g,m=e("./lib/rng"),y=e("./lib/bytesToUuid"),v=0,b=0;t.exports=function(e,t,n){var r=t&&n||0,o=t||[],i=(e=e||{}).node||d,s=void 0!==e.clockseq?e.clockseq:g;if(null==i||null==s){var a=m();null==i&&(i=d=[1|a[0],a[1],a[2],a[3],a[4],a[5]]),null==s&&(s=g=16383&(a[6]<<8|a[7]))}var c=void 0!==e.msecs?e.msecs:(new Date).getTime(),u=void 0!==e.nsecs?e.nsecs:b+1,l=c-v+(u-b)/1e4;if(l<0&&void 0===e.clockseq&&(s=s+1&16383),(l<0||v>>24&255,o[r++]=p>>>16&255,o[r++]=p>>>8&255,o[r++]=255&p;var h=c/4294967296*1e4&268435455;o[r++]=h>>>8&255,o[r++]=255&h,o[r++]=h>>>24&15|16,o[r++]=h>>>16&255,o[r++]=s>>>8|128,o[r++]=255&s;for(var f=0;f<6;++f)o[r+f]=i[f];return t||y(o)}},{"./lib/bytesToUuid":101,"./lib/rng":102}],104:[function(e,t,n){var s=e("./lib/rng"),a=e("./lib/bytesToUuid");t.exports=function(e,t,n){var r=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var o=(e=e||{}).random||(e.rng||s)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t)for(var i=0;i<16;++i)t[r+i]=o[i];return t||a(o)}},{"./lib/bytesToUuid":101,"./lib/rng":102}],105:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e("./utils/LRU"),o=(Object.defineProperty(i.prototype,"size",{get:function(){return this.cache.length},enumerable:!0,configurable:!0}),i.prototype.put=function(e,t){var n="string"!=typeof e?i.getKeyString(e):e,r=this.populateValue(t);this.cache.put(n,r)},i.prototype.get=function(e){var t="string"!=typeof e?i.getKeyString(e):e,n=Date.now(),r=this.cache.get(t);if(r)for(var o=0;o>>=0;break;case"x":n=n.toString(16);break;case"X":n=n.toString(16).toUpperCase()}n=/[def]/.test(i[8])&&i[3]&&0<=n?"+"+n:n,a=i[4]?"0"==i[4]?"0":i[4].charAt(1):" ",c=i[6]-String(n).length,s=i[6]?g(a,c):"",h.push(i[5]?n+s:s+n)}return h.join("")},f.cache={},f.parse=function(e){for(var t=e,n=[],r=[],o=0;t;){if(null!==(n=/^[^\x25]+/.exec(t)))r.push(n[0]);else if(null!==(n=/^\x25{2}/.exec(t)))r.push("%");else{if(null===(n=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t)))throw"[sprintf] huh?";if(n[2]){o|=1;var i=[],s=n[2],a=[];if(null===(a=/^([a-z_][a-z_\d]*)/i.exec(s)))throw"[sprintf] huh?";for(i.push(a[1]);""!==(s=s.substring(a[0].length));)if(null!==(a=/^\.([a-z_][a-z_\d]*)/i.exec(s)))i.push(a[1]);else{if(null===(a=/^\[(\d+)\]/.exec(s)))throw"[sprintf] huh?";i.push(a[1])}n[2]=i}else o|=2;if(3===o)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";r.push(n)}t=t.substring(n[0].length)}return r};function d(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function g(e,t){for(var n=[];0=this._logLevel&&(i[e.level]>=this._echoLevel&&a[e.getLevel()](e.toString()),e.line=this._lineCount++)},u.prototype.clearObjects=function(){for(var e=0;e=connect.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR||e.status===connect.HTTP_STATUS_CODES.TOO_MANY_REQUESTS)?setTimeout(function(){t(--n)},s):o(e)}).catch(function(e){o(e)})}(t)})},connect.backoff=function(r,o,i,s){connect.assertTrue(connect.isFunction(r),"func must be a Function");var a=this;r({success:function(e){s&&s.success&&s.success(e)},failure:function(e,t){if(0>",e)},u.prototype.getSubscriptions=function(e){return this.subMap.getSubscriptions(e)},u.prototype.trigger=function(t,n){connect.assertNotNull(t,"eventName");var r=this,e=this.subMap.getSubscriptions("<>"),o=this.subMap.getSubscriptions(t);this.logEvents&&t!==connect.EventType.LOG&&t!==connect.EventType.MASTER_RESPONSE&&t!==connect.EventType.API_METRIC&&connect.getLog().trace("Publishing event: %s",t),e.concat(o).forEach(function(e){try{e.f(n||null,t,r)}catch(e){connect.getLog().error("'%s' event handler failed.",t).withException(e)}})},u.prototype.bridge=function(){var n=this;return function(e,t){n.trigger(t,e)}},u.prototype.unsubscribeAll=function(){this.subMap.getAllSubscriptions().forEach(function(e){e.unsubscribe()})},connect.EventBus=u,connect.EventFactory=e,connect.EventType=t,connect.AgentEvents=r,connect.ConnnectionEvents=s,connect.ContactEvents=i,connect.WebSocketEvents=o,connect.MasterTopics=n}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect;function r(){}r.prototype.send=function(e){throw new connect.NotImplementedError},r.prototype.onMessage=function(e){throw new connect.NotImplementedError};function o(){r.call(this)}((o.prototype=Object.create(r.prototype)).constructor=o).prototype.onMessage=function(e){},o.prototype.send=function(e){};function e(e,t){r.call(this),this.window=e,this.domain=t||"*"}((e.prototype=Object.create(r.prototype)).constructor=e).prototype.send=function(e){this.window.postMessage(e,this.domain)},e.prototype.onMessage=function(e){this.window.addEventListener("message",e)};function i(e,t,n){r.call(this),this.input=e,this.output=t,this.domain=n||"*"}((i.prototype=Object.create(r.prototype)).constructor=i).prototype.send=function(e){this.output.postMessage(e,this.domain)},i.prototype.onMessage=function(e){this.input.addEventListener("message",e)};function t(e){r.call(this),this.port=e,this.id=connect.randomId()}((t.prototype=Object.create(r.prototype)).constructor=t).prototype.send=function(e){this.port.postMessage(e)},t.prototype.onMessage=function(e){this.port.addEventListener("message",e)},t.prototype.getId=function(){return this.id};function n(e){r.call(this),this.streamMap=e?connect.index(e,function(e){return e.getId()}):{},this.messageListeners=[]}((n.prototype=Object.create(r.prototype)).constructor=n).prototype.send=function(t){this.getStreams().forEach(function(e){try{e.send(t)}catch(e){}})},n.prototype.onMessage=function(t){this.messageListeners.push(t),this.getStreams().forEach(function(e){e.onMessage(t)})},n.prototype.addStream=function(t){this.streamMap[t.getId()]=t,this.messageListeners.forEach(function(e){t.onMessage(e)})},n.prototype.removeStream=function(e){delete this.streamMap[e.getId()]},n.prototype.getStreams=function(e){return connect.values(this.streamMap)},n.prototype.getStreamForPort=function(t){return connect.find(this.getStreams(),function(e){return e.port===t})};function s(e,t,n){this.name=e,this.upstream=t||new o,this.downstream=n||new o,this.downstreamBus=new connect.EventBus,this.upstreamBus=new connect.EventBus,this.upstream.onMessage(connect.hitch(this,this._dispatchEvent,this.upstreamBus)),this.downstream.onMessage(connect.hitch(this,this._dispatchEvent,this.downstreamBus))}s.prototype.onUpstream=function(e,t){return connect.assertNotNull(e,"eventName"),connect.assertNotNull(t,"f"),connect.assertTrue(connect.isFunction(t),"f must be a function"),this.upstreamBus.subscribe(e,t)},s.prototype.onAllUpstream=function(e){return connect.assertNotNull(e,"f"),connect.assertTrue(connect.isFunction(e),"f must be a function"),this.upstreamBus.subscribeAll(e)},s.prototype.onDownstream=function(e,t){return connect.assertNotNull(e,"eventName"),connect.assertNotNull(t,"f"),connect.assertTrue(connect.isFunction(t),"f must be a function"),this.downstreamBus.subscribe(e,t)},s.prototype.onAllDownstream=function(e){return connect.assertNotNull(e,"f"),connect.assertTrue(connect.isFunction(e),"f must be a function"),this.downstreamBus.subscribeAll(e)},s.prototype.sendUpstream=function(e,t){connect.assertNotNull(e,"eventName"),this.upstream.send({event:e,data:t})},s.prototype.sendDownstream=function(e,t){connect.assertNotNull(e,"eventName"),this.downstream.send({event:e,data:t})},s.prototype._dispatchEvent=function(e,t){var n=t.data;n.event&&e.trigger(n.event,n.data)},s.prototype.passUpstream=function(){var n=this;return function(e,t){n.upstream.send({event:t,data:e})}},s.prototype.passDownstream=function(){var n=this;return function(e,t){n.downstream.send({event:t,data:e})}},s.prototype.shutdown=function(){this.upstreamBus.unsubscribeAll(),this.downstreamBus.unsubscribeAll()};function a(e,t,n,r){s.call(this,e,new i(t,n.contentWindow,r||"*"),null)}(a.prototype=Object.create(s.prototype)).constructor=a,connect.Stream=r,connect.NullStream=o,connect.WindowStream=e,connect.WindowIOStream=i,connect.PortStream=t,connect.StreamMultiplexer=n,connect.Conduit=s,connect.IFrameConduit=a}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect,connect.ClientMethods=connect.makeEnum(["getAgentSnapshot","putAgentState","getAgentStates","getDialableCountryCodes","getRoutingProfileQueues","getAgentPermissions","getAgentConfiguration","updateAgentConfiguration","acceptContact","createOutboundContact","completeContact","destroyContact","notifyContactIssue","updateContactAttributes","createAdditionalConnection","destroyConnection","holdConnection","resumeConnection","toggleActiveConnections","conferenceConnections","sendClientLogs","sendDigits","sendSoftphoneCallReport","sendSoftphoneCallMetrics","getEndpoints","getNewAuthToken","createTransport"]),connect.MasterMethods=connect.makeEnum(["becomeMaster","checkMaster"]);function i(){}i.EMPTY_CALLBACKS={success:function(){},failure:function(){}},i.prototype.call=function(e,t,n){connect.assertNotNull(e,"method");var r=t||{},o=n||i.EMPTY_CALLBACKS;this._callImpl(e,r,o)},i.prototype._callImpl=function(e,t,n){throw new connect.NotImplementedError};function e(){i.call(this)}((e.prototype=Object.create(i.prototype)).constructor=e).prototype._callImpl=function(e,t,n){if(n&&n.failure){var r=connect.sprintf("No such method exists on NULL client: %s",e);n.failure(new connect.ValueError(r),{message:r})}};function t(e,t,n){i.call(this),this.conduit=e,this.requestEvent=t,this.responseEvent=n,this._requestIdCallbacksMap={},this.conduit.onUpstream(n,connect.hitch(this,this._handleResponse))}((t.prototype=Object.create(i.prototype)).constructor=t).prototype._callImpl=function(e,t,n){var r=connect.EventFactory.createRequest(this.requestEvent,e,t);this._requestIdCallbacksMap[r.requestId]=n,this.conduit.sendUpstream(r.event,r)},t.prototype._getCallbacksForRequest=function(e){var t=this._requestIdCallbacksMap[e]||null;return null!=t&&delete this._requestIdCallbacksMap[e],t},t.prototype._handleResponse=function(e){var t=this._getCallbacksForRequest(e.requestId);null!=t&&(e.err&&t.failure?t.failure(e.err,e.data):t.success&&t.success(e.data))};function n(e){t.call(this,e,connect.EventType.API_REQUEST,connect.EventType.API_RESPONSE)}(n.prototype=Object.create(t.prototype)).constructor=n;function r(e){t.call(this,e,connect.EventType.MASTER_REQUEST,connect.EventType.MASTER_RESPONSE)}(r.prototype=Object.create(t.prototype)).constructor=r;function o(e,t,n){connect.assertNotNull(e,"authToken"),connect.assertNotNull(t,"region"),i.call(this),AWS.config.credentials=new AWS.Credentials({}),AWS.config.region=t,this.authToken=e;var r=n||connect.getBaseUrl()+"/connect/api",o=new AWS.Endpoint(r);this.client=new AWS.Connect({endpoint:o})}((o.prototype=Object.create(i.prototype)).constructor=o).prototype._callImpl=function(r,e,o){var t=this,i=connect.getLog();if(connect.contains(this.client,r))e=this._translateParams(r,e),i.trace("AWSClient: --\x3e Calling operation '%s'",r),this.client[r](e).on("build",function(e){e.httpRequest.headers["X-Amz-Bearer"]=t.authToken}).send(function(e,t){try{if(e){if(e.code===connect.CTIExceptions.UNAUTHORIZED_EXCEPTION)o.authFailure();else if(!o.accessDenied||e.code!==connect.CTIExceptions.ACCESS_DENIED_EXCEPTION&&403!==e.statusCode){var n={};n.type=e.code,n.message=e.message,n.stack=e.stack?e.stack.split("\n"):[],o.failure(n,t)}else o.accessDenied();i.trace("AWSClient: <-- Operation '%s' failed: %s",r,JSON.stringify(e))}else i.trace("AWSClient: <-- Operation '%s' succeeded.",r).withObject(t),o.success(t)}catch(e){connect.getLog().error("Failed to handle AWS API request for method %s",r).withException(e)}});else{var n=connect.sprintf("No such method exists on AWS client: %s",r);o.failure(new connect.ValueError(n),{message:n})}},o.prototype._requiresAuthenticationParam=function(e){return e!==connect.ClientMethods.COMPLETE_CONTACT},o.prototype._translateParams=function(e,t){switch(e){case connect.ClientMethods.UPDATE_AGENT_CONFIGURATION:t.configuration=this._translateAgentConfiguration(t.configuration);break;case connect.ClientMethods.SEND_SOFTPHONE_CALL_METRICS:t.softphoneStreamStatistics=this._translateSoftphoneStreamStatistics(t.softphoneStreamStatistics);break;case connect.ClientMethods.SEND_SOFTPHONE_CALL_REPORT:t.report=this._translateSoftphoneCallReport(t.report)}return this._requiresAuthenticationParam(e)&&(t.authentication={authToken:this.authToken}),t},o.prototype._translateAgentConfiguration=function(e){return{name:e.name,softphoneEnabled:e.softphoneEnabled,softphoneAutoAccept:e.softphoneAutoAccept,extension:e.extension,routingProfile:this._translateRoutingProfile(e.routingProfile),agentPreferences:e.agentPreferences}},o.prototype._translateRoutingProfile=function(e){return{name:e.name,routingProfileARN:e.routingProfileARN,defaultOutboundQueue:this._translateQueue(e.defaultOutboundQueue)}},o.prototype._translateQueue=function(e){return{queueARN:e.queueARN,name:e.name}},o.prototype._translateSoftphoneStreamStatistics=function(e){return e.forEach(function(e){"packetsCount"in e&&(e.packetCount=e.packetsCount,delete e.packetsCount)}),e},o.prototype._translateSoftphoneCallReport=function(e){return"handshakingTimeMillis"in e&&(e.handshakeTimeMillis=e.handshakingTimeMillis,delete e.handshakingTimeMillis),"preTalkingTimeMillis"in e&&(e.preTalkTimeMillis=e.preTalkingTimeMillis,delete e.preTalkingTimeMillis),"handshakingFailure"in e&&(e.handshakeFailure=e.handshakingFailure,delete e.handshakingFailure),"talkingTimeMillis"in e&&(e.talkTimeMillis=e.talkingTimeMillis,delete e.talkingTimeMillis),e.softphoneStreamStatistics=this._translateSoftphoneStreamStatistics(e.softphoneStreamStatistics),e},connect.ClientBase=i,connect.NullClient=e,connect.UpstreamConduitClient=n,connect.UpstreamConduitMasterClient=r,connect.AWSClient=o}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect;function r(e,t){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),this.fromState=e,this.toState=t}r.prototype.getAssociations=function(e){throw connect.NotImplementedError()},r.prototype.getFromState=function(){return this.fromState},r.prototype.getToState=function(){return this.toState};function e(e,t,n){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),connect.assertNotNull(n,"associations"),r.call(this,e,t),this.associations=n}((e.prototype=Object.create(r.prototype)).constructor=e).prototype.getAssociations=function(e){return this.associations};function i(e,t,n){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),connect.assertNotNull(n,"closure"),connect.assertTrue(connect.isFunction(n),"closure must be a function"),r.call(this,e,t),this.closure=n}((i.prototype=Object.create(r.prototype)).constructor=i).prototype.getAssociations=function(e){return this.closure(e,this.getFromState(),this.getToState())};function s(){this.fromMap={}}s.ANY="<>",s.prototype.assoc=function(t,n,r){var o=this;if(!t)throw new Error("fromStateObj is not defined.");if(!n)throw new Error("toStateObj is not defined.");if(!r)throw new Error("assocObj is not defined.");return t instanceof Array?t.forEach(function(e){o.assoc(e,n,r)}):n instanceof Array?n.forEach(function(e){o.assoc(t,e,r)}):"function"==typeof r?this._addAssociation(new i(t,n,r)):r instanceof Array?this._addAssociation(new e(t,n,r)):this._addAssociation(new e(t,n,[r])),this},s.prototype.getAssociations=function(e,t,n){connect.assertNotNull(t,"fromState"),connect.assertNotNull(n,"toState");var r=[],o=this.fromMap[s.ANY]||{},i=this.fromMap[t]||{};return r=(r=r.concat(this._getAssociationsFromMap(o,e,t,n))).concat(this._getAssociationsFromMap(i,e,t,n))},s.prototype._addAssociation=function(e){var t=this.fromMap[e.getFromState()],n=(t=t||(this.fromMap[e.getFromState()]={}))[e.getToState()];(n=n||(t[e.getToState()]=[])).push(e)},s.prototype._getAssociationsFromMap=function(e,n,t,r){return(e[s.ANY]||[]).concat(e[r]||[]).reduce(function(e,t){return e.concat(t.getAssociations(n))},[])},connect.EventGraph=s}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect,connect.AgentStateType=connect.makeEnum(["init","routable","not_routable","offline"]),connect.AgentStatusType=connect.AgentStateType,connect.AgentAvailStates=connect.makeEnum(["Init","Busy","AfterCallWork","CallingCustomer","Dialing","Joining","PendingAvailable","PendingBusy"]),connect.AgentErrorStates=connect.makeEnum(["Error","AgentHungUp","BadAddressAgent","BadAddressCustomer","Default","FailedConnectAgent","FailedConnectCustomer","LineEngagedAgent","LineEngagedCustomer","MissedCallAgent","MissedCallCustomer","MultipleCcpWindows","RealtimeCommunicationError"]),connect.EndpointType=connect.makeEnum(["phone_number","agent","queue"]),connect.AddressType=connect.EndpointType,connect.ConnectionType=connect.makeEnum(["agent","inbound","outbound","monitoring"]),connect.ConnectionStateType=connect.makeEnum(["init","connecting","connected","hold","disconnected"]),connect.ConnectionStatusType=connect.ConnectionStateType,connect.CONNECTION_ACTIVE_STATES=connect.set([connect.ConnectionStateType.CONNECTING,connect.ConnectionStateType.CONNECTED,connect.ConnectionStateType.HOLD]),connect.ContactStateType=connect.makeEnum(["init","incoming","pending","connecting","connected","missed","error","ended"]),connect.ContactStatusType=connect.ContactStateType,connect.CONTACT_ACTIVE_STATES=connect.makeEnum(["incoming","pending","connecting","connected"]),connect.ContactType=connect.makeEnum(["voice","queue_callback","chat"]),connect.ChannelType=connect.makeEnum(["VOICE","CHAT"]),connect.MediaType=connect.makeEnum(["softphone","chat"]),connect.SoftphoneCallType=connect.makeEnum(["audio_video","video_only","audio_only","none"]),connect.SoftphoneErrorTypes=connect.makeEnum(["unsupported_browser","microphone_not_shared","signalling_handshake_failure","signalling_connection_failure","ice_collection_timeout","user_busy_error","webrtc_error","realtime_communication_error","other"]),connect.CTIExceptions=connect.makeEnum(["AccessDeniedException","InvalidStateException","BadEndpointException","InvalidAgentARNException","InvalidConfigurationException","InvalidContactTypeException","PaginationException","RefreshTokenExpiredException","SendDataFailedException","UnauthorizedException"]);function e(){if(!connect.agent.initialized)throw new connect.StateError("The agent is not yet initialized!")}e.prototype._getData=function(){return connect.core.getAgentDataProvider().getAgentData()},e.prototype._createContactAPI=function(e){return new connect.Contact(e.contactId)},e.prototype.onContactPending=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.CONTACT_PENDING,e)},e.prototype.onRefresh=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.REFRESH,e)},e.prototype.onRoutable=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ROUTABLE,e)},e.prototype.onNotRoutable=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.NOT_ROUTABLE,e)},e.prototype.onOffline=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.OFFLINE,e)},e.prototype.onError=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ERROR,e)},e.prototype.onSoftphoneError=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.SOFTPHONE_ERROR,e)},e.prototype.onAfterCallWork=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ACW,e)},e.prototype.onStateChange=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.STATE_CHANGE,e)},e.prototype.onMuteToggle=function(e){connect.core.getUpstream().onUpstream(connect.AgentEvents.MUTE_TOGGLE,e)},e.prototype.mute=function(){connect.core.getUpstream().sendUpstream(connect.EventType.BROADCAST,{event:connect.EventType.MUTE,data:{mute:!0}})},e.prototype.unmute=function(){connect.core.getUpstream().sendUpstream(connect.EventType.BROADCAST,{event:connect.EventType.MUTE,data:{mute:!1}})},e.prototype.getStatus=e.prototype.getState=function(){return this._getData().snapshot.state},e.prototype.getStatusDuration=e.prototype.getStateDuration=function(){return connect.now()-this._getData().snapshot.state.startTimestamp.getTime()+connect.core.getSkew()},e.prototype.getPermissions=function(){return this.getConfiguration().permissions},e.prototype.getContacts=function(t){var n=this;return this._getData().snapshot.contacts.map(function(e){return n._createContactAPI(e)}).filter(function(e){return!t||e.getType()===t})},e.prototype.getConfiguration=function(){return this._getData().configuration},e.prototype.getAgentStates=function(){return this.getConfiguration().agentStates},e.prototype.getRoutingProfile=function(){return this.getConfiguration().routingProfile},e.prototype.getChannelConcurrency=function(e){var t=this.getRoutingProfile().channelConcurrencyMap;return t=t||Object.keys(connect.ChannelType).reduce(function(e,t){return e[connect.ChannelType[t]]=1,e},{}),e?t[e]||0:t},e.prototype.getName=function(){return this.getConfiguration().name},e.prototype.getExtension=function(){return this.getConfiguration().extension},e.prototype.getDialableCountries=function(){return this.getConfiguration().dialableCountries},e.prototype.isSoftphoneEnabled=function(){return this.getConfiguration().softphoneEnabled},e.prototype.setConfiguration=function(e,t){connect.core.getClient().call(connect.ClientMethods.UPDATE_AGENT_CONFIGURATION,{configuration:connect.assertNotNull(e,"configuration")},{success:function(e){connect.core.getUpstream().sendUpstream(connect.EventType.RELOAD_AGENT_CONFIGURATION),t.success&&t.success(e)},failure:t.failure})},e.prototype.setStatus=e.prototype.setState=function(e,t){connect.core.getClient().call(connect.ClientMethods.PUT_AGENT_STATE,{state:connect.assertNotNull(e,"state")},t)},e.prototype.connect=function(e,t){var n=connect.core.getClient(),r=new connect.Endpoint(e);delete r.endpointId,n.call(connect.ClientMethods.CREATE_OUTBOUND_CONTACT,{endpoint:connect.assertNotNull(r,"endpoint"),queueARN:t.queueARN||t.queueId||this.getRoutingProfile().defaultOutboundQueue.queueARN},{success:t.success,failure:t.failure})},e.prototype.getAllQueueARNs=function(){return this.getConfiguration().routingProfile.queues.map(function(e){return e.queueARN})},e.prototype.getAddresses=e.prototype.getEndpoints=function(n,r,e){var o=this,t=connect.core.getClient(),i=e||{endpoints:[]};i.maxResults=i.maxResults||connect.DEFAULT_BATCH_SIZE,connect.isArray(n)||(n=[n]),t.call(connect.ClientMethods.GET_ENDPOINTS,{queueARNs:n,nextToken:i.nextToken||null,maxResults:i.maxResults},{success:function(e){if(e.nextToken)o.getEndpoints(n,r,{nextToken:e.nextToken,maxResults:i.maxResults,endpoints:i.endpoints.concat(e.endpoints)});else{i.endpoints=i.endpoints.concat(e.endpoints);var t=i.endpoints.map(function(e){return new connect.Endpoint(e)});r.success({endpoints:t,addresses:t})}},failure:r.failure})},e.prototype.toSnapshot=function(){return new connect.AgentSnapshot(this._getData())};function t(e){connect.Agent.call(this),this.agentData=e}((t.prototype=Object.create(e.prototype)).constructor=t).prototype._getData=function(){return this.agentData},t.prototype._createContactAPI=function(e){return new connect.ContactSnapshot(e)};function n(e){this.contactId=e}n.prototype._getData=function(){return connect.core.getAgentDataProvider().getContactData(this.getContactId())},n.prototype._createConnectionAPI=function(e){return this.getType()===connect.ContactType.CHAT?new connect.ChatConnection(this.contactId,e.connectionId):new connect.VoiceConnection(this.contactId,e.connectionId)},n.prototype.getEventName=function(e){return connect.core.getContactEventName(e,this.getContactId())},n.prototype.onRefresh=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.REFRESH),e)},n.prototype.onIncoming=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.INCOMING),e)},n.prototype.onConnecting=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.CONNECTING),e)},n.prototype.onPending=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.PENDING),e)},n.prototype.onAccepted=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.ACCEPTED),e)},n.prototype.onMissed=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.MISSED),e)},n.prototype.onEnded=function(e){var t=connect.core.getEventBus();t.subscribe(this.getEventName(connect.ContactEvents.ENDED),e),t.subscribe(this.getEventName(connect.ContactEvents.DESTROYED),e)},n.prototype.onDestroy=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.DESTROYED),e)},n.prototype.onACW=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.ACW),e)},n.prototype.onConnected=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.CONNECTED),e)},n.prototype.getContactId=function(){return this.contactId},n.prototype.getInitialContactId=n.prototype.getOriginalContactId=function(){return this._getData().initialContactId},n.prototype.getType=function(){return this._getData().type},n.prototype.getStatus=function(){return this._getData().state},n.prototype.getStatusDuration=function(){return connect.now()-this._getData().state.timestamp.getTime()+connect.core.getSkew()},n.prototype.getQueue=function(){return this._getData().queue},n.prototype.getQueueTimestamp=function(){return this._getData().queueTimestamp},n.prototype.getConnections=function(){var t=this;return this._getData().connections.map(function(e){return t.getType()===connect.ContactType.CHAT?new connect.ChatConnection(t.contactId,e.connectionId):new connect.VoiceConnection(t.contactId,e.connectionId)})},n.prototype.getInitialConnection=function(){return connect.find(this.getConnections(),function(e){return e.isInitialConnection()})||null},n.prototype.getActiveInitialConnection=function(){var e=this.getInitialConnection();return null!=e&&e.isActive()?e:null},n.prototype.getThirdPartyConnections=function(){return this.getConnections().filter(function(e){return!e.isInitialConnection()&&e.getType()!==connect.ConnectionType.AGENT})},n.prototype.getSingleActiveThirdPartyConnection=function(){return this.getThirdPartyConnections().filter(function(e){return e.isActive()})[0]||null},n.prototype.getAgentConnection=function(){return connect.find(this.getConnections(),function(e){var t=e.getType();return t===connect.ConnectionType.AGENT||t===connect.ConnectionType.MONITORING})},n.prototype.getAttributes=function(){return this._getData().attributes},n.prototype.isSoftphoneCall=function(){return null!=connect.find(this.getConnections(),function(e){return null!=e.getSoftphoneMediaInfo()})},n.prototype.isInbound=function(){var e=this.getInitialConnection();return!!e&&e.getType()===connect.ConnectionType.INBOUND},n.prototype.isConnected=function(){return this.getStatus().type===connect.ContactStateType.CONNECTED},n.prototype.accept=function(n){var e=connect.core.getClient(),r=this;e.call(connect.ClientMethods.ACCEPT_CONTACT,{contactId:this.getContactId()},{success:function(e){var t=connect.core.getUpstream();t.sendUpstream(connect.EventType.BROADCAST,{event:connect.ContactEvents.ACCEPTED}),t.sendUpstream(connect.EventType.BROADCAST,{event:connect.core.getContactEventName(connect.ContactEvents.ACCEPTED,r.getContactId())}),n&&n.success&&n.success(e)},failure:n?n.failure:null})},n.prototype.destroy=function(e){connect.core.getClient().call(connect.ClientMethods.DESTROY_CONTACT,{contactId:this.getContactId()},e)},n.prototype.complete=function(e){connect.core.getClient().call(connect.ClientMethods.COMPLETE_CONTACT,{contactId:this.getContactId()},e)},n.prototype.notifyIssue=function(e,t,n){connect.core.getClient().call(connect.ClientMethods.NOTIFY_CONTACT_ISSUE,{contactId:this.getContactId(),issueCode:e,description:t},n)},n.prototype.addConnection=function(e,t){var n=connect.core.getClient(),r=new connect.Endpoint(e);delete r.endpointId,n.call(connect.ClientMethods.CREATE_ADDITIONAL_CONNECTION,{contactId:this.getContactId(),endpoint:r},t)},n.prototype.toggleActiveConnections=function(e){var t=connect.core.getClient(),n=null,r=connect.find(this.getConnections(),function(e){return e.getStatus().type===connect.ConnectionStateType.HOLD});if(null!=r)n=r.getConnectionId();else{var o=this.getConnections().filter(function(e){return e.isActive()});0=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var t=e.prefix||"";return"DEBUG"===this._logsDestination?this.consoleLoggerWrapper:new y(t)}},{key:"updateLoggerConfig",value:function(e){var t=e||{};this._level=t.level||d.INFO,this._clientLogger=t.logger||null,this._logsDestination="NULL",t.debug&&(this._logsDestination="DEBUG"),t.logger&&(this._logsDestination="CLIENT_LOGGER")}}]),S),m=(h(E,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),E),y=(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(b,m),h(b,[{key:"debug",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n>>0).toString(8);break;case"s":n=String(n),n=i.precision?n.substring(0,i.precision):n;break;case"t":n=String(!!n),n=i.precision?n.substring(0,i.precision):n;break;case"T":n=Object.prototype.toString.call(n).slice(8,-1).toLowerCase(),n=i.precision?n.substring(0,i.precision):n;break;case"u":n=parseInt(n,10)>>>0;break;case"v":n=n.valueOf(),n=i.precision?n.substring(0,i.precision):n;break;case"x":n=(parseInt(n,10)>>>0).toString(16);break;case"X":n=(parseInt(n,10)>>>0).toString(16).toUpperCase()}d.json.test(i.type)?f+=n:(!d.number.test(i.type)||u&&!i.sign?l="":(l=u?"+":"-",n=n.toString().replace(d.sign,"")),a=i.pad_char?"0"===i.pad_char?"0":i.pad_char.charAt(1):" ",c=i.width-(l+n).length,s=i.width&&0t.packetsLost?e.packetsLost-t.packetsLost:0,o=e.packetsCount>t.packetsCount?e.packetsCount-t.packetsCount:0;return new O(e.timestamp,r,o,n,e.audioLevel,e.jbMilliseconds,e.rttMilliseconds)}return new O(e.timestamp,e.packetsLost,e.packetsCount,n,e.audioLevel,e.jbMilliseconds,e.rttMilliseconds)},x=function(e,t){u=r(u),l=r(l),function(e,t,n,r){t.streamStats=[L(n,i),L(r,s)];var o={callStartTime:t.sessionStartTime,callEndTime:t.sessionEndTime,gumTimeMillis:t.gumTimeMillis,initializationTimeMillis:t.initializationTimeMillis,iceCollectionTimeMillis:t.iceCollectionTimeMillis,signallingConnectTimeMillis:t.signallingConnectTimeMillis,handshakingTimeMillis:t.handshakingTimeMillis,preTalkingTimeMillis:t.preTalkingTimeMillis,talkingTimeMillis:t.talkingTimeMillis,cleanupTimeMillis:t.cleanupTimeMillis,iceCollectionFailure:t.iceCollectionFailure,signallingConnectionFailure:t.signallingConnectionFailure,handshakingFailure:t.handshakingFailure,gumOtherFailure:t.gumOtherFailure,gumTimeoutFailure:t.gumTimeoutFailure,createOfferFailure:t.createOfferFailure,setLocalDescriptionFailure:t.setLocalDescriptionFailure,userBusyFailure:t.userBusyFailure,invalidRemoteSDPFailure:t.invalidRemoteSDPFailure,noRemoteIceCandidateFailure:t.noRemoteIceCandidateFailure,setRemoteDescriptionFailure:t.setRemoteDescriptionFailure,softphoneStreamStatistics:t.streamStats};e.sendSoftphoneReport(o,{success:function(){h.info("sendSoftphoneReport success")},failure:function(e){h.error("sendSoftphoneReport failed.").withObject(e)}})}(e,t,L(a,i),L(c,s)),n(e)},O=function(e,t,n,r,o,i,s){this.softphoneStreamType=r,this.timestamp=e,this.packetsLost=t,this.packetsCount=n,this.audioLevel=o,this.jitterBufferMillis=i,this.roundTripTimeMillis=s},L=function(e,t){return new O((e=e||{}).timestamp,e.packetsLost,e.packetsCount,t,e.audioLevel)},P=function(e){this._originalLogger=e;var r=this;this._tee=function(e,n){return function(){var e=Array.prototype.slice.call(arguments[0]),t="";e.forEach(function(){t+=" %s"}),n.apply(r._originalLogger,[connect.LogComponent.SOFTPHONE,t].concat(e))}}};P.prototype.debug=function(){this._tee(1,this._originalLogger.debug)(arguments)},P.prototype.info=function(){this._tee(2,this._originalLogger.info)(arguments)},P.prototype.log=function(){this._tee(3,this._originalLogger.log)(arguments)},P.prototype.warn=function(){this._tee(4,this._originalLogger.warn)(arguments)},P.prototype.error=function(){this._tee(5,this._originalLogger.error)(arguments)},connect.SoftphoneManager=function(e){var a;h=new P(connect.getLog()),connect.RtcPeerConnectionFactory&&(a=new connect.RtcPeerConnectionFactory(h,connect.core.getWebSocketManager(),g,connect.hitch(this,t,{transportType:"softphone",softphoneClientId:g}),connect.hitch(this,C))),A()||C(f.UNSUPPORTED_BROWSER,"Connect does not support this browser. Some functionality may not work. ","");S({success:function(e){connect.isFirefoxBrowser()&&connect.core.setSoftphoneUserMediaStream(e)},failure:function(e){C(e,"Your microphone is not enabled in your browser. ","")}});y(),this.ringtoneEngine=null;var c="true"===e.cleanMultipleSessions,u={},l={};this.getSession=function(e){return u[e]};function p(n){if(u.hasOwnProperty(n)){var r=u[n];new Promise(function(e,t){delete u[n],delete l[n],r.hangup()}).catch(function(e){lily.getLog().warn("Clean up the session locally "+n,e.message)})}}function n(n,r){var e;if(u[r]&&((e=n).getStatus().type===connect.ContactStatusType.ENDED||e.getStatus().type===connect.ContactStatusType.ERROR||e.getStatus().type===connect.ContactStatusType.MISSED)&&p(r),n.isSoftphoneCall()&&!l[r]&&(n.getStatus().type===connect.ContactStatusType.CONNECTING||n.getStatus().type===connect.ContactStatusType.INCOMING)){l[r]=!0,h.info("Softphone call detected:","contactId "+n.getContactId(),"agent connectionId "+r),function(e){if(0e.BLOCK_SIZE&&((r=new e).update(n),n=r.digest())}var o=new Uint8Array(e.BLOCK_SIZE);return o.set(n),o}(e,t),r=new Uint8Array(e.BLOCK_SIZE);r.set(n);for(var o=0;o>>32-o)+n&4294967295}function s(e,t,n,r,o,i,s){return c(t&n|~t&r,e,t,o,i,s)}function u(e,t,n,r,o,i,s){return c(t&r|n&~r,e,t,o,i,s)}function l(e,t,n,r,o,i,s){return c(t^n^r,e,t,o,i,s)}function p(e,t,n,r,o,i,s){return c(n^(t|~r),e,t,o,i,s)}(t.exports=r).BLOCK_SIZE=64,r.prototype.update=function(e){if(o.isEmptyData(e))return this;if(this.finished)throw new Error("Attempted to update an already finished hash.");var t=o.convertToBuffer(e),n=0,r=t.byteLength;for(this.bytesHashed+=r;0>>0,!0),t.setUint32(60,Math.floor(r/4294967296),!0),this.hashBuffer(),this.finished=!0}for(var i=new DataView(new ArrayBuffer(16)),o=0;o<4;o++)i.setUint32(4*o,this.state[o],!0);var s=new a(i.buffer,i.byteOffset,i.byteLength);return e?s.toString(e):s},r.prototype.hashBuffer=function(){var e=this.buffer,t=this.state,n=s(n=t[0],i=t[1],o=t[2],r=t[3],e.getUint32(0,!0),7,3614090360),r=s(r,n,i,o,e.getUint32(4,!0),12,3905402710),o=s(o,r,n,i,e.getUint32(8,!0),17,606105819),i=s(i,o,r,n,e.getUint32(12,!0),22,3250441966);n=s(n,i,o,r,e.getUint32(16,!0),7,4118548399),r=s(r,n,i,o,e.getUint32(20,!0),12,1200080426),o=s(o,r,n,i,e.getUint32(24,!0),17,2821735955),i=s(i,o,r,n,e.getUint32(28,!0),22,4249261313),n=s(n,i,o,r,e.getUint32(32,!0),7,1770035416),r=s(r,n,i,o,e.getUint32(36,!0),12,2336552879),o=s(o,r,n,i,e.getUint32(40,!0),17,4294925233),i=s(i,o,r,n,e.getUint32(44,!0),22,2304563134),n=s(n,i,o,r,e.getUint32(48,!0),7,1804603682),r=s(r,n,i,o,e.getUint32(52,!0),12,4254626195),o=s(o,r,n,i,e.getUint32(56,!0),17,2792965006),n=u(n,i=s(i,o,r,n,e.getUint32(60,!0),22,1236535329),o,r,e.getUint32(4,!0),5,4129170786),r=u(r,n,i,o,e.getUint32(24,!0),9,3225465664),o=u(o,r,n,i,e.getUint32(44,!0),14,643717713),i=u(i,o,r,n,e.getUint32(0,!0),20,3921069994),n=u(n,i,o,r,e.getUint32(20,!0),5,3593408605),r=u(r,n,i,o,e.getUint32(40,!0),9,38016083),o=u(o,r,n,i,e.getUint32(60,!0),14,3634488961),i=u(i,o,r,n,e.getUint32(16,!0),20,3889429448),n=u(n,i,o,r,e.getUint32(36,!0),5,568446438),r=u(r,n,i,o,e.getUint32(56,!0),9,3275163606),o=u(o,r,n,i,e.getUint32(12,!0),14,4107603335),i=u(i,o,r,n,e.getUint32(32,!0),20,1163531501),n=u(n,i,o,r,e.getUint32(52,!0),5,2850285829),r=u(r,n,i,o,e.getUint32(8,!0),9,4243563512),o=u(o,r,n,i,e.getUint32(28,!0),14,1735328473),n=l(n,i=u(i,o,r,n,e.getUint32(48,!0),20,2368359562),o,r,e.getUint32(20,!0),4,4294588738),r=l(r,n,i,o,e.getUint32(32,!0),11,2272392833),o=l(o,r,n,i,e.getUint32(44,!0),16,1839030562),i=l(i,o,r,n,e.getUint32(56,!0),23,4259657740),n=l(n,i,o,r,e.getUint32(4,!0),4,2763975236),r=l(r,n,i,o,e.getUint32(16,!0),11,1272893353),o=l(o,r,n,i,e.getUint32(28,!0),16,4139469664),i=l(i,o,r,n,e.getUint32(40,!0),23,3200236656),n=l(n,i,o,r,e.getUint32(52,!0),4,681279174),r=l(r,n,i,o,e.getUint32(0,!0),11,3936430074),o=l(o,r,n,i,e.getUint32(12,!0),16,3572445317),i=l(i,o,r,n,e.getUint32(24,!0),23,76029189),n=l(n,i,o,r,e.getUint32(36,!0),4,3654602809),r=l(r,n,i,o,e.getUint32(48,!0),11,3873151461),o=l(o,r,n,i,e.getUint32(60,!0),16,530742520),n=p(n,i=l(i,o,r,n,e.getUint32(8,!0),23,3299628645),o,r,e.getUint32(0,!0),6,4096336452),r=p(r,n,i,o,e.getUint32(28,!0),10,1126891415),o=p(o,r,n,i,e.getUint32(56,!0),15,2878612391),i=p(i,o,r,n,e.getUint32(20,!0),21,4237533241),n=p(n,i,o,r,e.getUint32(48,!0),6,1700485571),r=p(r,n,i,o,e.getUint32(12,!0),10,2399980690),o=p(o,r,n,i,e.getUint32(40,!0),15,4293915773),i=p(i,o,r,n,e.getUint32(4,!0),21,2240044497),n=p(n,i,o,r,e.getUint32(32,!0),6,1873313359),r=p(r,n,i,o,e.getUint32(60,!0),10,4264355552),o=p(o,r,n,i,e.getUint32(24,!0),15,2734768916),i=p(i,o,r,n,e.getUint32(52,!0),21,1309151649),n=p(n,i,o,r,e.getUint32(16,!0),6,4149444226),r=p(r,n,i,o,e.getUint32(44,!0),10,3174756917),o=p(o,r,n,i,e.getUint32(8,!0),15,718787259),i=p(i,o,r,n,e.getUint32(36,!0),21,3951481745),t[0]=n+t[0]&4294967295,t[1]=i+t[1]&4294967295,t[2]=o+t[2]&4294967295,t[3]=r+t[3]&4294967295}},{"./browserHashUtils":11,"buffer/":83}],14:[function(e,t,n){var o=e("buffer/").Buffer,r=e("./browserHashUtils");new Uint32Array([1518500249,1859775393,-1894007588,-899497514]),Math.pow(2,53);function i(){this.h0=1732584193,this.h1=4023233417,this.h2=2562383102,this.h3=271733878,this.h4=3285377520,this.block=new Uint32Array(80),this.offset=0,this.shift=24,this.totalLength=0}(t.exports=i).BLOCK_SIZE=64,i.prototype.update=function(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");if(r.isEmptyData(e))return this;var t=(e=r.convertToBuffer(e)).length;this.totalLength+=8*t;for(var n=0;n>t);var n=new o(20),r=new DataView(n.buffer);return r.setUint32(0,this.h0,!1),r.setUint32(4,this.h1,!1),r.setUint32(8,this.h2,!1),r.setUint32(12,this.h3,!1),r.setUint32(16,this.h4,!1),e?n.toString(e):n},i.prototype.processBlock=function(){for(var e=16;e<80;e++){var t=this.block[e-3]^this.block[e-8]^this.block[e-14]^this.block[e-16];this.block[e]=t<<1|t>>>31}for(var n,r,o=this.h0,i=this.h1,s=this.h2,a=this.h3,c=this.h4,e=0;e<80;e++){r=e<20?(n=a^i&(s^a),1518500249):e<40?(n=i^s^a,1859775393):e<60?(n=i&s|a&(i|s),2400959708):(n=i^s^a,3395469782);var u=(o<<5|o>>>27)+n+c+r+(0|this.block[e]),c=a,a=s,s=i<<30|i>>>2,i=o,o=u}for(this.h0=this.h0+o|0,this.h1=this.h1+i|0,this.h2=this.h2+s|0,this.h3=this.h3+a|0,this.h4=this.h4+c|0,e=this.offset=0;e<16;e++)this.block[e]=0}},{"./browserHashUtils":11,"buffer/":83}],15:[function(e,t,n){var s=e("buffer/").Buffer,r=e("./browserHashUtils"),m=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),o=Math.pow(2,53)-1;function i(){this.state=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.temp=new Int32Array(64),this.buffer=new Uint8Array(64),this.bufferLength=0,this.bytesHashed=0,this.finished=!1}(t.exports=i).BLOCK_SIZE=64,i.prototype.update=function(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");if(r.isEmptyData(e))return this;var t=0,n=(e=r.convertToBuffer(e)).byteLength;if(this.bytesHashed+=n,8*this.bytesHashed>o)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;0>>24&255,i[4*o+1]=this.state[o]>>>16&255,i[4*o+2]=this.state[o]>>>8&255,i[4*o+3]=this.state[o]>>>0&255;return e?i.toString(e):i},i.prototype.hashBuffer=function(){for(var e,t,n,r=this.buffer,o=this.state,i=o[0],s=o[1],a=o[2],c=o[3],u=o[4],l=o[5],p=o[6],h=o[7],f=0;f<64;f++){f<16?this.temp[f]=(255&r[4*f])<<24|(255&r[4*f+1])<<16|(255&r[4*f+2])<<8|255&r[4*f+3]:(e=((t=this.temp[f-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10,n=((t=this.temp[f-15])>>>7|t<<25)^(t>>>18|t<<14)^t>>>3,this.temp[f]=(e+this.temp[f-7]|0)+(n+this.temp[f-16]|0));var d=(((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+(u&l^~u&p)|0)+(h+(m[f]+this.temp[f]|0)|0)|0,g=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&s^i&a^s&a)|0,h=p,p=l,l=u,u=c+d|0,c=a,a=s,s=i,i=d+g|0}o[0]+=i,o[1]+=s,o[2]+=a,o[3]+=c,o[4]+=u,o[5]+=l,o[6]+=p,o[7]+=h}},{"./browserHashUtils":11,"buffer/":83}],16:[function(r,o,e){(function(e){var t=r("./util");t.crypto.lib=r("./browserCryptoLib"),t.Buffer=r("buffer/").Buffer,t.url=r("url/"),t.querystring=r("querystring/"),t.realClock=r("./realclock/browserClock"),t.environment="js",t.createEventStream=r("./event-stream/buffered-create-event-stream").createEventStream,t.isBrowser=function(){return!0},t.isNode=function(){return!1};var n=r("./core");o.exports=n,r("./credentials"),r("./credentials/credential_provider_chain"),r("./credentials/temporary_credentials"),r("./credentials/chainable_temporary_credentials"),r("./credentials/web_identity_credentials"),r("./credentials/cognito_identity_credentials"),r("./credentials/saml_credentials"),n.XML.Parser=r("./xml/browser_parser"),r("./http/xhr"),void 0===e&&(e={browser:!0})}).call(this,r("_process"))},{"./browserCryptoLib":10,"./core":18,"./credentials":19,"./credentials/chainable_temporary_credentials":20,"./credentials/cognito_identity_credentials":21,"./credentials/credential_provider_chain":22,"./credentials/saml_credentials":23,"./credentials/temporary_credentials":24,"./credentials/web_identity_credentials":25,"./event-stream/buffered-create-event-stream":27,"./http/xhr":35,"./realclock/browserClock":52,"./util":71,"./xml/browser_parser":72,_process:87,"buffer/":83,"querystring/":94,"url/":96}],17:[function(e,t,n){var r,i=e("./core");e("./credentials"),e("./credentials/credential_provider_chain"),i.Config=i.util.inherit({constructor:function(n){void 0===n&&(n={}),n=this.extractCredentials(n),i.util.each.call(this,this.keys,function(e,t){this.set(e,n[e],t)})},getCredentials:function(t){var e,n=this;function r(e){t(e,e?null:n.credentials)}function o(e,t){return new i.util.error(t||new Error,{code:"CredentialsError",message:e,name:"CredentialsError"})}n.credentials?"function"==typeof n.credentials.get?n.credentials.get(function(e){r(e=e&&o("Could not load credentials from "+n.credentials.constructor.name,e))}):(e=null,n.credentials.accessKeyId&&n.credentials.secretAccessKey||(e=o("Missing credentials")),r(e)):n.credentialProvider?n.credentialProvider.resolve(function(e,t){e=e&&o("Could not load credentials from any providers",e),n.credentials=t,r(e)}):r(o("No credentials to load"))},update:function(e,n){n=n||!1,e=this.extractCredentials(e),i.util.each.call(this,e,function(e,t){(n||Object.prototype.hasOwnProperty.call(this.keys,e)||i.Service.hasService(e))&&this.set(e,t)})},loadFromPath:function(e){this.clear();var n=JSON.parse(i.util.readFileSync(e)),t=new i.FileSystemCredentials(e),r=new i.CredentialProviderChain;return r.providers.unshift(t),r.resolve(function(e,t){if(e)throw e;n.credentials=t}),this.constructor(n),this},clear:function(){i.util.each.call(this,this.keys,function(e){delete this[e]}),this.set("credentials",void 0),this.set("credentialProvider",void 0)},set:function(e,t,n){void 0===t?(void 0===n&&(n=this.keys[e]),this[e]="function"==typeof n?n.call(this):n):"httpOptions"===e&&this[e]?this[e]=i.util.merge(this[e],t):this[e]=t},keys:{credentials:null,credentialProvider:null,region:null,logger:null,apiVersions:{},apiVersion:null,endpoint:void 0,httpOptions:{timeout:12e4},maxRetries:void 0,maxRedirects:10,paramValidation:!0,sslEnabled:!0,s3ForcePathStyle:!1,s3BucketEndpoint:!1,s3DisableBodySigning:!0,computeChecksums:!0,convertResponseTypes:!0,correctClockSkew:!1,customUserAgent:null,dynamoDbCrc32:!0,systemClockOffset:0,signatureVersion:null,signatureCache:!0,retryDelayOptions:{},useAccelerateEndpoint:!1,clientSideMonitoring:!1,endpointDiscoveryEnabled:!1,endpointCacheSize:1e3,hostPrefixEnabled:!0,stsRegionalEndpoints:null},extractCredentials:function(e){return e.accessKeyId&&e.secretAccessKey&&((e=i.util.copy(e)).credentials=new i.Credentials(e)),e},setPromisesDependency:function(e){null===(r=e)&&"function"==typeof Promise&&(r=Promise);var t=[i.Request,i.Credentials,i.CredentialProviderChain];i.S3&&(t.push(i.S3),i.S3.ManagedUpload&&t.push(i.S3.ManagedUpload)),i.util.addPromises(t,r)},getPromisesDependency:function(){return r}}),i.config=new i.Config},{"./core":18,"./credentials":19,"./credentials/credential_provider_chain":22}],18:[function(e,t,n){var r={util:e("./util")};({}).toString(),(t.exports=r).util.update(r,{VERSION:"2.553.0",Signers:{},Protocol:{Json:e("./protocol/json"),Query:e("./protocol/query"),Rest:e("./protocol/rest"),RestJson:e("./protocol/rest_json"),RestXml:e("./protocol/rest_xml")},XML:{Builder:e("./xml/builder"),Parser:null},JSON:{Builder:e("./json/builder"),Parser:e("./json/parser")},Model:{Api:e("./model/api"),Operation:e("./model/operation"),Shape:e("./model/shape"),Paginator:e("./model/paginator"),ResourceWaiter:e("./model/resource_waiter")},apiLoader:e("./api_loader"),EndpointCache:e("../vendor/endpoint-cache").EndpointCache}),e("./sequential_executor"),e("./service"),e("./config"),e("./http"),e("./event_listeners"),e("./request"),e("./response"),e("./resource_waiter"),e("./signers/request_signer"),e("./param_validator"),r.events=new r.SequentialExecutor,r.util.memoizedProperty(r,"endpointCache",function(){return new r.EndpointCache(r.config.endpointCacheSize)},!0)},{"../vendor/endpoint-cache":105,"./api_loader":9,"./config":17,"./event_listeners":33,"./http":34,"./json/builder":36,"./json/parser":37,"./model/api":38,"./model/operation":40,"./model/paginator":41,"./model/resource_waiter":42,"./model/shape":43,"./param_validator":44,"./protocol/json":46,"./protocol/query":47,"./protocol/rest":48,"./protocol/rest_json":49,"./protocol/rest_xml":50,"./request":55,"./resource_waiter":56,"./response":57,"./sequential_executor":58,"./service":59,"./signers/request_signer":63,"./util":71,"./xml/builder":73}],19:[function(e,t,n){var o=e("./core");o.Credentials=o.util.inherit({constructor:function(e,t,n){var r;o.util.hideProperties(this,["secretAccessKey"]),this.expired=!1,this.expireTime=null,this.refreshCallbacks=[],1===arguments.length&&"object"==typeof e?(r=e.credentials||e,this.accessKeyId=r.accessKeyId,this.secretAccessKey=r.secretAccessKey,this.sessionToken=r.sessionToken):(this.accessKeyId=e,this.secretAccessKey=t,this.sessionToken=n)},expiryWindow:15,needsRefresh:function(){var e=o.util.date.getDate().getTime(),t=new Date(e+1e3*this.expiryWindow);return!!(this.expireTime&&t>this.expireTime)||(this.expired||!this.accessKeyId||!this.secretAccessKey)},get:function(t){var n=this;this.needsRefresh()?this.refresh(function(e){e||(n.expired=!1),t&&t(e)}):t&&t()},refresh:function(e){this.expired=!1,e()},coalesceRefresh:function(e,n){var r=this;1===r.refreshCallbacks.push(e)&&r.load(function(t){o.util.arrayEach(r.refreshCallbacks,function(e){n?e(t):o.util.defer(function(){e(t)})}),r.refreshCallbacks.length=0})},load:function(e){e()}}),o.Credentials.addPromisesToClass=function(e){this.prototype.getPromise=o.util.promisifyMethod("get",e),this.prototype.refreshPromise=o.util.promisifyMethod("refresh",e)},o.Credentials.deletePromisesFromClass=function(){delete this.prototype.getPromise,delete this.prototype.refreshPromise},o.util.addPromises(o.Credentials)},{"./core":18}],20:[function(e,t,n){var i=e("../core"),r=e("../../clients/sts");i.ChainableTemporaryCredentials=i.util.inherit(i.Credentials,{constructor:function(e){i.Credentials.call(this),e=e||{},this.errorCode="ChainableTemporaryCredentialsProviderFailure",this.expired=!0,this.tokenCodeFn=null;var t=i.util.copy(e.params)||{};if(t.RoleArn&&(t.RoleSessionName=t.RoleSessionName||"temporary-credentials"),t.SerialNumber){if(!e.tokenCodeFn||"function"!=typeof e.tokenCodeFn)throw new i.util.error(new Error("tokenCodeFn must be a function when params.SerialNumber is given"),{code:this.errorCode});this.tokenCodeFn=e.tokenCodeFn}var n=i.util.merge({params:t,credentials:e.masterCredentials||i.config.credentials},e.stsConfig||{});this.service=new r(n)},refresh:function(e){this.coalesceRefresh(e||i.util.fn.callback)},load:function(r){var o=this,i=o.service.config.params.RoleArn?"assumeRole":"getSessionToken";this.getTokenCode(function(e,t){var n={};e?r(e):(t&&(n.TokenCode=t),o.service[i](n,function(e,t){e||o.service.credentialsFrom(t,o),r(e)}))})},getTokenCode:function(r){var o=this;this.tokenCodeFn?this.tokenCodeFn(this.service.config.params.SerialNumber,function(e,t){if(e){var n=e;return e instanceof Error&&(n=e.message),void r(i.util.error(new Error("Error fetching MFA token: "+n),{code:o.errorCode}))}r(null,t)}):r(null)}})},{"../../clients/sts":8,"../core":18}],21:[function(e,t,n){var r=e("../core"),o=e("../../clients/cognitoidentity"),i=e("../../clients/sts");r.CognitoIdentityCredentials=r.util.inherit(r.Credentials,{localStorageKey:{id:"aws.cognito.identity-id.",providers:"aws.cognito.identity-providers."},constructor:function(e,t){r.Credentials.call(this),this.expired=!0,this.params=e,this.data=null,this._identityId=null,this._clientConfig=r.util.copy(t||{}),this.loadCachedId();var n=this;Object.defineProperty(this,"identityId",{get:function(){return n.loadCachedId(),n._identityId||n.params.IdentityId},set:function(e){n._identityId=e}})},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(t){var n=this;n.createClients(),n.data=null,n._identityId=null,n.getId(function(e){e?(n.clearIdOnNotAuthorized(e),t(e)):n.params.RoleArn?n.getCredentialsFromSTS(t):n.getCredentialsForIdentity(t)})},clearCachedId:function(){this._identityId=null,delete this.params.IdentityId;var e=this.params.IdentityPoolId,t=this.params.LoginId||"";delete this.storage[this.localStorageKey.id+e+t],delete this.storage[this.localStorageKey.providers+e+t]},clearIdOnNotAuthorized:function(e){"NotAuthorizedException"==e.code&&this.clearCachedId()},getId:function(n){var r=this;if("string"==typeof r.params.IdentityId)return n(null,r.params.IdentityId);r.cognito.getId(function(e,t){!e&&t.IdentityId?(r.params.IdentityId=t.IdentityId,n(null,t.IdentityId)):n(e)})},loadCredentials:function(e,t){e&&t&&(t.expired=!1,t.accessKeyId=e.Credentials.AccessKeyId,t.secretAccessKey=e.Credentials.SecretKey,t.sessionToken=e.Credentials.SessionToken,t.expireTime=e.Credentials.Expiration)},getCredentialsForIdentity:function(n){var r=this;r.cognito.getCredentialsForIdentity(function(e,t){e?r.clearIdOnNotAuthorized(e):(r.cacheId(t),r.data=t,r.loadCredentials(r.data,r)),n(e)})},getCredentialsFromSTS:function(n){var r=this;r.cognito.getOpenIdToken(function(e,t){e?(r.clearIdOnNotAuthorized(e),n(e)):(r.cacheId(t),r.params.WebIdentityToken=t.Token,r.webIdentityCredentials.refresh(function(e){e||(r.data=r.webIdentityCredentials.data,r.sts.credentialsFrom(r.data,r)),n(e)}))})},loadCachedId:function(){var e,t,n=this;r.util.isBrowser()&&!n.params.IdentityId&&((e=n.getStorage("id"))&&n.params.Logins?(t=Object.keys(n.params.Logins),0!==(n.getStorage("providers")||"").split(",").filter(function(e){return-1!==t.indexOf(e)}).length&&(n.params.IdentityId=e)):e&&(n.params.IdentityId=e))},createClients:function(){var e,t=this._clientConfig;this.webIdentityCredentials=this.webIdentityCredentials||new r.WebIdentityCredentials(this.params,t),this.cognito||((e=r.util.merge({},t)).params=this.params,this.cognito=new o(e)),this.sts=this.sts||new i(t)},cacheId:function(e){this._identityId=e.IdentityId,this.params.IdentityId=this._identityId,r.util.isBrowser()&&(this.setStorage("id",e.IdentityId),this.params.Logins&&this.setStorage("providers",Object.keys(this.params.Logins).join(",")))},getStorage:function(e){return this.storage[this.localStorageKey[e]+this.params.IdentityPoolId+(this.params.LoginId||"")]},setStorage:function(e,t){try{this.storage[this.localStorageKey[e]+this.params.IdentityPoolId+(this.params.LoginId||"")]=t}catch(e){}},storage:function(){try{var e=r.util.isBrowser()&&null!==window.localStorage&&"object"==typeof window.localStorage?window.localStorage:{};return e["aws.test-storage"]="foobar",delete e["aws.test-storage"],e}catch(e){return{}}}()})},{"../../clients/cognitoidentity":7,"../../clients/sts":8,"../core":18}],22:[function(e,t,n){var a=e("../core");a.CredentialProviderChain=a.util.inherit(a.Credentials,{constructor:function(e){this.providers=e||a.CredentialProviderChain.defaultProviders.slice(0),this.resolveCallbacks=[]},resolve:function(e){var o,i,s=this;if(0===s.providers.length)return e(new Error("No providers")),s;return 1===s.resolveCallbacks.push(e)&&(o=0,i=s.providers.slice(0),function t(n,r){if(!n&&r||o===i.length)return a.util.arrayEach(s.resolveCallbacks,function(e){e(n,r)}),void(s.resolveCallbacks.length=0);var e=i[o++];(r="function"==typeof e?e.call():e).get?r.get(function(e){t(e,e?null:r)}):t(null,r)}()),s}}),a.CredentialProviderChain.defaultProviders=[],a.CredentialProviderChain.addPromisesToClass=function(e){this.prototype.resolvePromise=a.util.promisifyMethod("resolve",e)},a.CredentialProviderChain.deletePromisesFromClass=function(){delete this.prototype.resolvePromise},a.util.addPromises(a.CredentialProviderChain)},{"../core":18}],23:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.SAMLCredentials=r.util.inherit(r.Credentials,{constructor:function(e){r.Credentials.call(this),this.expired=!0,this.params=e},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.service.assumeRoleWithSAML(function(e,t){e||r.service.credentialsFrom(t,r),n(e)})},createClients:function(){this.service=this.service||new o({params:this.params})}})},{"../../clients/sts":8,"../core":18}],24:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.TemporaryCredentials=r.util.inherit(r.Credentials,{constructor:function(e,t){r.Credentials.call(this),this.loadMasterCredentials(t),this.expired=!0,this.params=e||{},this.params.RoleArn&&(this.params.RoleSessionName=this.params.RoleSessionName||"temporary-credentials")},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.masterCredentials.get(function(){r.service.config.credentials=r.masterCredentials,(r.params.RoleArn?r.service.assumeRole:r.service.getSessionToken).call(r.service,function(e,t){e||r.service.credentialsFrom(t,r),n(e)})})},loadMasterCredentials:function(e){for(this.masterCredentials=e||r.config.credentials;this.masterCredentials.masterCredentials;)this.masterCredentials=this.masterCredentials.masterCredentials;"function"!=typeof this.masterCredentials.get&&(this.masterCredentials=new r.Credentials(this.masterCredentials))},createClients:function(){this.service=this.service||new o({params:this.params})}})},{"../../clients/sts":8,"../core":18}],25:[function(e,t,n){var r=e("../core"),o=e("../../clients/sts");r.WebIdentityCredentials=r.util.inherit(r.Credentials,{constructor:function(e,t){r.Credentials.call(this),this.expired=!0,this.params=e,this.params.RoleSessionName=this.params.RoleSessionName||"web-identity",this.data=null,this._clientConfig=r.util.copy(t||{})},refresh:function(e){this.coalesceRefresh(e||r.util.fn.callback)},load:function(n){var r=this;r.createClients(),r.service.assumeRoleWithWebIdentity(function(e,t){r.data=null,e||(r.data=t,r.service.credentialsFrom(t,r)),n(e)})},createClients:function(){var e;this.service||((e=r.util.merge({},this._clientConfig)).params=this.params,this.service=new o(e))}})},{"../../clients/sts":8,"../core":18}],26:[function(e,t,n){(function(i){var p=e("./core"),h=e("./util"),s=["AWS_ENABLE_ENDPOINT_DISCOVERY","AWS_ENDPOINT_DISCOVERY_ENABLED"];function f(e){var t=e.service,n=t.api||{},r={};return t.config.region&&(r.region=t.config.region),n.serviceId&&(r.serviceId=n.serviceId),t.config.credentials.accessKeyId&&(r.accessKeyId=t.config.credentials.accessKeyId),r}function d(e,t){var n={};return function r(o,i,s){s&&null!=i&&"structure"===s.type&&s.required&&0=this.HEADERS_RECEIVED&&!u&&(s.statusCode=c.status,s.headers=o.parseHeaders(c.getAllResponseHeaders()),s.emit("headers",s.statusCode,s.headers,c.statusText),u=!0),this.readyState===this.DONE&&o.finishRequest(c,s)},!1),c.upload.addEventListener("progress",function(e){s.emit("sendProgress",e)}),c.addEventListener("progress",function(e){s.emit("receiveProgress",e)},!1),c.addEventListener("timeout",function(){r(l.util.error(new Error("Timeout"),{code:"TimeoutError"}))},!1),c.addEventListener("error",function(){r(l.util.error(new Error("Network Failure"),{code:"NetworkingError"}))},!1),c.addEventListener("abort",function(){r(l.util.error(new Error("Request aborted"),{code:"RequestAbortedError"}))},!1),n(s),c.open(t.method,a,!1!==e.xhrAsync),l.util.each(t.headers,function(e,t){"Content-Length"!==e&&"User-Agent"!==e&&"Host"!==e&&c.setRequestHeader(e,t)}),e.timeout&&!1!==e.xhrAsync&&(c.timeout=e.timeout),e.xhrWithCredentials&&(c.withCredentials=!0);try{c.responseType="arraybuffer"}catch(e){}try{t.body?c.send(t.body):c.send()}catch(e){if(!t.body||"object"!=typeof t.body.buffer)throw e;c.send(t.body.buffer)}return s},parseHeaders:function(e){var r={};return l.util.arrayEach(e.split(/\r?\n/),function(e){var t=e.split(":",1)[0],n=e.substring(t.length+2);0= 1, but found "'+t+'" for '+n)},validatePattern:function(e,t,n){this.validation.pattern&&void 0!==e.pattern&&(new RegExp(e.pattern).test(t)||this.fail("PatternMatchError",'Provided value "'+t+'" does not match regex pattern /'+e.pattern+"/ for "+n))},validateRange:function(e,t,n,r){this.validation.min&&void 0!==e.min&&t= "+e.min+", but found "+t+" for "+n),this.validation.max&&void 0!==e.max&&t>e.max&&this.fail("MaxRangeError","Expected "+r+" <= "+e.max+", but found "+t+" for "+n)},validateEnum:function(e,t,n){this.validation.enum&&void 0!==e.enum&&-1===e.enum.indexOf(t)&&this.fail("EnumError","Found string value of "+t+", but expected "+e.enum.join("|")+" for "+n)},validateType:function(e,t,n,r){if(null==e)return!1;for(var o=!1,i=0;i=t.maxRetries&&(n.MaxRetriesExceeded=1),u.emit("apiCall",[n]))})},setupRequestListeners:function(){},getSignerClass:function(e){var t,n=null,r="";return e&&(r=(n=(e.service.api.operations||{})[e.operation]||null)?n.authtype:""),t=this.config.signatureVersion?this.config.signatureVersion:"v4"===r||"v4-unsigned-body"===r?"v4":this.api.signatureVersion,l.Signers.RequestSigner.getVersion(t)},serviceInterface:function(){switch(this.api.protocol){case"ec2":case"query":return l.EventListeners.Query;case"json":return l.EventListeners.Json;case"rest-json":return l.EventListeners.RestJson;case"rest-xml":return l.EventListeners.RestXml}if(this.api.protocol)throw new Error("Invalid service `protocol' "+this.api.protocol+" in API config")},successfulResponse:function(e){return e.httpResponse.statusCode<300},numRetries:function(){return void 0!==this.config.maxRetries?this.config.maxRetries:this.defaultRetryCount},retryDelays:function(e){return l.util.calculateRetryDelay(e,this.config.retryDelayOptions)},retryableError:function(e){return!!this.timeoutError(e)||(!!this.networkingError(e)||(!!this.expiredCredentialsError(e)||(!!this.throttledError(e)||500<=e.statusCode)))},networkingError:function(e){return"NetworkingError"===e.code},timeoutError:function(e){return"TimeoutError"===e.code},expiredCredentialsError:function(e){return"ExpiredTokenException"===e.code},clockSkewError:function(e){switch(e.code){case"RequestTimeTooSkewed":case"RequestExpired":case"InvalidSignatureException":case"SignatureDoesNotMatch":case"AuthFailure":case"RequestInTheFuture":return!0;default:return!1}},getSkewCorrectedDate:function(){return new Date(Date.now()+this.config.systemClockOffset)},applyClockOffset:function(e){e&&(this.config.systemClockOffset=e-Date.now())},isClockSkewed:function(e){if(e)return 3e4<=Math.abs(this.getSkewCorrectedDate().getTime()-e)},throttledError:function(e){if(429===e.statusCode)return!0;switch(e.code){case"ProvisionedThroughputExceededException":case"Throttling":case"ThrottlingException":case"RequestLimitExceeded":case"RequestThrottled":case"RequestThrottledException":case"TooManyRequestsException":case"TransactionInProgressException":return!0;default:return!1}},endpointFromTemplate:function(e){if("string"!=typeof e)return e;var t=e;return t=(t=(t=t.replace(/\{service\}/g,this.api.endpointPrefix)).replace(/\{region\}/g,this.config.region)).replace(/\{scheme\}/g,this.config.sslEnabled?"https":"http")},setEndpoint:function(e){this.endpoint=new l.Endpoint(e,this.config)},paginationConfig:function(e,t){var n=this.api.operations[e].paginator;if(n)return n;if(t){var r=new Error;throw l.util.error(r,"No pagination configuration for "+e)}return null}}),l.util.update(l.Service,{defineMethods:function(e){l.util.each(e.prototype.api.operations,function(n){e.prototype[n]||("none"===e.prototype.api.operations[n].authtype?e.prototype[n]=function(e,t){return this.makeUnauthenticatedRequest(n,e,t)}:e.prototype[n]=function(e,t){return this.makeRequest(n,e,t)})})},defineService:function(e,t,n){l.Service._serviceMap[e]=!0,Array.isArray(t)||(n=t,t=[]);var r,o,i,s=a(l.Service,n||{});return"string"==typeof e?(l.Service.addVersions(s,t),r=s.serviceIdentifier||e,s.serviceIdentifier=r):(s.prototype.api=e,l.Service.defineMethods(s)),l.SequentialExecutor.call(this.prototype),!this.prototype.publisher&&l.util.clientSideMonitoring&&(o=l.util.clientSideMonitoring.Publisher,i=(0,l.util.clientSideMonitoring.configProvider)(),this.prototype.publisher=new o(i),i.enabled&&(l.Service._clientSideMonitoring=!0)),l.SequentialExecutor.call(s.prototype),l.Service.addDefaultMonitoringListeners(s.prototype),s},addVersions:function(e,t){Array.isArray(t)||(t=[t]),e.services=e.services||{};for(var n=0;n=n.length)return r.push(null);var t=o+e;t>n.length&&(t=n.length),r.push(n.slice(o,t)),o=t},r},concat:function(e){for(var t,n=0,r=0,o=0;o>>8^t[255&(n^e.readUInt8(r))];return(-1^n)>>>0},hmac:function(e,t,n,r){return"buffer"===(n=n||"binary")&&(n=void 0),r=r||"sha256","string"==typeof t&&(t=l.buffer.toBuffer(t)),l.crypto.lib.createHmac(r,e).update(t).digest(n)},md5:function(e,t,n){return l.crypto.hash("md5",e,t,n)},sha256:function(e,t,n){return l.crypto.hash("sha256",e,t,n)},hash:function(e,t,n,r){var o=l.crypto.createHash(e);"buffer"===(n=n||"binary")&&(n=void 0),"string"==typeof t&&(t=l.buffer.toBuffer(t));var i=l.arraySliceFn(t),s=l.Buffer.isBuffer(t);if(l.isBrowser()&&"undefined"!=typeof ArrayBuffer&&t&&t.buffer instanceof ArrayBuffer&&(s=!0),r&&"object"==typeof t&&"function"==typeof t.on&&!s)t.on("data",function(e){o.update(e)}),t.on("error",function(e){r(e)}),t.on("end",function(){r(null,o.digest(n))});else{if(!r||!i||s||"undefined"==typeof FileReader){l.isBrowser()&&"object"==typeof t&&!s&&(t=new l.Buffer(new Uint8Array(t)));var a=o.update(t).digest(n);return r&&r(null,a),a}var c=0,u=new FileReader;u.onerror=function(){r(new Error("Failed to read data."))},u.onload=function(){var e=new l.Buffer(new Uint8Array(u.result));o.update(e),c+=e.length,u._continueReading()},u._continueReading=function(){var e;c>=t.size?r(null,o.digest(n)):((e=c+524288)>t.size&&(e=t.size),u.readAsArrayBuffer(i.call(t,c,e)))},u._continueReading()}},toHex:function(e){for(var t=[],n=0;n/g,">").replace(/"/g,""")}}},{}],75:[function(e,t,n){t.exports={escapeElement:function(e){return e.replace(/&/g,"&").replace(//g,">")}}},{}],76:[function(e,t,n){var a=e("./escape-attribute").escapeAttribute;function r(e,t){void 0===t&&(t=[]),this.name=e,this.children=t,this.attributes={}}r.prototype.addAttribute=function(e,t){return this.attributes[e]=t,this},r.prototype.addChildNode=function(e){return this.children.push(e),this},r.prototype.removeAttribute=function(e){return delete this.attributes[e],this},r.prototype.toString=function(){for(var e=Boolean(this.children.length),t="<"+this.name,n=this.attributes,r=0,o=Object.keys(n);r"+this.children.map(function(e){return e.toString()}).join("")+"":"/>")},t.exports={XmlNode:r}},{"./escape-attribute":74}],77:[function(e,t,n){var r=e("./escape-element").escapeElement;function o(e){this.value=e}o.prototype.toString=function(){return r(""+this.value)},t.exports={XmlText:o}},{"./escape-element":75}],78:[function(e,t,n){"use strict";n.byteLength=function(e){var t=p(e),n=t[0],r=t[1];return 3*(n+r)/4-r},n.toByteArray=function(e){var t,n,r=p(e),o=r[0],i=r[1],s=new l(function(e,t){return 3*(e+t)/4-t}(o,i)),a=0,c=0>16&255,s[a++]=t>>8&255,s[a++]=255&t;2===i&&(t=u[e.charCodeAt(n)]<<2|u[e.charCodeAt(n+1)]>>4,s[a++]=255&t);1===i&&(t=u[e.charCodeAt(n)]<<10|u[e.charCodeAt(n+1)]<<4|u[e.charCodeAt(n+2)]>>2,s[a++]=t>>8&255,s[a++]=255&t);return s},n.fromByteArray=function(e){for(var t,n=e.length,r=n%3,o=[],i=0,s=n-r;i>18&63]+a[e>>12&63]+a[e>>6&63]+a[63&e]}(r));return o.join("")}(e,i,s>2]+a[t<<4&63]+"==")):2==r&&(t=(e[n-2]<<8)+e[n-1],o.push(a[t>>10]+a[t>>4&63]+a[t<<2&63]+"="));return o.join("")};for(var a=[],u=[],l="undefined"!=typeof Uint8Array?Uint8Array:Array,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,i=r.length;o=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function f(e,t){if(p.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return k(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return N(e).length;default:if(r)return k(e).length;t=(""+t).toLowerCase(),r=!0}}function t(e,t,n){var r,o,i,s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=p.from(t,r)),p.isBuffer(t))return 0===t.length?-1:m(e,t,n,r,o);if("number"==typeof t)return t&=255,p.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):m(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function m(e,t,n,r,o){var i=1,s=e.length,a=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;s/=i=2,a/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o)for(var u=-1,l=n;l>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function b(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=E)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rt&&(e+=" ... ")),""},p.prototype.compare=function(e,t,n,r,o){if(!p.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(o<=r&&n<=t)return 0;if(o<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),a=Math.min(i,s),c=this.slice(r,o),u=e.slice(t,n),l=0;lthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var i,s,a,c,u,l,p=!1;;)switch(r){case"hex":return function(e,t,n,r){n=Number(n)||0;var o=e.length-n;(!r||o<(r=Number(r)))&&(r=o);var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");i/2e.length)throw new RangeError("Index out of range")}function T(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function w(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function _(e,t,n,r){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function A(e,t,n,r,o){return o||_(e,0,n,4),i.write(e,t,n,r,23,4),n+4}function I(e,t,n,r,o){return o||_(e,0,n,8),i.write(e,t,n,r,52,8),n+8}p.prototype.slice=function(e,t){var n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):n>>8):T(this,e,t,!0),t+2},p.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,2,65535,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},p.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):w(this,e,t,!0),t+4},p.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):w(this,e,t,!1),t+4},p.prototype.writeIntLE=function(e,t,n,r){var o;e=+e,t|=0,r||C(this,e,t,n,(o=Math.pow(2,8*n-1))-1,-o);var i=0,s=1,a=0;for(this[t]=255&e;++i>0)-a&255;return t+n},p.prototype.writeIntBE=function(e,t,n,r){var o;e=+e,t|=0,r||C(this,e,t,n,(o=Math.pow(2,8*n-1))-1,-o);var i=n-1,s=1,a=0;for(this[t+i]=255&e;0<=--i&&(s*=256);)e<0&&0===a&&0!==this[t+i+1]&&(a=1),this[t+i]=(e/s>>0)-a&255;return t+n},p.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,1,127,-128),p.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},p.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):T(this,e,t,!0),t+2},p.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},p.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,4,2147483647,-2147483648),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):w(this,e,t,!0),t+4},p.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||C(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):w(this,e,t,!1),t+4},p.prototype.writeFloatLE=function(e,t,n){return A(this,e,t,!0,n)},p.prototype.writeFloatBE=function(e,t,n){return A(this,e,t,!1,n)},p.prototype.writeDoubleLE=function(e,t,n){return I(this,e,t,!0,n)},p.prototype.writeDoubleBE=function(e,t,n){return I(this,e,t,!1,n)},p.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(a=t;a>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function N(e){return a.toByteArray(function(e){var t;if((e=((t=e).trim?t.trim():t.replace(/^\s+|\s+$/g,"")).replace(R,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function x(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},O("buffer").Buffer)},{"base64-js":78,buffer:80,ieee754:82,isarray:85}],81:[function(e,t,n){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function c(e){return"function"==typeof e}function u(e){return"object"==typeof e&&null!==e}function l(e){return void 0===e}((t.exports=r).EventEmitter=r).prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,o,i,s;if(this._events||(this._events={}),"error"===e&&(!this._events.error||u(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var a=new Error('Uncaught, unspecified "error" event. ('+t+")");throw a.context=t,a}if(l(n=this._events[e]))return!1;if(c(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),n.apply(this,o)}else if(u(n))for(o=Array.prototype.slice.call(arguments,1),r=(s=n.slice()).length,i=0;in&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.once=function(e,t){if(!c(t))throw TypeError("listener must be a function");var n=!1;function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,o,i;if(!c(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(o=(n=this._events[e]).length,r=-1,n===t||c(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(u(n)){for(i=o;0>1,l=-7,p=n?o-1:0,h=n?-1:1,f=e[t+p];for(p+=h,i=f&(1<<-l)-1,f>>=-l,l+=a;0>=-l,l+=r;0>1,h=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,f=r?0:i-1,d=r?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),2<=(t+=1<=s+p?h/c:h*Math.pow(2,1-p))*c&&(s++,c/=2),l<=s+p?(a=0,s=l):1<=s+p?(a=(t*c-1)*Math.pow(2,o),s+=p):(a=t*Math.pow(2,p-1)*Math.pow(2,o),s=0));8<=o;e[n+f]=255&a,f+=d,a/=256,o-=8);for(s=s<":!0,"=":!0,"!":!0},F={" ":!0,"\t":!0,"\n":!0};function j(e){return"0"<=e&&e<="9"||"-"===e}function r(){}r.prototype={tokenize:function(e){var t,n,r,o,i=[];for(this._current=0;this._current"===n?"="===e[this._current]?(this._current++,{type:P,value:">=",start:t}):{type:"GT",value:">",start:t}:"="===n&&"="===e[this._current]?(this._current++,{type:"EQ",value:"==",start:t}):void 0},_consumeLiteral:function(e){this._current++;for(var t=this._current,n=e.length;"`"!==e[this._current]&&this._current= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=v-b,w=Math.floor,_=String.fromCharCode;function A(e){throw new RangeError(p[e])}function f(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function d(e,t){var n=e.split("@"),r="";return 1>>10&1023|55296),e=56320|1023&e),t+=_(e)}).join("")}function k(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function N(e,t,n){var r=0;for(e=n?w(e/a):e>>1,e+=w(e/t);h*E>>1w((y-f)/i))&&A("overflow"),f+=a*i,!(a<(c=s<=g?b:g+E<=s?E:s-g));s+=v)i>w(y/(u=v-c))&&A("overflow"),i*=u;g=N(f-o,t=p.length+1,0==o),w(f/t)>y-d&&A("overflow"),d+=w(f/t),f%=t,p.splice(f++,0,d)}return R(p)}function m(e){for(var t,n,r,o,i,s,a,c,u,l,p,h=[],f=(e=I(e)).length,d=C,g=S,m=t=0;mw((y-t)/(u=n+1))&&A("overflow"),t+=(o-d)*u,d=o,m=0;my&&A("overflow"),c==d){for(i=t,s=v;!(i<(a=s<=g?b:g+E<=s?E:s-g));s+=v)p=i-a,l=v-a,h.push(_(k(a+p%l,0))),i=w(p/l);h.push(_(k(i,0))),g=N(t,u,n==r),t=0,++n}++t,++d}return h.join("")}if(o={version:"1.4.1",ucs2:{decode:I,encode:R},decode:g,encode:m,toASCII:function(e){return d(e,function(e){return u.test(e)?"xn--"+m(e):e})},toUnicode:function(e){return d(e,function(e){return c.test(e)?g(e.slice(4).toLowerCase()):e})}},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return o});else if(t&&n)if(O.exports==t)n.exports=o;else for(i in o)o.hasOwnProperty(i)&&(t[i]=o[i]);else e.punycode=o}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],89:[function(e,t,n){"use strict";t.exports=function(e,t,n,r){t=t||"&",n=n||"=";var o={};if("string"!=typeof e||0===e.length)return o;var i=/\+/g;e=e.split(t);var s=1e3;r&&"number"==typeof r.maxKeys&&(s=r.maxKeys);var a=e.length;0",'"',"`"," ","\r","\n","\t"]),L=["'"].concat(o),P=["%","/","?",";","#"].concat(L),M=["/","?","#"],D=/^[a-z0-9A-Z_-]{0,63}$/,U=/^([a-z0-9A-Z_-]{0,63})(.*)$/,q={javascript:!0,"javascript:":!0},F={javascript:!0,"javascript:":!0},j={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},B=e("querystring");function i(e,t,n){if(e&&a(e)&&e instanceof v)return e;var r=new v;return r.parse(e,t,n),r}function H(e){return"string"==typeof e}function a(e){return"object"==typeof e&&null!==e}function b(e){return null===e}v.prototype.parse=function(e,t,n){if(!H(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var r,o,i=(i=e).trim(),s=O.exec(i);if(s&&(r=(s=s[0]).toLowerCase(),this.protocol=r,i=i.substr(s.length)),(n||s||i.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(o="//"===i.substr(0,2))||s&&F[s]||(i=i.substr(2),this.slashes=!0)),!F[s]&&(o||s&&!j[s])){for(var a,c,u=-1,l=0;l>>((3&t)<<3)&255;return o})},{}],103:[function(e,t,n){var d,g,m=e("./lib/rng"),y=e("./lib/bytesToUuid"),v=0,b=0;t.exports=function(e,t,n){var r,o=t&&n||0,i=t||[],s=(e=e||{}).node||d,a=void 0!==e.clockseq?e.clockseq:g;null!=s&&null!=a||(r=m(),null==s&&(s=d=[1|r[0],r[1],r[2],r[3],r[4],r[5]]),null==a&&(a=g=16383&(r[6]<<8|r[7])));var c=void 0!==e.msecs?e.msecs:(new Date).getTime(),u=void 0!==e.nsecs?e.nsecs:b+1,l=c-v+(u-b)/1e4;if(l<0&&void 0===e.clockseq&&(a=a+1&16383),(l<0||v>>24&255,i[o++]=p>>>16&255,i[o++]=p>>>8&255,i[o++]=255&p;var h=c/4294967296*1e4&268435455;i[o++]=h>>>8&255,i[o++]=255&h,i[o++]=h>>>24&15|16,i[o++]=h>>>16&255,i[o++]=a>>>8|128,i[o++]=255&a;for(var f=0;f<6;++f)i[o+f]=s[f];return t||y(i)}},{"./lib/bytesToUuid":101,"./lib/rng":102}],104:[function(e,t,n){var s=e("./lib/rng"),a=e("./lib/bytesToUuid");t.exports=function(e,t,n){var r=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var o=(e=e||{}).random||(e.rng||s)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t)for(var i=0;i<16;++i)t[r+i]=o[i];return t||a(o)}},{"./lib/bytesToUuid":101,"./lib/rng":102}],105:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e("./utils/LRU"),o=(Object.defineProperty(i.prototype,"size",{get:function(){return this.cache.length},enumerable:!0,configurable:!0}),i.prototype.put=function(e,t){var n="string"!=typeof e?i.getKeyString(e):e,r=this.populateValue(t);this.cache.put(n,r)},i.prototype.get=function(e){var t="string"!=typeof e?i.getKeyString(e):e,n=Date.now(),r=this.cache.get(t);if(r)for(var o=0;o>>=0;break;case"x":n=n.toString(16);break;case"X":n=n.toString(16).toUpperCase()}n=/[def]/.test(o[8])&&o[3]&&0<=n?"+"+n:n,s=o[4]?"0"==o[4]?"0":o[4].charAt(1):" ",a=o[6]-String(n).length,i=o[6]?function(e,t){for(var n=[];0=this._logLevel&&(i[e.level]>=this._echoLevel&&a[e.getLevel()](e.toString()),e.line=this._lineCount++)},u.prototype.clearObjects=function(){for(var e=0;e=connect.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR||e.status===connect.HTTP_STATUS_CODES.TOO_MANY_REQUESTS)?setTimeout(function(){t(--n)},s):o(e)}).catch(function(e){o(e)})}(t)})},connect.backoff=function(r,o,i,s){connect.assertTrue(connect.isFunction(r),"func must be a Function");var a=this;r({success:function(e){s&&s.success&&s.success(e)},failure:function(e,t){var n;0>",e)},u.prototype.getSubscriptions=function(e){return this.subMap.getSubscriptions(e)},u.prototype.trigger=function(t,n){connect.assertNotNull(t,"eventName");var r=this,e=this.subMap.getSubscriptions("<>"),o=this.subMap.getSubscriptions(t);this.logEvents&&t!==connect.EventType.LOG&&t!==connect.EventType.MASTER_RESPONSE&&t!==connect.EventType.API_METRIC&&connect.getLog().trace("Publishing event: %s",t),e.concat(o).forEach(function(e){try{e.f(n||null,t,r)}catch(e){connect.getLog().error("'%s' event handler failed.",t).withException(e)}})},u.prototype.bridge=function(){var n=this;return function(e,t){n.trigger(t,e)}},u.prototype.unsubscribeAll=function(){this.subMap.getAllSubscriptions().forEach(function(e){e.unsubscribe()})},connect.EventBus=u,connect.EventFactory=e,connect.EventType=t,connect.AgentEvents=r,connect.ConnnectionEvents=s,connect.ContactEvents=i,connect.WebSocketEvents=o,connect.MasterTopics=n}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect;function r(){}r.prototype.send=function(e){throw new connect.NotImplementedError},r.prototype.onMessage=function(e){throw new connect.NotImplementedError};function o(){r.call(this)}((o.prototype=Object.create(r.prototype)).constructor=o).prototype.onMessage=function(e){},o.prototype.send=function(e){};function e(e,t){r.call(this),this.window=e,this.domain=t||"*"}((e.prototype=Object.create(r.prototype)).constructor=e).prototype.send=function(e){this.window.postMessage(e,this.domain)},e.prototype.onMessage=function(e){this.window.addEventListener("message",e)};function i(e,t,n){r.call(this),this.input=e,this.output=t,this.domain=n||"*"}((i.prototype=Object.create(r.prototype)).constructor=i).prototype.send=function(e){this.output.postMessage(e,this.domain)},i.prototype.onMessage=function(e){this.input.addEventListener("message",e)};function t(e){r.call(this),this.port=e,this.id=connect.randomId()}((t.prototype=Object.create(r.prototype)).constructor=t).prototype.send=function(e){this.port.postMessage(e)},t.prototype.onMessage=function(e){this.port.addEventListener("message",e)},t.prototype.getId=function(){return this.id};function n(e){r.call(this),this.streamMap=e?connect.index(e,function(e){return e.getId()}):{},this.messageListeners=[]}((n.prototype=Object.create(r.prototype)).constructor=n).prototype.send=function(t){this.getStreams().forEach(function(e){try{e.send(t)}catch(e){}})},n.prototype.onMessage=function(t){this.messageListeners.push(t),this.getStreams().forEach(function(e){e.onMessage(t)})},n.prototype.addStream=function(t){this.streamMap[t.getId()]=t,this.messageListeners.forEach(function(e){t.onMessage(e)})},n.prototype.removeStream=function(e){delete this.streamMap[e.getId()]},n.prototype.getStreams=function(e){return connect.values(this.streamMap)},n.prototype.getStreamForPort=function(t){return connect.find(this.getStreams(),function(e){return e.port===t})};function s(e,t,n){this.name=e,this.upstream=t||new o,this.downstream=n||new o,this.downstreamBus=new connect.EventBus,this.upstreamBus=new connect.EventBus,this.upstream.onMessage(connect.hitch(this,this._dispatchEvent,this.upstreamBus)),this.downstream.onMessage(connect.hitch(this,this._dispatchEvent,this.downstreamBus))}s.prototype.onUpstream=function(e,t){return connect.assertNotNull(e,"eventName"),connect.assertNotNull(t,"f"),connect.assertTrue(connect.isFunction(t),"f must be a function"),this.upstreamBus.subscribe(e,t)},s.prototype.onAllUpstream=function(e){return connect.assertNotNull(e,"f"),connect.assertTrue(connect.isFunction(e),"f must be a function"),this.upstreamBus.subscribeAll(e)},s.prototype.onDownstream=function(e,t){return connect.assertNotNull(e,"eventName"),connect.assertNotNull(t,"f"),connect.assertTrue(connect.isFunction(t),"f must be a function"),this.downstreamBus.subscribe(e,t)},s.prototype.onAllDownstream=function(e){return connect.assertNotNull(e,"f"),connect.assertTrue(connect.isFunction(e),"f must be a function"),this.downstreamBus.subscribeAll(e)},s.prototype.sendUpstream=function(e,t){connect.assertNotNull(e,"eventName"),this.upstream.send({event:e,data:t})},s.prototype.sendDownstream=function(e,t){connect.assertNotNull(e,"eventName"),this.downstream.send({event:e,data:t})},s.prototype._dispatchEvent=function(e,t){var n=t.data;n.event&&e.trigger(n.event,n.data)},s.prototype.passUpstream=function(){var n=this;return function(e,t){n.upstream.send({event:t,data:e})}},s.prototype.passDownstream=function(){var n=this;return function(e,t){n.downstream.send({event:t,data:e})}},s.prototype.shutdown=function(){this.upstreamBus.unsubscribeAll(),this.downstreamBus.unsubscribeAll()};function a(e,t,n,r){s.call(this,e,new i(t,n.contentWindow,r||"*"),null)}(a.prototype=Object.create(s.prototype)).constructor=a,connect.Stream=r,connect.NullStream=o,connect.WindowStream=e,connect.WindowIOStream=i,connect.PortStream=t,connect.StreamMultiplexer=n,connect.Conduit=s,connect.IFrameConduit=a}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect,connect.ClientMethods=connect.makeEnum(["getAgentSnapshot","putAgentState","getAgentStates","getDialableCountryCodes","getRoutingProfileQueues","getAgentPermissions","getAgentConfiguration","updateAgentConfiguration","acceptContact","createOutboundContact","completeContact","destroyContact","notifyContactIssue","updateContactAttributes","createAdditionalConnection","destroyConnection","holdConnection","resumeConnection","toggleActiveConnections","conferenceConnections","sendClientLogs","sendDigits","sendSoftphoneCallReport","sendSoftphoneCallMetrics","getEndpoints","getNewAuthToken","createTransport"]),connect.MasterMethods=connect.makeEnum(["becomeMaster","checkMaster"]);function i(){}i.EMPTY_CALLBACKS={success:function(){},failure:function(){}},i.prototype.call=function(e,t,n){connect.assertNotNull(e,"method");var r=t||{},o=n||i.EMPTY_CALLBACKS;this._callImpl(e,r,o)},i.prototype._callImpl=function(e,t,n){throw new connect.NotImplementedError};function e(){i.call(this)}((e.prototype=Object.create(i.prototype)).constructor=e).prototype._callImpl=function(e,t,n){var r;n&&n.failure&&(r=connect.sprintf("No such method exists on NULL client: %s",e),n.failure(new connect.ValueError(r),{message:r}))};function t(e,t,n){i.call(this),this.conduit=e,this.requestEvent=t,this.responseEvent=n,this._requestIdCallbacksMap={},this.conduit.onUpstream(n,connect.hitch(this,this._handleResponse))}((t.prototype=Object.create(i.prototype)).constructor=t).prototype._callImpl=function(e,t,n){var r=connect.EventFactory.createRequest(this.requestEvent,e,t);this._requestIdCallbacksMap[r.requestId]=n,this.conduit.sendUpstream(r.event,r)},t.prototype._getCallbacksForRequest=function(e){var t=this._requestIdCallbacksMap[e]||null;return null!=t&&delete this._requestIdCallbacksMap[e],t},t.prototype._handleResponse=function(e){var t=this._getCallbacksForRequest(e.requestId);null!=t&&(e.err&&t.failure?t.failure(e.err,e.data):t.success&&t.success(e.data))};function n(e){t.call(this,e,connect.EventType.API_REQUEST,connect.EventType.API_RESPONSE)}(n.prototype=Object.create(t.prototype)).constructor=n;function r(e){t.call(this,e,connect.EventType.MASTER_REQUEST,connect.EventType.MASTER_RESPONSE)}(r.prototype=Object.create(t.prototype)).constructor=r;function o(e,t,n){connect.assertNotNull(e,"authToken"),connect.assertNotNull(t,"region"),i.call(this),AWS.config.credentials=new AWS.Credentials({}),AWS.config.region=t,this.authToken=e;var r=n||connect.getBaseUrl()+"/connect/api",o=new AWS.Endpoint(r);this.client=new AWS.Connect({endpoint:o})}((o.prototype=Object.create(i.prototype)).constructor=o).prototype._callImpl=function(r,e,o){var t,n=this,i=connect.getLog();connect.contains(this.client,r)?(e=this._translateParams(r,e),i.trace("AWSClient: --\x3e Calling operation '%s'",r),this.client[r](e).on("build",function(e){e.httpRequest.headers["X-Amz-Bearer"]=n.authToken}).send(function(e,t){try{var n;e?(e.code===connect.CTIExceptions.UNAUTHORIZED_EXCEPTION?o.authFailure():!o.accessDenied||e.code!==connect.CTIExceptions.ACCESS_DENIED_EXCEPTION&&403!==e.statusCode?((n={}).type=e.code,n.message=e.message,n.stack=e.stack?e.stack.split("\n"):[],o.failure(n,t)):o.accessDenied(),i.trace("AWSClient: <-- Operation '%s' failed: %s",r,JSON.stringify(e))):(i.trace("AWSClient: <-- Operation '%s' succeeded.",r).withObject(t),o.success(t))}catch(e){connect.getLog().error("Failed to handle AWS API request for method %s",r).withException(e)}})):(t=connect.sprintf("No such method exists on AWS client: %s",r),o.failure(new connect.ValueError(t),{message:t}))},o.prototype._requiresAuthenticationParam=function(e){return e!==connect.ClientMethods.COMPLETE_CONTACT},o.prototype._translateParams=function(e,t){switch(e){case connect.ClientMethods.UPDATE_AGENT_CONFIGURATION:t.configuration=this._translateAgentConfiguration(t.configuration);break;case connect.ClientMethods.SEND_SOFTPHONE_CALL_METRICS:t.softphoneStreamStatistics=this._translateSoftphoneStreamStatistics(t.softphoneStreamStatistics);break;case connect.ClientMethods.SEND_SOFTPHONE_CALL_REPORT:t.report=this._translateSoftphoneCallReport(t.report)}return this._requiresAuthenticationParam(e)&&(t.authentication={authToken:this.authToken}),t},o.prototype._translateAgentConfiguration=function(e){return{name:e.name,softphoneEnabled:e.softphoneEnabled,softphoneAutoAccept:e.softphoneAutoAccept,extension:e.extension,routingProfile:this._translateRoutingProfile(e.routingProfile),agentPreferences:e.agentPreferences}},o.prototype._translateRoutingProfile=function(e){return{name:e.name,routingProfileARN:e.routingProfileARN,defaultOutboundQueue:this._translateQueue(e.defaultOutboundQueue)}},o.prototype._translateQueue=function(e){return{queueARN:e.queueARN,name:e.name}},o.prototype._translateSoftphoneStreamStatistics=function(e){return e.forEach(function(e){"packetsCount"in e&&(e.packetCount=e.packetsCount,delete e.packetsCount)}),e},o.prototype._translateSoftphoneCallReport=function(e){return"handshakingTimeMillis"in e&&(e.handshakeTimeMillis=e.handshakingTimeMillis,delete e.handshakingTimeMillis),"preTalkingTimeMillis"in e&&(e.preTalkTimeMillis=e.preTalkingTimeMillis,delete e.preTalkingTimeMillis),"handshakingFailure"in e&&(e.handshakeFailure=e.handshakingFailure,delete e.handshakingFailure),"talkingTimeMillis"in e&&(e.talkTimeMillis=e.talkingTimeMillis,delete e.talkingTimeMillis),e.softphoneStreamStatistics=this._translateSoftphoneStreamStatistics(e.softphoneStreamStatistics),e},connect.ClientBase=i,connect.NullClient=e,connect.UpstreamConduitClient=n,connect.UpstreamConduitMasterClient=r,connect.AWSClient=o}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect;function r(e,t){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),this.fromState=e,this.toState=t}r.prototype.getAssociations=function(e){throw connect.NotImplementedError()},r.prototype.getFromState=function(){return this.fromState},r.prototype.getToState=function(){return this.toState};function e(e,t,n){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),connect.assertNotNull(n,"associations"),r.call(this,e,t),this.associations=n}((e.prototype=Object.create(r.prototype)).constructor=e).prototype.getAssociations=function(e){return this.associations};function i(e,t,n){connect.assertNotNull(e,"fromState"),connect.assertNotNull(t,"toState"),connect.assertNotNull(n,"closure"),connect.assertTrue(connect.isFunction(n),"closure must be a function"),r.call(this,e,t),this.closure=n}((i.prototype=Object.create(r.prototype)).constructor=i).prototype.getAssociations=function(e){return this.closure(e,this.getFromState(),this.getToState())};function s(){this.fromMap={}}s.ANY="<>",s.prototype.assoc=function(t,n,r){var o=this;if(!t)throw new Error("fromStateObj is not defined.");if(!n)throw new Error("toStateObj is not defined.");if(!r)throw new Error("assocObj is not defined.");return t instanceof Array?t.forEach(function(e){o.assoc(e,n,r)}):n instanceof Array?n.forEach(function(e){o.assoc(t,e,r)}):"function"==typeof r?this._addAssociation(new i(t,n,r)):r instanceof Array?this._addAssociation(new e(t,n,r)):this._addAssociation(new e(t,n,[r])),this},s.prototype.getAssociations=function(e,t,n){connect.assertNotNull(t,"fromState"),connect.assertNotNull(n,"toState");var r=[],o=this.fromMap[s.ANY]||{},i=this.fromMap[t]||{};return r=(r=r.concat(this._getAssociationsFromMap(o,e,t,n))).concat(this._getAssociationsFromMap(i,e,t,n))},s.prototype._addAssociation=function(e){var t=this.fromMap[e.getFromState()];((t=t||(this.fromMap[e.getFromState()]={}))[e.getToState()]||(t[e.getToState()]=[])).push(e)},s.prototype._getAssociationsFromMap=function(e,n,t,r){return(e[s.ANY]||[]).concat(e[r]||[]).reduce(function(e,t){return e.concat(t.getAssociations(n))},[])},connect.EventGraph=s}(),function(){connect=this.connect||{},this.connect=connect,this.lily=connect,connect.AgentStateType=connect.makeEnum(["init","routable","not_routable","offline"]),connect.AgentStatusType=connect.AgentStateType,connect.AgentAvailStates=connect.makeEnum(["Init","Busy","AfterCallWork","CallingCustomer","Dialing","Joining","PendingAvailable","PendingBusy"]),connect.AgentErrorStates=connect.makeEnum(["Error","AgentHungUp","BadAddressAgent","BadAddressCustomer","Default","FailedConnectAgent","FailedConnectCustomer","LineEngagedAgent","LineEngagedCustomer","MissedCallAgent","MissedCallCustomer","MultipleCcpWindows","RealtimeCommunicationError"]),connect.EndpointType=connect.makeEnum(["phone_number","agent","queue"]),connect.AddressType=connect.EndpointType,connect.ConnectionType=connect.makeEnum(["agent","inbound","outbound","monitoring"]),connect.ConnectionStateType=connect.makeEnum(["init","connecting","connected","hold","disconnected"]),connect.ConnectionStatusType=connect.ConnectionStateType,connect.CONNECTION_ACTIVE_STATES=connect.set([connect.ConnectionStateType.CONNECTING,connect.ConnectionStateType.CONNECTED,connect.ConnectionStateType.HOLD]),connect.ContactStateType=connect.makeEnum(["init","incoming","pending","connecting","connected","missed","error","ended"]),connect.ContactStatusType=connect.ContactStateType,connect.CONTACT_ACTIVE_STATES=connect.makeEnum(["incoming","pending","connecting","connected"]),connect.ContactType=connect.makeEnum(["voice","queue_callback","chat"]),connect.ChannelType=connect.makeEnum(["VOICE","CHAT"]),connect.MediaType=connect.makeEnum(["softphone","chat"]),connect.SoftphoneCallType=connect.makeEnum(["audio_video","video_only","audio_only","none"]),connect.SoftphoneErrorTypes=connect.makeEnum(["unsupported_browser","microphone_not_shared","signalling_handshake_failure","signalling_connection_failure","ice_collection_timeout","user_busy_error","webrtc_error","realtime_communication_error","other"]),connect.CTIExceptions=connect.makeEnum(["AccessDeniedException","InvalidStateException","BadEndpointException","InvalidAgentARNException","InvalidConfigurationException","InvalidContactTypeException","PaginationException","RefreshTokenExpiredException","SendDataFailedException","UnauthorizedException"]);function e(){if(!connect.agent.initialized)throw new connect.StateError("The agent is not yet initialized!")}e.prototype._getData=function(){return connect.core.getAgentDataProvider().getAgentData()},e.prototype._createContactAPI=function(e){return new connect.Contact(e.contactId)},e.prototype.onContactPending=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.CONTACT_PENDING,e)},e.prototype.onRefresh=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.REFRESH,e)},e.prototype.onRoutable=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ROUTABLE,e)},e.prototype.onNotRoutable=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.NOT_ROUTABLE,e)},e.prototype.onOffline=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.OFFLINE,e)},e.prototype.onError=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ERROR,e)},e.prototype.onSoftphoneError=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.SOFTPHONE_ERROR,e)},e.prototype.onAfterCallWork=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.ACW,e)},e.prototype.onStateChange=function(e){connect.core.getEventBus().subscribe(connect.AgentEvents.STATE_CHANGE,e)},e.prototype.onMuteToggle=function(e){connect.core.getUpstream().onUpstream(connect.AgentEvents.MUTE_TOGGLE,e)},e.prototype.mute=function(){connect.core.getUpstream().sendUpstream(connect.EventType.BROADCAST,{event:connect.EventType.MUTE,data:{mute:!0}})},e.prototype.unmute=function(){connect.core.getUpstream().sendUpstream(connect.EventType.BROADCAST,{event:connect.EventType.MUTE,data:{mute:!1}})},e.prototype.getStatus=e.prototype.getState=function(){return this._getData().snapshot.state},e.prototype.getStatusDuration=e.prototype.getStateDuration=function(){return connect.now()-this._getData().snapshot.state.startTimestamp.getTime()+connect.core.getSkew()},e.prototype.getPermissions=function(){return this.getConfiguration().permissions},e.prototype.getContacts=function(t){var n=this;return this._getData().snapshot.contacts.map(function(e){return n._createContactAPI(e)}).filter(function(e){return!t||e.getType()===t})},e.prototype.getConfiguration=function(){return this._getData().configuration},e.prototype.getAgentStates=function(){return this.getConfiguration().agentStates},e.prototype.getRoutingProfile=function(){return this.getConfiguration().routingProfile},e.prototype.getChannelConcurrency=function(e){var t=(t=this.getRoutingProfile().channelConcurrencyMap)||Object.keys(connect.ChannelType).reduce(function(e,t){return e[connect.ChannelType[t]]=1,e},{});return e?t[e]||0:t},e.prototype.getName=function(){return this.getConfiguration().name},e.prototype.getExtension=function(){return this.getConfiguration().extension},e.prototype.getDialableCountries=function(){return this.getConfiguration().dialableCountries},e.prototype.isSoftphoneEnabled=function(){return this.getConfiguration().softphoneEnabled},e.prototype.setConfiguration=function(e,t){connect.core.getClient().call(connect.ClientMethods.UPDATE_AGENT_CONFIGURATION,{configuration:connect.assertNotNull(e,"configuration")},{success:function(e){connect.core.getUpstream().sendUpstream(connect.EventType.RELOAD_AGENT_CONFIGURATION),t.success&&t.success(e)},failure:t&&t.failure})},e.prototype.setStatus=e.prototype.setState=function(e,t){connect.core.getClient().call(connect.ClientMethods.PUT_AGENT_STATE,{state:connect.assertNotNull(e,"state")},t)},e.prototype.connect=function(e,t){var n=connect.core.getClient(),r=new connect.Endpoint(e);delete r.endpointId,n.call(connect.ClientMethods.CREATE_OUTBOUND_CONTACT,{endpoint:connect.assertNotNull(r,"endpoint"),queueARN:t&&(t.queueARN||t.queueId)||this.getRoutingProfile().defaultOutboundQueue.queueARN},t&&{success:t.success,failure:t.failure})},e.prototype.getAllQueueARNs=function(){return this.getConfiguration().routingProfile.queues.map(function(e){return e.queueARN})},e.prototype.getAddresses=e.prototype.getEndpoints=function(n,r,e){var o=this,t=connect.core.getClient();connect.assertNotNull(r,"callbacks"),connect.assertNotNull(r.success,"callbacks.success");var i=e||{};i.endpoints=i.endpoints||[],i.maxResults=i.maxResults||connect.DEFAULT_BATCH_SIZE,connect.isArray(n)||(n=[n]),t.call(connect.ClientMethods.GET_ENDPOINTS,{queueARNs:n,nextToken:i.nextToken||null,maxResults:i.maxResults},{success:function(e){var t;e.nextToken?o.getEndpoints(n,r,{nextToken:e.nextToken,maxResults:i.maxResults,endpoints:i.endpoints.concat(e.endpoints)}):(i.endpoints=i.endpoints.concat(e.endpoints),t=i.endpoints.map(function(e){return new connect.Endpoint(e)}),r.success({endpoints:t,addresses:t}))},failure:r.failure})},e.prototype.toSnapshot=function(){return new connect.AgentSnapshot(this._getData())};function t(e){connect.Agent.call(this),this.agentData=e}((t.prototype=Object.create(e.prototype)).constructor=t).prototype._getData=function(){return this.agentData},t.prototype._createContactAPI=function(e){return new connect.ContactSnapshot(e)};function n(e){this.contactId=e}n.prototype._getData=function(){return connect.core.getAgentDataProvider().getContactData(this.getContactId())},n.prototype._createConnectionAPI=function(e){return this.getType()===connect.ContactType.CHAT?new connect.ChatConnection(this.contactId,e.connectionId):new connect.VoiceConnection(this.contactId,e.connectionId)},n.prototype.getEventName=function(e){return connect.core.getContactEventName(e,this.getContactId())},n.prototype.onRefresh=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.REFRESH),e)},n.prototype.onIncoming=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.INCOMING),e)},n.prototype.onConnecting=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.CONNECTING),e)},n.prototype.onPending=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.PENDING),e)},n.prototype.onAccepted=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.ACCEPTED),e)},n.prototype.onMissed=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.MISSED),e)},n.prototype.onEnded=function(e){var t=connect.core.getEventBus();t.subscribe(this.getEventName(connect.ContactEvents.ENDED),e),t.subscribe(this.getEventName(connect.ContactEvents.DESTROYED),e)},n.prototype.onDestroy=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.DESTROYED),e)},n.prototype.onACW=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.ACW),e)},n.prototype.onConnected=function(e){connect.core.getEventBus().subscribe(this.getEventName(connect.ContactEvents.CONNECTED),e)},n.prototype.getContactId=function(){return this.contactId},n.prototype.getInitialContactId=n.prototype.getOriginalContactId=function(){return this._getData().initialContactId},n.prototype.getType=function(){return this._getData().type},n.prototype.getContactDuration=function(){return this._getData().contactDuration},n.prototype.getStatus=n.prototype.getState=function(){return this._getData().state},n.prototype.getStatusDuration=n.prototype.getStateDuration=function(){return connect.now()-this._getData().state.timestamp.getTime()+connect.core.getSkew()},n.prototype.getQueue=function(){return this._getData().queue},n.prototype.getQueueTimestamp=function(){return this._getData().queueTimestamp},n.prototype.getConnections=function(){var t=this;return this._getData().connections.map(function(e){return t.getType()===connect.ContactType.CHAT?new connect.ChatConnection(t.contactId,e.connectionId):new connect.VoiceConnection(t.contactId,e.connectionId)})},n.prototype.getInitialConnection=function(){return connect.find(this.getConnections(),function(e){return e.isInitialConnection()})||null},n.prototype.getActiveInitialConnection=function(){var e=this.getInitialConnection();return null!=e&&e.isActive()?e:null},n.prototype.getThirdPartyConnections=function(){return this.getConnections().filter(function(e){return!e.isInitialConnection()&&e.getType()!==connect.ConnectionType.AGENT})},n.prototype.getSingleActiveThirdPartyConnection=function(){return this.getThirdPartyConnections().filter(function(e){return e.isActive()})[0]||null},n.prototype.getAgentConnection=function(){return connect.find(this.getConnections(),function(e){var t=e.getType();return t===connect.ConnectionType.AGENT||t===connect.ConnectionType.MONITORING})},n.prototype.getAttributes=function(){return this._getData().attributes},n.prototype.isSoftphoneCall=function(){return null!=connect.find(this.getConnections(),function(e){return null!=e.getSoftphoneMediaInfo()})},n.prototype.isInbound=function(){var e=this.getInitialConnection();return!!e&&e.getType()===connect.ConnectionType.INBOUND},n.prototype.isConnected=function(){return this.getStatus().type===connect.ContactStateType.CONNECTED},n.prototype.accept=function(n){var e=connect.core.getClient(),r=this;e.call(connect.ClientMethods.ACCEPT_CONTACT,{contactId:this.getContactId()},{success:function(e){var t=connect.core.getUpstream();t.sendUpstream(connect.EventType.BROADCAST,{event:connect.ContactEvents.ACCEPTED}),t.sendUpstream(connect.EventType.BROADCAST,{event:connect.core.getContactEventName(connect.ContactEvents.ACCEPTED,r.getContactId())}),n&&n.success&&n.success(e)},failure:n?n.failure:null})},n.prototype.destroy=function(e){connect.core.getClient().call(connect.ClientMethods.DESTROY_CONTACT,{contactId:this.getContactId()},e)},n.prototype.complete=function(e){connect.core.getClient().call(connect.ClientMethods.COMPLETE_CONTACT,{contactId:this.getContactId()},e)},n.prototype.notifyIssue=function(e,t,n){connect.core.getClient().call(connect.ClientMethods.NOTIFY_CONTACT_ISSUE,{contactId:this.getContactId(),issueCode:e,description:t},n)},n.prototype.addConnection=function(e,t){var n=connect.core.getClient(),r=new connect.Endpoint(e);delete r.endpointId,n.call(connect.ClientMethods.CREATE_ADDITIONAL_CONNECTION,{contactId:this.getContactId(),endpoint:r},t)},n.prototype.toggleActiveConnections=function(e){var t,n=connect.core.getClient(),r=null,o=connect.find(this.getConnections(),function(e){return e.getStatus().type===connect.ConnectionStateType.HOLD});null!=o?r=o.getConnectionId():0<(t=this.getConnections().filter(function(e){return e.isActive()})).length&&(r=t[0].getConnectionId()),n.call(connect.ClientMethods.TOGGLE_ACTIVE_CONNECTIONS,{contactId:this.getContactId(),connectionId:r},e)},n.prototype.sendSoftphoneMetrics=function(e,t){connect.core.getClient().call(connect.ClientMethods.SEND_SOFTPHONE_CALL_METRICS,{contactId:this.getContactId(),softphoneStreamStatistics:e},t)},n.prototype.sendSoftphoneReport=function(e,t){connect.core.getClient().call(connect.ClientMethods.SEND_SOFTPHONE_CALL_REPORT,{contactId:this.getContactId(),report:e},t)},n.prototype.conferenceConnections=function(e){connect.core.getClient().call(connect.ClientMethods.CONFERENCE_CONNECTIONS,{contactId:this.getContactId()},e)},n.prototype.toSnapshot=function(){return new connect.ContactSnapshot(this._getData())};function r(e){connect.Contact.call(this,e.contactId),this.contactData=e}((r.prototype=Object.create(n.prototype)).constructor=r).prototype._getData=function(){return this.contactData},r.prototype._createConnectionAPI=function(e){return new connect.ConnectionSnapshot(e)};function o(e,t){this.contactId=e,this.connectionId=t,this._initMediaController()}o.prototype._getData=function(){return connect.core.getAgentDataProvider().getConnectionData(this.getContactId(),this.getConnectionId())},o.prototype.getContactId=function(){return this.contactId},o.prototype.getConnectionId=function(){return this.connectionId},o.prototype.getAddress=o.prototype.getEndpoint=function(){return new connect.Endpoint(this._getData().endpoint)},o.prototype.getStatus=o.prototype.getState=function(){return this._getData().state},o.prototype.getStatusDuration=o.prototype.getStateDuration=function(){return connect.now()-this._getData().state.timestamp.getTime()+connect.core.getSkew()},o.prototype.getType=function(){return this._getData().type},o.prototype.isInitialConnection=function(){return this._getData().initial},o.prototype.isActive=function(){return connect.contains(connect.CONNECTION_ACTIVE_STATES,this.getStatus().type)},o.prototype.isConnected=function(){return this.getStatus().type===connect.ConnectionStateType.CONNECTED},o.prototype.isConnecting=function(){return this.getStatus().type===connect.ConnectionStateType.CONNECTING},o.prototype.isOnHold=function(){return this.getStatus().type===connect.ConnectionStateType.HOLD},o.prototype.getSoftphoneMediaInfo=function(){return this._getData().softphoneMediaInfo},o.prototype.getMonitorInfo=function(){return this._getData().monitoringInfo},o.prototype.destroy=function(e){connect.core.getClient().call(connect.ClientMethods.DESTROY_CONNECTION,{contactId:this.getContactId(),connectionId:this.getConnectionId()},e)},o.prototype.sendDigits=function(e,t){connect.core.getClient().call(connect.ClientMethods.SEND_DIGITS,{contactId:this.getContactId(),connectionId:this.getConnectionId(),digits:e},t)},o.prototype.hold=function(e){connect.core.getClient().call(connect.ClientMethods.HOLD_CONNECTION,{contactId:this.getContactId(),connectionId:this.getConnectionId()},e)},o.prototype.resume=function(e){connect.core.getClient().call(connect.ClientMethods.RESUME_CONNECTION,{contactId:this.getContactId(),connectionId:this.getConnectionId()},e)},o.prototype.toSnapshot=function(){return new connect.ConnectionSnapshot(this._getData())},o.prototype._initMediaController=function(){this.getMediaInfo()&&connect.core.mediaFactory.get(this).catch(function(){})},o.prototype._isAgentConnectionType=function(){var e=this.getType();return e===connect.ConnectionType.AGENT||e===connect.ConnectionType.MONITORING},o.prototype._isAgentConnectionType=function(){var e=this.getType();return e===connect.ConnectionType.AGENT||e===connect.ConnectionType.MONITORING};function i(e,t){o.call(this,e,t)}((i.prototype=Object.create(o.prototype)).constructor=i).prototype.getSoftphoneMediaInfo=function(){return this._getData().softphoneMediaInfo},i.prototype.getMediaInfo=function(){return this._getData().softphoneMediaInfo},i.prototype.getMediaType=function(){return connect.MediaType.SOFTPHONE},i.prototype.getMediaController=function(){return connect.core.mediaFactory.get(this)};function s(e,t){o.call(this,e,t)}((s.prototype=Object.create(o.prototype)).constructor=s).prototype.getMediaInfo=function(){var t=this._getData().chatMediaInfo;if(t){var e=connect.core.getAgentDataProvider().getContactData(this.contactId),n={contactId:this.contactId,initialContactId:e.initialContactId||this.contactId,participantId:this.connectionId,getConnectionToken:connect.hitch(this,this.getConnectionToken)};if(t.connectionData)try{n.participantToken=JSON.parse(t.connectionData).ConnectionAuthenticationToken}catch(e){connect.getLog().error(connect.LogComponent.CHAT,"Connection data is invalid").withObject(t).withException(e),n.participantToken=null}return n.participantToken=n.participantToken||null,n.originalInfo=this._getData().chatMediaInfo,n}return null},s.prototype.getConnectionToken=function(){client=connect.core.getClient();var e=connect.core.getAgentDataProvider().getContactData(this.contactId),r={transportType:connect.TRANSPORT_TYPES.CHAT_TOKEN,participantId:this.connectionId,contactId:e.initialContactId||this.contactId};return new Promise(function(t,n){client.call(connect.ClientMethods.CREATE_TRANSPORT,r,{success:function(e){connect.getLog().info("getConnectionToken succeeded"),t(e)},failure:function(e,t){connect.getLog().error("getConnectionToken failed").withObject({err:e,data:t}),n(Error("getConnectionToken failed"))}})})},s.prototype.getMediaType=function(){return connect.MediaType.CHAT},s.prototype.getMediaController=function(){return connect.core.mediaFactory.get(this)},s.prototype._initMediaController=function(){this._isAgentConnectionType()&&connect.core.mediaFactory.get(this).catch(function(){})};function a(e){connect.Connection.call(this,e.contactId,e.connectionId),this.connectionData=e}((a.prototype=Object.create(o.prototype)).constructor=a).prototype._getData=function(){return this.connectionData},a.prototype._initMediaController=function(){};function c(e){var t=e||{};this.endpointARN=t.endpointId||t.endpointARN||null,this.endpointId=this.endpointARN,this.type=t.type||null,this.name=t.name||null,this.phoneNumber=t.phoneNumber||null,this.agentLogin=t.agentLogin||null,this.queue=t.queue||null}c.prototype.stripPhoneNumber=function(){return this.phoneNumber?this.phoneNumber.replace(/sip:([^@]*)@.*/,"$1"):""},c.byPhoneNumber=function(e,t){return new c({type:connect.EndpointType.PHONE_NUMBER,phoneNumber:e,name:t||null})};function u(e,t,n){this.errorType=e,this.errorMessage=t,this.endPointUrl=n}u.prototype.getErrorType=function(){return this.errorType},u.prototype.getErrorMessage=function(){return this.errorMessage},u.prototype.getEndPointUrl=function(){return this.endPointUrl},connect.agent=function(e){var t=connect.core.getEventBus().subscribe(connect.AgentEvents.INIT,e);return connect.agent.initialized&&e(new connect.Agent),t},connect.agent.initialized=!1,connect.contact=function(e){return connect.core.getEventBus().subscribe(connect.ContactEvents.INIT,e)},connect.ifMaster=function(e,t,n){if(connect.assertNotNull(e,"A topic must be provided."),connect.assertNotNull(t,"A true callback must be provided."),!connect.core.masterClient)return connect.getLog().warn("We can't be the master for topic '%s' because there is no master client!",e),void(n&&n());connect.core.getMasterClient().call(connect.MasterMethods.CHECK_MASTER,{topic:e},{success:function(e){e.isMaster?t():n&&n()}})},connect.becomeMaster=function(e){connect.assertNotNull(e,"A topic must be provided."),connect.core.getMasterClient().call(connect.MasterMethods.BECOME_MASTER,{topic:e})},connect.Agent=e,connect.AgentSnapshot=t,connect.Contact=n,connect.ContactSnapshot=r,connect.Connection=i,connect.BaseConnection=o,connect.VoiceConnection=i,connect.ChatConnection=s,connect.ConnectionSnapshot=a,connect.Endpoint=c,connect.Address=c,connect.SoftphoneError=u}(),function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)o.d(n,r,function(e){return t[e]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=2)}([function(e,t,n){"use strict";var r=n(1);function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i={assertTrue:function(e,t){if(!e)throw new Error(t)},assertNotNull:function(e,t){return i.assertTrue(null!==e&&void 0!==o(e),Object(r.sprintf)("%s must be provided",t||"A value")),e},isNonEmptyString:function(e){return"string"==typeof e&&0=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var t=e.prefix||"";return"DEBUG"===this._logsDestination?this.consoleLoggerWrapper:new y(t)}},{key:"updateLoggerConfig",value:function(e){var t=e||{};this._level=t.level||d.DEBUG,this._clientLogger=t.logger||null,this._logsDestination="NULL",t.debug&&(this._logsDestination="DEBUG"),t.logger&&(this._logsDestination="CLIENT_LOGGER")}}]),S),m=(h(E,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),E),y=(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(b,m),h(b,[{key:"debug",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n>>0).toString(8);break;case"s":n=String(n),n=o.precision?n.substring(0,o.precision):n;break;case"t":n=String(!!n),n=o.precision?n.substring(0,o.precision):n;break;case"T":n=Object.prototype.toString.call(n).slice(8,-1).toLowerCase(),n=o.precision?n.substring(0,o.precision):n;break;case"u":n=parseInt(n,10)>>>0;break;case"v":n=n.valueOf(),n=o.precision?n.substring(0,o.precision):n;break;case"x":n=(parseInt(n,10)>>>0).toString(16);break;case"X":n=(parseInt(n,10)>>>0).toString(16).toUpperCase()}d.json.test(o.type)?h+=n:(!d.number.test(o.type)||c&&!o.sign?u="":(u=c?"+":"-",n=n.toString().replace(d.sign,"")),s=o.pad_char?"0"===o.pad_char?"0":o.pad_char.charAt(1):" ",a=o.width-(u+n).length,i=o.width&&0t.packetsLost?e.packetsLost-t.packetsLost:0,o=e.packetsCount>t.packetsCount?e.packetsCount-t.packetsCount:0;return new O(e.timestamp,r,o,n,e.audioLevel,e.jbMilliseconds,e.rttMilliseconds)}return new O(e.timestamp,e.packetsLost,e.packetsCount,n,e.audioLevel,e.jbMilliseconds,e.rttMilliseconds)},x=function(e,t){u=r(u),l=r(l),function(e,t,n,r){t.streamStats=[L(n,i),L(r,s)];var o={callStartTime:t.sessionStartTime,callEndTime:t.sessionEndTime,gumTimeMillis:t.gumTimeMillis,initializationTimeMillis:t.initializationTimeMillis,iceCollectionTimeMillis:t.iceCollectionTimeMillis,signallingConnectTimeMillis:t.signallingConnectTimeMillis,handshakingTimeMillis:t.handshakingTimeMillis,preTalkingTimeMillis:t.preTalkingTimeMillis,talkingTimeMillis:t.talkingTimeMillis,cleanupTimeMillis:t.cleanupTimeMillis,iceCollectionFailure:t.iceCollectionFailure,signallingConnectionFailure:t.signallingConnectionFailure,handshakingFailure:t.handshakingFailure,gumOtherFailure:t.gumOtherFailure,gumTimeoutFailure:t.gumTimeoutFailure,createOfferFailure:t.createOfferFailure,setLocalDescriptionFailure:t.setLocalDescriptionFailure,userBusyFailure:t.userBusyFailure,invalidRemoteSDPFailure:t.invalidRemoteSDPFailure,noRemoteIceCandidateFailure:t.noRemoteIceCandidateFailure,setRemoteDescriptionFailure:t.setRemoteDescriptionFailure,softphoneStreamStatistics:t.streamStats};e.sendSoftphoneReport(o,{success:function(){h.info("sendSoftphoneReport success")},failure:function(e){h.error("sendSoftphoneReport failed.").withObject(e)}})}(e,t,L(a,i),L(c,s)),n(e)},O=function(e,t,n,r,o,i,s){this.softphoneStreamType=r,this.timestamp=e,this.packetsLost=t,this.packetsCount=n,this.audioLevel=o,this.jitterBufferMillis=i,this.roundTripTimeMillis=s},L=function(e,t){return new O((e=e||{}).timestamp,e.packetsLost,e.packetsCount,t,e.audioLevel)},P=function(e){this._originalLogger=e;var r=this;this._tee=function(e,n){return function(){var e=Array.prototype.slice.call(arguments[0]),t="";e.forEach(function(){t+=" %s"}),n.apply(r._originalLogger,[connect.LogComponent.SOFTPHONE,t].concat(e))}}};P.prototype.debug=function(){this._tee(1,this._originalLogger.debug)(arguments)},P.prototype.info=function(){this._tee(2,this._originalLogger.info)(arguments)},P.prototype.log=function(){this._tee(3,this._originalLogger.log)(arguments)},P.prototype.warn=function(){this._tee(4,this._originalLogger.warn)(arguments)},P.prototype.error=function(){this._tee(5,this._originalLogger.error)(arguments)},connect.SoftphoneManager=function(e){var a;h=new P(connect.getLog()),connect.RtcPeerConnectionFactory&&(a=new connect.RtcPeerConnectionFactory(h,connect.core.getWebSocketManager(),g,connect.hitch(this,t,{transportType:"softphone",softphoneClientId:g}),connect.hitch(this,C))),A()||C(f.UNSUPPORTED_BROWSER,"Connect does not support this browser. Some functionality may not work. ","");S({success:function(e){connect.isFirefoxBrowser()&&connect.core.setSoftphoneUserMediaStream(e)},failure:function(e){C(e,"Your microphone is not enabled in your browser. ","")}});y(),this.ringtoneEngine=null;var c="true"===e.cleanMultipleSessions,u={},l={};this.getSession=function(e){return u[e]};function p(n){var r;u.hasOwnProperty(n)&&(r=u[n],new Promise(function(e,t){delete u[n],delete l[n],r.hangup()}).catch(function(e){lily.getLog().warn("Clean up the session locally "+n,e.message)}))}function n(n,r){var e,t,o,i,s;!u[r]||(e=n).getStatus().type!==connect.ContactStatusType.ENDED&&e.getStatus().type!==connect.ContactStatusType.ERROR&&e.getStatus().type!==connect.ContactStatusType.MISSED||p(r),!n.isSoftphoneCall()||l[r]||n.getStatus().type!==connect.ContactStatusType.CONNECTING&&n.getStatus().type!==connect.ContactStatusType.INCOMING||(l[r]=!0,h.info("Softphone call detected:","contactId "+n.getContactId(),"agent connectionId "+r),function(e){if(0=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var n=e.prefix||"";return this._logsDestination===l?this.consoleLoggerWrapper:new C(n)}},{key:"updateLoggerConfig",value:function(e){var n=e||{};this._level=n.level||k.INFO,this._clientLogger=n.logger||null,this._logsDestination=s,n.debug&&(this._logsDestination=l),n.logger&&(this._logsDestination=u)}}]),e}(),T=function(){function e(){v(this,e)}return S(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),e}(),C=function(e){function n(e){var t;return v(this,n),(t=b(this,y(n).call(this))).prefix=e||"",t}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),n&&m(e,n)}(n,T),S(n,[{key:"debug",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t1)&&(e.info("Network online, Connecting to websocket"),O())},250),d=function(e,n){e.forEach(function(e){e(n)})},b=function(){if(r.pendingResponse)return e.warn("Heartbeat response not received"),clearInterval(r.intervalHandle),r.pendingResponse=!1,void k();e.debug("Sending heartbeat"),n.send(T(g)),r.pendingResponse=!0},y=function(){t.linearConnectAttempt=0,t.exponentialConnectAttempt=0,t.exponentialBackOffTime=1,r.pendingResponse=!1,t.reconnectWebSocket=!1,clearTimeout(t.lifeTimeTimeoutHandle),clearInterval(r.intervalHandle),clearTimeout(t.exponentialTimeoutHandle)},m=function(){try{if(e.info("WebSocket connection established!"),d(o.connectionGain),y(),a.subscribed.size>0||a.pending.size>0){var c=Array.from(a.subscribed.values());c=c.concat(Array.from(a.pending.values())),a.subscribed.clear(),n.send(T(f,{topics:c}))}b(),r.intervalHandle=setInterval(b,1e4),t.lifeTimeTimeoutHandle=setTimeout(function(){e.debug("Starting scheduled WebSocket manager reconnect"),k()},1e3*i.connConfig.webSocketTransport.transportLifeTimeInSeconds)}catch(n){e.error("Error after establishing web socket connection, error: ",n)}},v=function(n){t.linearConnectAttempt<=1&&d(o.connectionLost),e.info("Socket connection is closed. event: ",n),t.reconnectWebSocket&&E()},h=function(n){e.error("WebSocketManager Error, error_event: ",n),k()},S=function(n){e.debug("Message received from webSocket server",n.data);var t=JSON.parse(n.data);switch(t.topic){case f:"success"===t.content.status?(t.content.topics.forEach(function(e){a.subscribed.add(e),a.pending.delete(e)}),d(o.subscriptionUpdate,t)):d(o.subscriptionFailure,t);break;case g:e.debug("Heartbeat response received"),r.pendingResponse=!1;break;default:if(t.topic){if(0===o.allMessage.size&&0===o.topic.size)return void e.warn("No registered callback listener for Topic: ",t);d(o.allMessage,t),o.topic.has(t.topic)&&d(o.topic.get(t.topic),t)}else t.message?e.warn("WebSocketManager Message Error, error: ",t):e.warn("Invalid incoming message, error: ",t)}},w=function(e){return!(!n||n.readyState===WebSocket.CLOSED)&&(n.close(1e3,e),!0)},k=function(){u?(clearTimeout(t.lifeTimeTimeoutHandle),clearInterval(r.intervalHandle),t.linearConnectAttempt<3?(t.linearConnectAttempt++,e.debug("Starting Consecutive WebSocket reconnect, Attempt : "+t.linearConnectAttempt),t.reconnectWebSocket=!0,O()):t.exponentialConnectAttempt<5?(t.exponentialConnectAttempt++,t.exponentialBackOffTime*=2,e.debug("Starting Exponential WebSocket reconnect, Attempt : "+t.exponentialConnectAttempt+" with delay "+t.exponentialBackOffTime+" sec."),i.promiseCompleted=!1,i.connConfig=null,t.exponentialTimeoutHandle=setTimeout(function(){t.reconnectWebSocket=!0,O()},1e3*t.exponentialBackOffTime)):i.promiseCompleted&&(e.error("Could not connect to WebSocket after several attempts"),_())):w("Network Offline, Closing WebSocket Manager")},_=function(){y(),w("Terminating WebSocket Manager"),e.error("WebSocket Initialization failed"),t.websocketInitFailed=!0,clearInterval(l),d(o.initFailure)},T=function(e,n){return JSON.stringify({topic:e,content:n})},C=function(n){return!!(c.isObject(n)&&c.isObject(n.webSocketTransport)&&c.isString(n.webSocketTransport.url)&&c.validWSUrl(n.webSocketTransport.url)&&c.isNumber(n.webSocketTransport.transportLifeTimeInSeconds)&&n.webSocketTransport.transportLifeTimeInSeconds>=3600)||(e.error("Invalid WebSocket Connection Configuration",n),!1)},O=function(){t.websocketInitFailed||(i.connConfig=null,i.promiseCompleted=!1,i.promiseHandle=o.getWebSocketTransport(),i.promiseHandle.then(function(n){i.promiseCompleted=!0,e.debug("Successfully fetched webSocket connection configuration"),C(n)?(i.connConfig=n,u&&(w("Restarting WebSocket Manager")||E())):_()},function(n){i.promiseCompleted=!0,e.error("Failed to fetch webSocket connection configuration",n),k()}))},E=function(){if(!t.websocketInitFailed){e.debug("Initializing Websocket Manager");try{C(i.connConfig)?((n=new WebSocket(i.connConfig.webSocketTransport.url)).addEventListener("open",m),n.addEventListener("message",S),n.addEventListener("error",h),n.addEventListener("close",v)):i.promiseCompleted&&_()}catch(n){e.error("Error Initializing web-socket-manager",n),_()}}};this.init=function(n){c.assertTrue(c.isFunction(n),"transportHandle must be a function"),null===o.getWebSocketTransport?(o.getWebSocketTransport=n,O()):e.warn("Web Socket Manager was already initialized")},this.onInitFailure=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.initFailure.add(e),t.websocketInitFailed&&e(),function(){return o.initFailure.delete(e)}},this.onConnectionGain=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.connectionGain.add(e),n&&n.readyState===WebSocket.OPEN&&e(),function(){return o.connectionGain.delete(e)}},this.onConnectionLost=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.connectionLost.add(e),n&&n.readyState===WebSocket.CLOSED&&e(),function(){return o.connectionLost.delete(e)}},this.onSubscriptionUpdate=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.subscriptionUpdate.add(e),function(){return o.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.subscriptionFailure.add(e),function(){return o.subscriptionFailure.delete(e)}},this.onMessage=function(e,n){return c.assertNotNull(e,"topicName"),c.assertTrue(c.isFunction(n),"cb must be a function"),o.topic.has(e)?o.topic.get(e).add(n):o.topic.set(e,new Set([n])),function(){return o.topic.get(e).delete(n)}},this.onAllMessage=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.allMessage.add(e),function(){return o.allMessage.delete(e)}},this.subscribeTopics=function(e){c.assertNotNull(e,"topics"),c.assertIsList(e),e.forEach(function(e){a.pending.add(e)}),n&&n.readyState===WebSocket.OPEN&&n.send(T(f,{topics:e}))},this.sendMessage=function(t){if(c.assertIsObject(t,"payload"),void 0===t.topic||s.has(t.topic))e.warn("Cannot send message, Invalid topic",t);else{try{t=JSON.stringify(t)}catch(n){return void e.warn("Error stringify message",t)}n&&n.readyState===WebSocket.OPEN?(e.debug("WebSocketManager sending message",t),n.send(t)):e.warn("Cannot send message, web socket connection is not open")}},this.closeWebSocket=function(){y(),clearInterval(l),w("User request to close WebSocket")}},L={create:function(){return new E},setGlobalConfig:function(e){var n=e.loggerConfig;x.updateLoggerConfig(n)},LogLevel:k,Logger:w}},function(e,n,t){var r;!function(){"use strict";var o={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(e){return function(e,n){var t,r,a,c,s,u,l,f,p,g=1,d=e.length,b="";for(r=0;r=0),c.type){case"b":t=parseInt(t,10).toString(2);break;case"c":t=String.fromCharCode(parseInt(t,10));break;case"d":case"i":t=parseInt(t,10);break;case"j":t=JSON.stringify(t,null,c.width?parseInt(c.width):0);break;case"e":t=c.precision?parseFloat(t).toExponential(c.precision):parseFloat(t).toExponential();break;case"f":t=c.precision?parseFloat(t).toFixed(c.precision):parseFloat(t);break;case"g":t=c.precision?String(Number(t.toPrecision(c.precision))):parseFloat(t);break;case"o":t=(parseInt(t,10)>>>0).toString(8);break;case"s":t=String(t),t=c.precision?t.substring(0,c.precision):t;break;case"t":t=String(!!t),t=c.precision?t.substring(0,c.precision):t;break;case"T":t=Object.prototype.toString.call(t).slice(8,-1).toLowerCase(),t=c.precision?t.substring(0,c.precision):t;break;case"u":t=parseInt(t,10)>>>0;break;case"v":t=t.valueOf(),t=c.precision?t.substring(0,c.precision):t;break;case"x":t=(parseInt(t,10)>>>0).toString(16);break;case"X":t=(parseInt(t,10)>>>0).toString(16).toUpperCase()}o.json.test(c.type)?b+=t:(!o.number.test(c.type)||f&&!c.sign?p="":(p=f?"+":"-",t=t.toString().replace(o.sign,"")),u=c.pad_char?"0"===c.pad_char?"0":c.pad_char.charAt(1):" ",l=c.width-(p+t).length,s=c.width&&l>0?u.repeat(l):"",b+=c.align?p+t+s:"0"===u?p+s+t:s+p+t)}return b}(function(e){if(c[e])return c[e];var n,t=e,r=[],i=0;for(;t;){if(null!==(n=o.text.exec(t)))r.push(n[0]);else if(null!==(n=o.modulo.exec(t)))r.push("%");else{if(null===(n=o.placeholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");if(n[2]){i|=1;var a=[],s=n[2],u=[];if(null===(u=o.key.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(a.push(u[1]);""!==(s=s.substring(u[0].length));)if(null!==(u=o.key_access.exec(s)))a.push(u[1]);else{if(null===(u=o.index_access.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}n[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:n[0],param_no:n[1],keys:n[2],sign:n[3],pad_char:n[4],align:n[5],width:n[6],precision:n[7],type:n[8]})}t=t.substring(n[0].length)}return c[e]=r}(e),arguments)}function a(e,n){return i.apply(null,[e].concat(n||[]))}var c=Object.create(null);n.sprintf=i,n.vsprintf=a,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=a,void 0===(r=function(){return{sprintf:i,vsprintf:a}}.call(n,t,n,e))||(e.exports=r))}()},function(e,n,t){"use strict";t.r(n),function(e){t.d(n,"WebSocketManager",function(){return o});var r=t(0);e.connect=e.connect||{},connect.WebSocketManager=r.a;var o=r.a}.call(this,t(3))},function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(e){"object"==typeof window&&(t=window)}e.exports=t}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvd2ViU29ja2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIlV0aWxzIiwicHJlbWlzZSIsIm1lc3NhZ2UiLCJFcnJvciIsImFzc2VydFRydWUiLCJ1bmRlZmluZWQiLCJzcHJpbnRmIiwiQXJyYXkiLCJpc0FycmF5IiwiYWxsb3dlZFZhbHVlcyIsImxlbmd0aCIsInZhbHVlcyIsImVudW1PYmoiLCJmb3JFYWNoIiwicmVwbGFjZSIsIngiLCJ5IiwidG9VcHBlckNhc2UiLCJvYmoiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiaXNTdHJpbmciLCJpc051bWJlciIsIndzUmVnZXgiLCJSZWdFeHAiLCJ2YWxpZFdTVXJsIiwid3NVcmwiLCJ0ZXN0IiwiYXNzZXJ0SXNPYmplY3QiLCJpc09iamVjdCIsIkxPR1NfREVTVElOQVRJT04iLCJST1VURV9LRVkiLCJMb2dnZXIiLCJkYXRhIiwiTG9nTGV2ZWwiLCJERUJVRyIsIklORk8iLCJXQVJOIiwiRVJST1IiLCJMb2dNYW5hZ2VySW1wbCIsInRoaXMiLCJ1cGRhdGVMb2dnZXJDb25maWciLCJjb25zb2xlTG9nZ2VyV3JhcHBlciIsImNyZWF0ZUNvbnNvbGVMb2dnZXIiLCJsZXZlbCIsImxvZ1N0YXRlbWVudCIsImhhc0NsaWVudExvZ2dlciIsIl9jbGllbnRMb2dnZXIiLCJkZWJ1ZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiLCJfbGV2ZWwiLCJvcHRpb25zIiwicHJlZml4IiwiX2xvZ3NEZXN0aW5hdGlvbiIsIkxvZ2dlcldyYXBwZXJJbXBsIiwiaW5wdXRDb25maWciLCJjb25maWciLCJsb2dnZXIiLCJMb2dnZXJXcmFwcGVyIiwiYXJncyIsIl9sb2ciLCJMb2dNYW5hZ2VyIiwiaXNMZXZlbEVuYWJsZWQiLCJ3cml0ZVRvQ2xpZW50TG9nZ2VyIiwiX3Nob3VsZExvZyIsIl9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQiLCJfd3JpdGVUb0NsaWVudExvZ2dlciIsImluZGV4IiwiYXJnIiwiX2NvbnZlcnRUb1N0cmluZyIsImlzRnVuY3Rpb24iLCJ0b1N0cmluZyIsInRvU3RyaW5nUmVzdWx0IiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbnNvbGUiLCJXZWJTb2NrZXRNYW5hZ2VyIiwiZ2V0TG9nZ2VyIiwid2ViU29ja2V0IiwicmVjb25uZWN0Q29uZmlnIiwicmVjb25uZWN0V2ViU29ja2V0Iiwid2Vic29ja2V0SW5pdEZhaWxlZCIsImxpbmVhckNvbm5lY3RBdHRlbXB0IiwiZXhwb25lbnRpYWxDb25uZWN0QXR0ZW1wdCIsImV4cG9uZW50aWFsQmFja09mZlRpbWUiLCJleHBvbmVudGlhbFRpbWVvdXRIYW5kbGUiLCJsaWZlVGltZVRpbWVvdXRIYW5kbGUiLCJoZWFydGJlYXRDb25maWciLCJwZW5kaW5nUmVzcG9uc2UiLCJpbnRlcnZhbEhhbmRsZSIsImNhbGxiYWNrcyIsImluaXRGYWlsdXJlIiwiU2V0IiwiZ2V0V2ViU29ja2V0VHJhbnNwb3J0Iiwic3Vic2NyaXB0aW9uVXBkYXRlIiwic3Vic2NyaXB0aW9uRmFpbHVyZSIsInRvcGljIiwiTWFwIiwiYWxsTWVzc2FnZSIsImNvbm5lY3Rpb25HYWluIiwiY29ubmVjdGlvbkxvc3QiLCJ3ZWJTb2NrZXRDb25maWciLCJjb25uQ29uZmlnIiwicHJvbWlzZUhhbmRsZSIsInByb21pc2VDb21wbGV0ZWQiLCJ0b3BpY1N1YnNjcmlwdGlvbiIsInN1YnNjcmliZWQiLCJwZW5kaW5nIiwiaW52YWxpZFNlbmRNZXNzYWdlUm91dGVLZXlzIiwib25saW5lIiwibmF2aWdhdG9yIiwib25MaW5lIiwibmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIiLCJzZXRJbnRlcnZhbCIsInJlYWR5U3RhdGUiLCJnZXRXZWJTb2NrZXRDb25uQ29uZmlnIiwiaW52b2tlQ2FsbGJhY2tzIiwicmVzcG9uc2UiLCJjYWxsYmFjayIsInNlbmRIZWFydEJlYXQiLCJjbGVhckludGVydmFsIiwicmVmcmVzaFdlYlNvY2tldENvbm5lY3Rpb24iLCJzZW5kIiwiY3JlYXRlV2ViU29ja2V0UGF5bG9hZCIsInJlc2V0U3RhdGUiLCJjbGVhclRpbWVvdXQiLCJ3ZWJTb2NrZXRPbk9wZW4iLCJzaXplIiwidG9waWNzIiwiZnJvbSIsImNvbmNhdCIsImNsZWFyIiwic2V0VGltZW91dCIsIndlYlNvY2tldFRyYW5zcG9ydCIsInRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzIiwid2ViU29ja2V0T25DbG9zZSIsImV2ZW50IiwiaW5pdFdlYlNvY2tldCIsIndlYlNvY2tldE9uRXJyb3IiLCJ3ZWJTb2NrZXRPbk1lc3NhZ2UiLCJwYXJzZSIsImNvbnRlbnQiLCJzdGF0dXMiLCJ0b3BpY05hbWUiLCJhZGQiLCJoYXMiLCJjbG9zZVdlYlNvY2tldCIsInJlYXNvbiIsIldlYlNvY2tldCIsIkNMT1NFRCIsImNsb3NlIiwidGVybWluYXRlV2ViU29ja2V0TWFuYWdlciIsInZhbGlkV2ViU29ja2V0Q29ubkNvbmZpZyIsInVybCIsInRoZW4iLCJhZGRFdmVudExpc3RlbmVyIiwiaW5pdCIsInRyYW5zcG9ydEhhbmRsZSIsIm9uSW5pdEZhaWx1cmUiLCJjYiIsIm9uQ29ubmVjdGlvbkdhaW4iLCJPUEVOIiwib25Db25uZWN0aW9uTG9zdCIsIm9uU3Vic2NyaXB0aW9uVXBkYXRlIiwib25TdWJzY3JpcHRpb25GYWlsdXJlIiwib25NZXNzYWdlIiwiYXNzZXJ0Tm90TnVsbCIsInNldCIsIm9uQWxsTWVzc2FnZSIsInN1YnNjcmliZVRvcGljcyIsImFzc2VydElzTGlzdCIsInNlbmRNZXNzYWdlIiwicGF5bG9hZCIsIldlYlNvY2tldE1hbmFnZXJPYmplY3QiLCJzZXRHbG9iYWxDb25maWciLCJsb2dnZXJDb25maWciLCJyZSIsIm5vdF9zdHJpbmciLCJub3RfYm9vbCIsIm5vdF90eXBlIiwibm90X3ByaW1pdGl2ZSIsIm51bWJlciIsIm51bWVyaWNfYXJnIiwianNvbiIsIm5vdF9qc29uIiwidGV4dCIsIm1vZHVsbyIsInBsYWNlaG9sZGVyIiwia2V5X2FjY2VzcyIsImluZGV4X2FjY2VzcyIsInNpZ24iLCJwYXJzZV90cmVlIiwiYXJndiIsImsiLCJwaCIsInBhZCIsInBhZF9jaGFyYWN0ZXIiLCJwYWRfbGVuZ3RoIiwiaXNfcG9zaXRpdmUiLCJjdXJzb3IiLCJ0cmVlX2xlbmd0aCIsIm91dHB1dCIsImtleXMiLCJwYXJhbV9ubyIsInR5cGUiLCJGdW5jdGlvbiIsImlzTmFOIiwiVHlwZUVycm9yIiwicGFyc2VJbnQiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ3aWR0aCIsInByZWNpc2lvbiIsInBhcnNlRmxvYXQiLCJ0b0V4cG9uZW50aWFsIiwidG9GaXhlZCIsIk51bWJlciIsInRvUHJlY2lzaW9uIiwic3Vic3RyaW5nIiwic2xpY2UiLCJ0b0xvd2VyQ2FzZSIsInZhbHVlT2YiLCJwYWRfY2hhciIsImNoYXJBdCIsInJlcGVhdCIsImFsaWduIiwic3ByaW50Zl9mb3JtYXQiLCJmbXQiLCJzcHJpbnRmX2NhY2hlIiwibWF0Y2giLCJfZm10IiwiYXJnX25hbWVzIiwiZXhlYyIsInB1c2giLCJTeW50YXhFcnJvciIsImZpZWxkX2xpc3QiLCJyZXBsYWNlbWVudF9maWVsZCIsImZpZWxkX21hdGNoIiwic3ByaW50Zl9wYXJzZSIsImFyZ3VtZW50cyIsInZzcHJpbnRmIiwid2luZG93IiwiZ2xvYmFsIiwiY29ubmVjdCIsImciLCJlIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FB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QU0sS0FBTSxDQUFDaU4sR0FBS2pHLE9BQU84RCxHQUFRLEtBZ0hwRCxJQUFJb0MsRUFBZ0I1UCxPQUFPWSxPQUFPLE1Bd0U5QnhCLEVBQWlCLFFBQUl3QyxFQUNyQnhDLEVBQWtCLFNBQUlvUixFQUVKLG9CQUFYQyxTQUNQQSxPQUFnQixRQUFJN08sRUFDcEI2TyxPQUFpQixTQUFJRCxPQVFoQixLQUxELGFBQ0ksTUFBTyxDQUNILFFBQVc1TyxFQUNYLFNBQVk0TyxJQUVuQiwrQkFoT1osSSw2QkNGRCw2RUFHQUUsRUFBT0MsUUFBVUQsRUFBT0MsU0FBVyxHQUNuQ0EsUUFBUXZLLGlCQUFtQmlHLElBRXBCLElBQU1qRyxFQUFtQmlHLEssK0JDTmhDLElBQUl1RSxFQUdKQSxFQUFJLFdBQ0gsT0FBTzlNLEtBREosR0FJSixJQUVDOE0sRUFBSUEsR0FBSyxJQUFJdkMsU0FBUyxjQUFiLEdBQ1IsTUFBT3dDLEdBRWMsaUJBQVhKLFNBQXFCRyxFQUFJSCxRQU9yQ3BSLEVBQU9ELFFBQVV3UiIsImZpbGUiOiJhbWF6b24tY29ubmVjdC13ZWJzb2NrZXQtbWFuYWdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyKTtcbiIsImltcG9ydCB7IHNwcmludGYgfSBmcm9tIFwic3ByaW50Zi1qc1wiO1xuY29uc3QgVXRpbHMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSBwcmVtaXNlIGlzIHRydWUuXG4gKi9cblV0aWxzLmFzc2VydFRydWUgPSBmdW5jdGlvbihwcmVtaXNlLCBtZXNzYWdlKSB7XG4gIGlmICghcHJlbWlzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBub3QgbnVsbCBvciB1bmRlZmluZWQuXG4gKi9cblV0aWxzLmFzc2VydE5vdE51bGwgPSBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICBVdGlscy5hc3NlcnRUcnVlKFxuICAgIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgIHNwcmludGYoXCIlcyBtdXN0IGJlIHByb3ZpZGVkXCIsIG5hbWUgfHwgXCJBIHZhbHVlXCIpXG4gICk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblV0aWxzLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcbn07XG5cblV0aWxzLmFzc2VydElzTm9uRW1wdHlTdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGtleSArIFwiIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmchXCIpO1xuICB9XG59O1xuXG5VdGlscy5hc3NlcnRJc0xpc3QgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioa2V5ICsgXCIgaXMgbm90IGFuIGFycmF5XCIpO1xuICB9XG59O1xuXG5VdGlscy5hc3NlcnRJc0VudW0gPSBmdW5jdGlvbih2YWx1ZSwgYWxsb3dlZFZhbHVlcywga2V5KSB7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhbGxvd2VkVmFsdWVzW2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAga2V5ICsgXCIgcGFzc2VkIGlzIG5vdCB2YWxpZC4gXCIgKyBcIkFsbG93ZWQgdmFsdWVzIGFyZTogXCIgKyBhbGxvd2VkVmFsdWVzXG4gICk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGVudW0gZnJvbSB0aGUgZ2l2ZW4gbGlzdCBvZiBsb3dlci1jYXNlIGVudW0gdmFsdWVzLFxuICogd2hlcmUgdGhlIGVudW0ga2V5cyB3aWxsIGJlIHVwcGVyIGNhc2UuXG4gKlxuICogQ29udmVyc2lvbiBmcm9tIHBhc2NhbCBjYXNlIGJhc2VkIG9uIGNvZGUgZnJvbSBoZXJlOlxuICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDUyMTIyNFxuICovXG5VdGlscy5tYWtlRW51bSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgZW51bU9iaiA9IHt9O1xuXG4gIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlXG4gICAgICAucmVwbGFjZSgvXFwuPyhbYS16XSspXz8vZywgZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4geS50b1VwcGVyQ2FzZSgpICsgXCJfXCI7XG4gICAgICB9KVxuICAgICAgLnJlcGxhY2UoL18kLywgXCJcIik7XG5cbiAgICBlbnVtT2JqW2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGVudW1PYmo7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0eXBlLlxuICogQm9ycm93ZWQgZnJvbSBVbmRlcnNjb3JlLmpzLlxuICovXG5VdGlscy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiAhIShvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jYWxsICYmIG9iai5hcHBseSk7XG59O1xuXG5VdGlscy5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiAhKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCk7XG59O1xuXG5VdGlscy5pc1N0cmluZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59O1xuXG5VdGlscy5pc051bWJlciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XG59O1xuXG5jb25zdCB3c1JlZ2V4ID0gbmV3IFJlZ0V4cChcIl4od3NzOi8vKVxcXFx3KlwiKTtcblV0aWxzLnZhbGlkV1NVcmwgPSBmdW5jdGlvbiAod3NVcmwpIHtcbiAgcmV0dXJuIHdzUmVnZXgudGVzdCh3c1VybCk7XG59O1xuXG5VdGlscy5hc3NlcnRJc09iamVjdCA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFVdGlscy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioa2V5ICsgXCIgaXMgbm90IGFuIG9iamVjdCFcIik7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxzO1xuXG4iLCJcbmV4cG9ydCBjb25zdCBMT0dTX0RFU1RJTkFUSU9OID0ge1xuICBOVUxMOiBcIk5VTExcIixcbiAgQ0xJRU5UX0xPR0dFUjogXCJDTElFTlRfTE9HR0VSXCIsXG4gIERFQlVHOiBcIkRFQlVHXCJcbn07XG5cbmV4cG9ydCBjb25zdCBNSU5fV0VCU09DS0VUX0xJRkVUSU1FID0gMzYwMDtcbmV4cG9ydCBjb25zdCBNQVhfTElORUFSX0NPTk5FQ1RfQVRURU1QVFMgPSAzO1xuZXhwb3J0IGNvbnN0IE1BWF9FWFBPTkVOVElBTF9DT05ORUNUX0FUVEVNUFRTID0gNTtcbmV4cG9ydCBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUwgPSAxMDsgLy9zZWNvbmRzXG5cbmV4cG9ydCBjb25zdCBST1VURV9LRVkgPSB7XG4gIFNVQlNDUklCRTogXCJhd3Mvc3Vic2NyaWJlXCIsXG4gIFVOU1VCU0NSSUJFOiBcImF3cy91bnN1YnNjcmliZVwiLFxuICBIRUFSVEJFQVQ6IFwiYXdzL2hlYXJ0YmVhdFwiXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBMT0dTX0RFU1RJTkFUSU9OIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMqL1xuY2xhc3MgTG9nZ2VyIHtcbiAgZGVidWcoZGF0YSkge31cblxuICBpbmZvKGRhdGEpIHt9XG5cbiAgd2FybihkYXRhKSB7fVxuXG4gIGVycm9yKGRhdGEpIHt9XG59XG4vKmVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMqL1xuXG5jb25zdCBMb2dMZXZlbCA9IHtcbiAgREVCVUc6IDEwLFxuICBJTkZPOiAyMCxcbiAgV0FSTjogMzAsXG4gIEVSUk9SOiA0MFxufTtcblxuY2xhc3MgTG9nTWFuYWdlckltcGwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnVwZGF0ZUxvZ2dlckNvbmZpZygpO1xuICAgIHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXIgPSBjcmVhdGVDb25zb2xlTG9nZ2VyKCk7XG4gIH1cblxuICB3cml0ZVRvQ2xpZW50TG9nZ2VyKGxldmVsLCBsb2dTdGF0ZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuaGFzQ2xpZW50TG9nZ2VyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5ERUJVRzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyhsb2dTdGF0ZW1lbnQpO1xuICAgICAgY2FzZSBMb2dMZXZlbC5JTkZPOlxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8obG9nU3RhdGVtZW50KTtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuV0FSTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKGxvZ1N0YXRlbWVudCk7XG4gICAgICBjYXNlIExvZ0xldmVsLkVSUk9SOlxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKGxvZ1N0YXRlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaXNMZXZlbEVuYWJsZWQobGV2ZWwpIHtcbiAgICByZXR1cm4gbGV2ZWwgPj0gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBoYXNDbGllbnRMb2dnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlciAhPT0gbnVsbDtcbiAgfVxuXG4gIGdldExvZ2dlcihvcHRpb25zKSB7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IFwiXCI7XG4gICAgaWYgKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbiA9PT0gTE9HU19ERVNUSU5BVElPTi5ERUJVRykge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTG9nZ2VyV3JhcHBlckltcGwocHJlZml4KTtcbiAgfVxuXG4gIHVwZGF0ZUxvZ2dlckNvbmZpZyhpbnB1dENvbmZpZykge1xuICAgIHZhciBjb25maWcgPSBpbnB1dENvbmZpZyB8fCB7fTtcbiAgICB0aGlzLl9sZXZlbCA9IGNvbmZpZy5sZXZlbCB8fCBMb2dMZXZlbC5JTkZPO1xuICAgIHRoaXMuX2NsaWVudExvZ2dlciA9IGNvbmZpZy5sb2dnZXIgfHwgbnVsbDtcbiAgICB0aGlzLl9sb2dzRGVzdGluYXRpb24gPSBMT0dTX0RFU1RJTkFUSU9OLk5VTEw7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgdGhpcy5fbG9nc0Rlc3RpbmF0aW9uID0gTE9HU19ERVNUSU5BVElPTi5ERUJVRztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5sb2dnZXIpIHtcbiAgICAgIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbiA9IExPR1NfREVTVElOQVRJT04uQ0xJRU5UX0xPR0dFUjtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTG9nZ2VyV3JhcHBlciB7XG4gIGRlYnVnKCkge31cblxuICBpbmZvKCkge31cblxuICB3YXJuKCkge31cblxuICBlcnJvcigpIHt9XG59XG5cbmNsYXNzIExvZ2dlcldyYXBwZXJJbXBsIGV4dGVuZHMgTG9nZ2VyV3JhcHBlciB7XG4gIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXggfHwgXCJcIjtcbiAgfVxuXG4gIGRlYnVnKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9sb2coTG9nTGV2ZWwuREVCVUcsIGFyZ3MpO1xuICB9XG5cbiAgaW5mbyguLi5hcmdzKSB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLklORk8sIGFyZ3MpO1xuICB9XG5cbiAgd2FybiguLi5hcmdzKSB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLldBUk4sIGFyZ3MpO1xuICB9XG5cbiAgZXJyb3IoLi4uYXJncykge1xuICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5FUlJPUiwgYXJncyk7XG4gIH1cblxuICBfc2hvdWxkTG9nKGxldmVsKSB7XG4gICAgcmV0dXJuIExvZ01hbmFnZXIuaGFzQ2xpZW50TG9nZ2VyKCkgJiYgTG9nTWFuYWdlci5pc0xldmVsRW5hYmxlZChsZXZlbCk7XG4gIH1cblxuICBfd3JpdGVUb0NsaWVudExvZ2dlcihsZXZlbCwgbG9nU3RhdGVtZW50KSB7XG4gICAgTG9nTWFuYWdlci53cml0ZVRvQ2xpZW50TG9nZ2VyKGxldmVsLCBsb2dTdGF0ZW1lbnQpO1xuICB9XG5cbiAgX2xvZyhsZXZlbCwgYXJncykge1xuICAgIGlmICh0aGlzLl9zaG91bGRMb2cobGV2ZWwpKSB7XG4gICAgICB2YXIgbG9nU3RhdGVtZW50ID0gdGhpcy5fY29udmVydFRvU2luZ2xlU3RhdGVtZW50KGFyZ3MpO1xuICAgICAgdGhpcy5fd3JpdGVUb0NsaWVudExvZ2dlcihsZXZlbCwgbG9nU3RhdGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBfY29udmVydFRvU2luZ2xlU3RhdGVtZW50KGFyZ3MpIHtcbiAgICB2YXIgbG9nU3RhdGVtZW50ID0gXCJcIjtcbiAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgIGxvZ1N0YXRlbWVudCArPSB0aGlzLnByZWZpeCArIFwiIFwiO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBhcmcgPSBhcmdzW2luZGV4XTtcbiAgICAgIGxvZ1N0YXRlbWVudCArPSB0aGlzLl9jb252ZXJ0VG9TdHJpbmcoYXJnKSArIFwiIFwiO1xuICAgIH1cbiAgICByZXR1cm4gbG9nU3RhdGVtZW50O1xuICB9XG5cbiAgX2NvbnZlcnRUb1N0cmluZyhhcmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbHMuaXNTdHJpbmcoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWxzLmlzT2JqZWN0KGFyZykgJiYgVXRpbHMuaXNGdW5jdGlvbihhcmcudG9TdHJpbmcpKSB7XG4gICAgICAgIHZhciB0b1N0cmluZ1Jlc3VsdCA9IGFyZy50b1N0cmluZygpO1xuICAgICAgICBpZiAodG9TdHJpbmdSZXN1bHQgIT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgICAgICByZXR1cm4gdG9TdHJpbmdSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgY29udmVydGluZyBhcmd1bWVudCB0byBzdHJpbmdcIiwgYXJnLCBlcnJvcik7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUNvbnNvbGVMb2dnZXIgPSAoKSA9PiB7XG4gIHZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyV3JhcHBlcigpO1xuICBsb2dnZXIuZGVidWcgPSBjb25zb2xlLmRlYnVnO1xuICBsb2dnZXIuaW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgbG9nZ2VyLndhcm4gPSBjb25zb2xlLndhcm47XG4gIGxvZ2dlci5lcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gIHJldHVybiBsb2dnZXI7XG59O1xuXG5jb25zdCBMb2dNYW5hZ2VyID0gbmV3IExvZ01hbmFnZXJJbXBsKCk7XG5cbmV4cG9ydCB7IExvZ01hbmFnZXIsIExvZ2dlciwgTG9nTGV2ZWwgfTtcbiIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgTG9nTWFuYWdlciwgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IHtcbiAgICBNSU5fV0VCU09DS0VUX0xJRkVUSU1FLFxuICAgIE1BWF9MSU5FQVJfQ09OTkVDVF9BVFRFTVBUUyxcbiAgICBNQVhfRVhQT05FTlRJQUxfQ09OTkVDVF9BVFRFTVBUUyxcbiAgICBIRUFSVEJFQVRfSU5URVJWQUwsXG4gICAgUk9VVEVfS0VZXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5cbmNvbnN0IFdlYlNvY2tldE1hbmFnZXIgPSBmdW5jdGlvbigpIHtcblxuICAgIGNvbnN0IGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyKHt9KTtcblxuICAgIGxldCB3ZWJTb2NrZXQgPSBudWxsO1xuXG4gICAgbGV0IHJlY29ubmVjdENvbmZpZyA9IHtcbiAgICAgICAgcmVjb25uZWN0V2ViU29ja2V0OiBmYWxzZSxcbiAgICAgICAgd2Vic29ja2V0SW5pdEZhaWxlZDogZmFsc2UsXG4gICAgICAgIGxpbmVhckNvbm5lY3RBdHRlbXB0OiAwLFxuICAgICAgICBleHBvbmVudGlhbENvbm5lY3RBdHRlbXB0OiAwLFxuICAgICAgICBleHBvbmVudGlhbEJhY2tPZmZUaW1lOiAxLFxuICAgICAgICBleHBvbmVudGlhbFRpbWVvdXRIYW5kbGU6IG51bGwsXG4gICAgICAgIGxpZmVUaW1lVGltZW91dEhhbmRsZTogbnVsbFxuICAgIH07XG5cbiAgICBsZXQgaGVhcnRiZWF0Q29uZmlnID0ge1xuICAgICAgICBwZW5kaW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICBpbnRlcnZhbEhhbmRsZTogbnVsbFxuICAgIH07XG5cbiAgICBsZXQgY2FsbGJhY2tzID0ge1xuICAgICAgICBpbml0RmFpbHVyZTogbmV3IFNldCgpLFxuICAgICAgICBnZXRXZWJTb2NrZXRUcmFuc3BvcnQ6IG51bGwsXG4gICAgICAgIHN1YnNjcmlwdGlvblVwZGF0ZTogbmV3IFNldCgpLFxuICAgICAgICBzdWJzY3JpcHRpb25GYWlsdXJlOiBuZXcgU2V0KCksXG4gICAgICAgIHRvcGljOiBuZXcgTWFwKCksXG4gICAgICAgIGFsbE1lc3NhZ2U6IG5ldyBTZXQoKSxcbiAgICAgICAgY29ubmVjdGlvbkdhaW46IG5ldyBTZXQoKSxcbiAgICAgICAgY29ubmVjdGlvbkxvc3Q6IG5ldyBTZXQoKVxuICAgIH07XG5cbiAgICBsZXQgd2ViU29ja2V0Q29uZmlnID0ge1xuICAgICAgICBjb25uQ29uZmlnOiBudWxsLFxuICAgICAgICBwcm9taXNlSGFuZGxlOiBudWxsLFxuICAgICAgICBwcm9taXNlQ29tcGxldGVkOiBmYWxzZVxuICAgIH07XG5cbiAgICBsZXQgdG9waWNTdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIHN1YnNjcmliZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgcGVuZGluZzogbmV3IFNldCgpXG4gICAgfTtcblxuICAgIGNvbnN0IGludmFsaWRTZW5kTWVzc2FnZVJvdXRlS2V5cyA9IG5ldyBTZXQoW1JPVVRFX0tFWS5TVUJTQ1JJQkUsIFJPVVRFX0tFWS5VTlNVQlNDUklCRSwgUk9VVEVfS0VZLkhFQVJUQkVBVF0pO1xuXG4gICAgbGV0IG9ubGluZSA9IG5hdmlnYXRvci5vbkxpbmU7XG4gICAgY29uc3QgbmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvbmxpbmUgIT09IG5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgICAgIG9ubGluZSA9IG5hdmlnYXRvci5vbkxpbmU7XG4gICAgICAgICAgICBpZiAob25saW5lICYmICghd2ViU29ja2V0IHx8IHdlYlNvY2tldC5yZWFkeVN0YXRlID4gMSkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIk5ldHdvcmsgb25saW5lLCBDb25uZWN0aW5nIHRvIHdlYnNvY2tldFwiKTtcbiAgICAgICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAyNTApO1xuXG4gICAgY29uc3QgaW52b2tlQ2FsbGJhY2tzID0gZnVuY3Rpb24oY2FsbGJhY2tzLCByZXNwb25zZSkge1xuICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNlbmRIZWFydEJlYXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGhlYXJ0YmVhdENvbmZpZy5wZW5kaW5nUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiSGVhcnRiZWF0IHJlc3BvbnNlIG5vdCByZWNlaXZlZFwiKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaGVhcnRiZWF0Q29uZmlnLmludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGhlYXJ0YmVhdENvbmZpZy5wZW5kaW5nUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICAgIHdlYlNvY2tldC5zZW5kKGNyZWF0ZVdlYlNvY2tldFBheWxvYWQoUk9VVEVfS0VZLkhFQVJUQkVBVCkpO1xuICAgICAgICBoZWFydGJlYXRDb25maWcucGVuZGluZ1Jlc3BvbnNlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzZXRTdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWNvbm5lY3RDb25maWcubGluZWFyQ29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICByZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxDb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbEJhY2tPZmZUaW1lID0gMTtcbiAgICAgICAgaGVhcnRiZWF0Q29uZmlnLnBlbmRpbmdSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICByZWNvbm5lY3RDb25maWcucmVjb25uZWN0V2ViU29ja2V0ID0gZmFsc2U7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlY29ubmVjdENvbmZpZy5saWZlVGltZVRpbWVvdXRIYW5kbGUpO1xuICAgICAgICBjbGVhckludGVydmFsKGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgIGNsZWFyVGltZW91dChyZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd2ViU29ja2V0T25PcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIldlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkIVwiKTtcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuY29ubmVjdGlvbkdhaW4pO1xuXG4gICAgICAgICAgICByZXNldFN0YXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0b3BpY1N1YnNjcmlwdGlvbi5zdWJzY3JpYmVkLnNpemUgPiAwIHx8IHRvcGljU3Vic2NyaXB0aW9uLnBlbmRpbmcuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9waWNzID0gQXJyYXkuZnJvbSh0b3BpY1N1YnNjcmlwdGlvbi5zdWJzY3JpYmVkLnZhbHVlcygpKTtcbiAgICAgICAgICAgICAgICB0b3BpY3MgPSB0b3BpY3MuY29uY2F0KEFycmF5LmZyb20odG9waWNTdWJzY3JpcHRpb24ucGVuZGluZy52YWx1ZXMoKSkpO1xuICAgICAgICAgICAgICAgIHRvcGljU3Vic2NyaXB0aW9uLnN1YnNjcmliZWQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuc2VuZChjcmVhdGVXZWJTb2NrZXRQYXlsb2FkKFJPVVRFX0tFWS5TVUJTQ1JJQkUsIHtcInRvcGljc1wiOiB0b3BpY3N9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRIZWFydEJlYXQoKTtcbiAgICAgICAgICAgIGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKHNlbmRIZWFydEJlYXQsIDEwMDAgKiBIRUFSVEJFQVRfSU5URVJWQUwpO1xuXG4gICAgICAgICAgICByZWNvbm5lY3RDb25maWcubGlmZVRpbWVUaW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBzY2hlZHVsZWQgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0XCIpO1xuICAgICAgICAgICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICB9LCAxMDAwICogd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGFmdGVyIGVzdGFibGlzaGluZyB3ZWIgc29ja2V0IGNvbm5lY3Rpb24sIGVycm9yOiBcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHdlYlNvY2tldE9uQ2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAocmVjb25uZWN0Q29uZmlnLmxpbmVhckNvbm5lY3RBdHRlbXB0IDw9IDEpIHtcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuY29ubmVjdGlvbkxvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiBldmVudDogXCIsIGV2ZW50KTtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy5yZWNvbm5lY3RXZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIGluaXRXZWJTb2NrZXQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB3ZWJTb2NrZXRPbkVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6IFwiLCBldmVudCk7XG4gICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdlYlNvY2tldE9uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIk1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3ZWJTb2NrZXQgc2VydmVyXCIsIGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgIHN3aXRjaCAocmVzcG9uc2UudG9waWMpIHtcbiAgICAgICAgICAgIGNhc2UgUk9VVEVfS0VZLlNVQlNDUklCRTpcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY29udGVudC5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRlbnQudG9waWNzLmZvckVhY2goKGZ1bmN0aW9uICh0b3BpY05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljU3Vic2NyaXB0aW9uLnN1YnNjcmliZWQuYWRkKHRvcGljTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BpY1N1YnNjcmlwdGlvbi5wZW5kaW5nLmRlbGV0ZSh0b3BpY05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3Muc3Vic2NyaXB0aW9uVXBkYXRlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy5zdWJzY3JpcHRpb25GYWlsdXJlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBST1VURV9LRVkuSEVBUlRCRUFUOlxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkhlYXJ0YmVhdCByZXNwb25zZSByZWNlaXZlZFwiKTtcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRDb25maWcucGVuZGluZ1Jlc3BvbnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50b3BpYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLmFsbE1lc3NhZ2Uuc2l6ZSA9PT0gMCAmJiBjYWxsYmFja3MudG9waWMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ05vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgbGlzdGVuZXIgZm9yIFRvcGljOiAnLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy5hbGxNZXNzYWdlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MudG9waWMuaGFzKHJlc3BvbnNlLnRvcGljKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy50b3BpYy5nZXQocmVzcG9uc2UudG9waWMpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJXZWJTb2NrZXRNYW5hZ2VyIE1lc3NhZ2UgRXJyb3IsIGVycm9yOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiSW52YWxpZCBpbmNvbWluZyBtZXNzYWdlLCBlcnJvcjogXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xvc2VXZWJTb2NrZXQgPSBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgaWYgKHdlYlNvY2tldCAmJiB3ZWJTb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NFRCkge1xuICAgICAgICAgICAgd2ViU29ja2V0LmNsb3NlKDEwMDAsIHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIW9ubGluZSkge1xuICAgICAgICAgICAgY2xvc2VXZWJTb2NrZXQoXCJOZXR3b3JrIE9mZmxpbmUsIENsb3NpbmcgV2ViU29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlY29ubmVjdENvbmZpZy5saWZlVGltZVRpbWVvdXRIYW5kbGUpO1xuICAgICAgICBjbGVhckludGVydmFsKGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSk7XG5cbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy5saW5lYXJDb25uZWN0QXR0ZW1wdCA8IE1BWF9MSU5FQVJfQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLmxpbmVhckNvbm5lY3RBdHRlbXB0Kys7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBDb25zZWN1dGl2ZSBXZWJTb2NrZXQgcmVjb25uZWN0LCBBdHRlbXB0IDogXCIgKyByZWNvbm5lY3RDb25maWcubGluZWFyQ29ubmVjdEF0dGVtcHQpO1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLnJlY29ubmVjdFdlYlNvY2tldCA9IHRydWU7XG4gICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQ29ubmVjdEF0dGVtcHQgPCBNQVhfRVhQT05FTlRJQUxfQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQ29ubmVjdEF0dGVtcHQrKztcbiAgICAgICAgICAgIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbEJhY2tPZmZUaW1lICo9IDI7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBFeHBvbmVudGlhbCBXZWJTb2NrZXQgcmVjb25uZWN0LCBBdHRlbXB0IDogXCJcbiAgICAgICAgICAgICAgICArIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbENvbm5lY3RBdHRlbXB0ICsgXCIgd2l0aCBkZWxheSBcIlxuICAgICAgICAgICAgICAgICsgcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQmFja09mZlRpbWUgKyBcIiBzZWMuXCIpO1xuXG4gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3Igc2NlbmFyaW9zIHdoZW4gZXJyb3IgYW5kIGNsb3NlIGV2ZW50cyBhcmUgZmlyZWQgYmFjayB0byBiYWNrXG4gICAgICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSBudWxsO1xuXG4gICAgICAgICAgICByZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RDb25maWcucmVjb25uZWN0V2ViU29ja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgICAgICB9LCAxMDAwICogcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQmFja09mZlRpbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDb3VsZCBub3QgY29ubmVjdCB0byBXZWJTb2NrZXQgYWZ0ZXIgc2V2ZXJhbCBhdHRlbXB0c1wiKTtcbiAgICAgICAgICAgIHRlcm1pbmF0ZVdlYlNvY2tldE1hbmFnZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNldFN0YXRlKCk7XG4gICAgICAgIGNsb3NlV2ViU29ja2V0KFwiVGVybWluYXRpbmcgV2ViU29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcIldlYlNvY2tldCBJbml0aWFsaXphdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChuZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlcik7XG4gICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuaW5pdEZhaWx1cmUpO1xuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVXZWJTb2NrZXRQYXlsb2FkID0gZnVuY3Rpb24gKGtleSwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJ0b3BpY1wiOiBrZXksXG4gICAgICAgICAgICBcImNvbnRlbnRcIjogY29udGVudFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VuZE1lc3NhZ2UgPSBmdW5jdGlvbihwYXlsb2FkKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydElzT2JqZWN0KHBheWxvYWQsIFwicGF5bG9hZFwiKTtcbiAgICAgICAgaWYgKHBheWxvYWQudG9waWMgPT09IHVuZGVmaW5lZCB8fCBpbnZhbGlkU2VuZE1lc3NhZ2VSb3V0ZUtleXMuaGFzKHBheWxvYWQudG9waWMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIEludmFsaWQgdG9waWNcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXJyb3Igc3RyaW5naWZ5IG1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlYlNvY2tldCAmJiB3ZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2ViU29ja2V0TWFuYWdlciBzZW5kaW5nIG1lc3NhZ2UnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIHdlYlNvY2tldC5zZW5kKHBheWxvYWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IG9wZW5cIik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlVG9waWNzID0gZnVuY3Rpb24odG9waWNzKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydE5vdE51bGwodG9waWNzLCAndG9waWNzJyk7XG4gICAgICAgIFV0aWxzLmFzc2VydElzTGlzdCh0b3BpY3MpO1xuXG4gICAgICAgIHRvcGljcy5mb3JFYWNoKGZ1bmN0aW9uICh0b3BpYykge1xuICAgICAgICAgICAgdG9waWNTdWJzY3JpcHRpb24ucGVuZGluZy5hZGQodG9waWMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAod2ViU29ja2V0ICYmIHdlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgd2ViU29ja2V0LnNlbmQoY3JlYXRlV2ViU29ja2V0UGF5bG9hZChST1VURV9LRVkuU1VCU0NSSUJFLCB7XCJ0b3BpY3NcIjogdG9waWNzfSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHZhbGlkV2ViU29ja2V0Q29ubkNvbmZpZyA9IGZ1bmN0aW9uIChjb25uQ29uZmlnKSB7XG4gICAgICAgIGlmIChVdGlscy5pc09iamVjdChjb25uQ29uZmlnKSAmJiBVdGlscy5pc09iamVjdChjb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydClcbiAgICAgICAgICAgICYmIFV0aWxzLmlzU3RyaW5nKGNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnVybClcbiAgICAgICAgICAgICYmIFV0aWxzLnZhbGlkV1NVcmwoY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKVxuICAgICAgICAgICAgJiYgVXRpbHMuaXNOdW1iZXIoY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMpICYmXG4gICAgICAgICAgICBjb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcyA+PSBNSU5fV0VCU09DS0VUX0xJRkVUSU1FKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoXCJJbnZhbGlkIFdlYlNvY2tldCBDb25uZWN0aW9uIENvbmZpZ3VyYXRpb25cIiwgY29ubkNvbmZpZyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSBudWxsO1xuICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUhhbmRsZSA9IGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQoKTtcbiAgICAgICAgd2ViU29ja2V0Q29uZmlnLnByb21pc2VIYW5kbGVcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU3VjY2Vzc2Z1bGx5IGZldGNoZWQgd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZFdlYlNvY2tldENvbm5Db25maWcocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VXZWJTb2NrZXQoXCJSZXN0YXJ0aW5nIFdlYlNvY2tldCBNYW5hZ2VyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5pdFdlYlNvY2tldCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIiwgcmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFdlYlNvY2tldENvbm5lY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5pdFdlYlNvY2tldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmVjb25uZWN0Q29uZmlnLndlYnNvY2tldEluaXRGYWlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoXCJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodmFsaWRXZWJTb2NrZXRDb25uQ29uZmlnKHdlYlNvY2tldENvbmZpZy5jb25uQ29uZmlnKSkge1xuXG4gICAgICAgICAgICAgICAgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25maWcuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgd2ViU29ja2V0T25PcGVuKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgd2ViU29ja2V0T25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHdlYlNvY2tldE9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgd2ViU29ja2V0T25DbG9zZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgSW5pdGlhbGl6aW5nIHdlYi1zb2NrZXQtbWFuYWdlclwiLCBlcnJvcik7XG4gICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db25uZWN0aW9uR2FpbiA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLmNvbm5lY3Rpb25HYWluLmFkZChjYik7XG4gICAgICAgIGlmICh3ZWJTb2NrZXQgJiYgd2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3MuY29ubmVjdGlvbkdhaW4uZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db25uZWN0aW9uTG9zdCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLmNvbm5lY3Rpb25Mb3N0LmFkZChjYik7XG4gICAgICAgIGlmICh3ZWJTb2NrZXQgJiYgd2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IGNhbGxiYWNrcy5jb25uZWN0aW9uTG9zdC5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkluaXRGYWlsdXJlID0gZnVuY3Rpb24oY2IpIHtcbiAgICAgICAgVXRpbHMuYXNzZXJ0VHJ1ZShVdGlscy5pc0Z1bmN0aW9uKGNiKSwgJ2NiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICBjYWxsYmFja3MuaW5pdEZhaWx1cmUuYWRkKGNiKTtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkKSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3MuaW5pdEZhaWx1cmUuZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5pdCA9IGZ1bmN0aW9uKHRyYW5zcG9ydEhhbmRsZSkge1xuICAgICAgICBVdGlscy5hc3NlcnRUcnVlKFV0aWxzLmlzRnVuY3Rpb24odHJhbnNwb3J0SGFuZGxlKSwgJ3RyYW5zcG9ydEhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiV2ViIFNvY2tldCBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQgPSB0cmFuc3BvcnRIYW5kbGU7XG5cbiAgICAgICAgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZygpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN1YnNjcmlwdGlvblVwZGF0ZSA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQoY2IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FsbGJhY2tzLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN1YnNjcmlwdGlvbkZhaWx1cmUgPSBmdW5jdGlvbihjYikge1xuICAgICAgICBVdGlscy5hc3NlcnRUcnVlKFV0aWxzLmlzRnVuY3Rpb24oY2IpLCAnY2IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIGNhbGxiYWNrcy5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZChjYik7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3Muc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbk1lc3NhZ2UgPSBmdW5jdGlvbih0b3BpY05hbWUsIGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydE5vdE51bGwodG9waWNOYW1lLCAndG9waWNOYW1lJyk7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy50b3BpYy5oYXModG9waWNOYW1lKSkge1xuICAgICAgICAgICAgY2FsbGJhY2tzLnRvcGljLmdldCh0b3BpY05hbWUpLmFkZChjYik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFja3MudG9waWMuc2V0KHRvcGljTmFtZSwgbmV3IFNldChbY2JdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IGNhbGxiYWNrcy50b3BpYy5nZXQodG9waWNOYW1lKS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkFsbE1lc3NhZ2UgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgVXRpbHMuYXNzZXJ0VHJ1ZShVdGlscy5pc0Z1bmN0aW9uKGNiKSwgJ2NiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICBjYWxsYmFja3MuYWxsTWVzc2FnZS5hZGQoY2IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FsbGJhY2tzLmFsbE1lc3NhZ2UuZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gaW5pdDtcbiAgICB0aGlzLm9uSW5pdEZhaWx1cmUgPSBvbkluaXRGYWlsdXJlO1xuICAgIHRoaXMub25Db25uZWN0aW9uR2FpbiA9IG9uQ29ubmVjdGlvbkdhaW47XG4gICAgdGhpcy5vbkNvbm5lY3Rpb25Mb3N0ID0gb25Db25uZWN0aW9uTG9zdDtcbiAgICB0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlID0gb25TdWJzY3JpcHRpb25VcGRhdGU7XG4gICAgdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmUgPSBvblN1YnNjcmlwdGlvbkZhaWx1cmU7XG4gICAgdGhpcy5vbk1lc3NhZ2UgPSBvbk1lc3NhZ2U7XG4gICAgdGhpcy5vbkFsbE1lc3NhZ2UgPSBvbkFsbE1lc3NhZ2U7XG4gICAgdGhpcy5zdWJzY3JpYmVUb3BpY3MgPSBzdWJzY3JpYmVUb3BpY3M7XG4gICAgdGhpcy5zZW5kTWVzc2FnZSA9IHNlbmRNZXNzYWdlO1xuXG4gICAgdGhpcy5jbG9zZVdlYlNvY2tldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNldFN0YXRlKCk7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwobmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIpO1xuICAgICAgICBjbG9zZVdlYlNvY2tldChcIlVzZXIgcmVxdWVzdCB0byBjbG9zZSBXZWJTb2NrZXRcIik7XG4gICAgfTtcbn07XG5cbmNvbnN0IFdlYlNvY2tldE1hbmFnZXJDb25zdHJ1Y3RvciA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFdlYlNvY2tldE1hbmFnZXIoKTtcbn07XG5cbmNvbnN0IHNldEdsb2JhbENvbmZpZyA9IGNvbmZpZyA9PiB7XG4gICAgY29uc3QgbG9nZ2VyQ29uZmlnID0gY29uZmlnLmxvZ2dlckNvbmZpZztcbiAgICBMb2dNYW5hZ2VyLnVwZGF0ZUxvZ2dlckNvbmZpZyhsb2dnZXJDb25maWcpO1xufTtcblxuY29uc3QgV2ViU29ja2V0TWFuYWdlck9iamVjdCA9IHtcbiAgICBjcmVhdGU6IFdlYlNvY2tldE1hbmFnZXJDb25zdHJ1Y3RvcixcbiAgICBzZXRHbG9iYWxDb25maWc6IHNldEdsb2JhbENvbmZpZyxcbiAgICBMb2dMZXZlbDogTG9nTGV2ZWwsXG4gICAgTG9nZ2VyOiBMb2dnZXJcbn07XG5cbmV4cG9ydCB7IFdlYlNvY2tldE1hbmFnZXJPYmplY3QgfTsiLCIvKiBnbG9iYWwgd2luZG93LCBleHBvcnRzLCBkZWZpbmUgKi9cblxuIWZ1bmN0aW9uKCkge1xuICAgICd1c2Ugc3RyaWN0J1xuXG4gICAgdmFyIHJlID0ge1xuICAgICAgICBub3Rfc3RyaW5nOiAvW15zXS8sXG4gICAgICAgIG5vdF9ib29sOiAvW150XS8sXG4gICAgICAgIG5vdF90eXBlOiAvW15UXS8sXG4gICAgICAgIG5vdF9wcmltaXRpdmU6IC9bXnZdLyxcbiAgICAgICAgbnVtYmVyOiAvW2RpZWZnXS8sXG4gICAgICAgIG51bWVyaWNfYXJnOiAvW2JjZGllZmd1eFhdLyxcbiAgICAgICAganNvbjogL1tqXS8sXG4gICAgICAgIG5vdF9qc29uOiAvW15qXS8sXG4gICAgICAgIHRleHQ6IC9eW15cXHgyNV0rLyxcbiAgICAgICAgbW9kdWxvOiAvXlxceDI1ezJ9LyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IC9eXFx4MjUoPzooWzEtOV1cXGQqKVxcJHxcXCgoW14pXSspXFwpKT8oXFwrKT8oMHwnW14kXSk/KC0pPyhcXGQrKT8oPzpcXC4oXFxkKykpPyhbYi1naWpvc3RUdXZ4WF0pLyxcbiAgICAgICAga2V5OiAvXihbYS16X11bYS16X1xcZF0qKS9pLFxuICAgICAgICBrZXlfYWNjZXNzOiAvXlxcLihbYS16X11bYS16X1xcZF0qKS9pLFxuICAgICAgICBpbmRleF9hY2Nlc3M6IC9eXFxbKFxcZCspXFxdLyxcbiAgICAgICAgc2lnbjogL15bKy1dL1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNwcmludGYoa2V5KSB7XG4gICAgICAgIC8vIGBhcmd1bWVudHNgIGlzIG5vdCBhbiBhcnJheSwgYnV0IHNob3VsZCBiZSBmaW5lIGZvciB0aGlzIGNhbGxcbiAgICAgICAgcmV0dXJuIHNwcmludGZfZm9ybWF0KHNwcmludGZfcGFyc2Uoa2V5KSwgYXJndW1lbnRzKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZzcHJpbnRmKGZtdCwgYXJndikge1xuICAgICAgICByZXR1cm4gc3ByaW50Zi5hcHBseShudWxsLCBbZm10XS5jb25jYXQoYXJndiB8fCBbXSkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50Zl9mb3JtYXQocGFyc2VfdHJlZSwgYXJndikge1xuICAgICAgICB2YXIgY3Vyc29yID0gMSwgdHJlZV9sZW5ndGggPSBwYXJzZV90cmVlLmxlbmd0aCwgYXJnLCBvdXRwdXQgPSAnJywgaSwgaywgcGgsIHBhZCwgcGFkX2NoYXJhY3RlciwgcGFkX2xlbmd0aCwgaXNfcG9zaXRpdmUsIHNpZ25cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyZWVfbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gcGFyc2VfdHJlZVtpXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBhcnNlX3RyZWVbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcGggPSBwYXJzZV90cmVlW2ldIC8vIGNvbnZlbmllbmNlIHB1cnBvc2VzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAocGgua2V5cykgeyAvLyBrZXl3b3JkIGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbY3Vyc29yXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcGgua2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignW3NwcmludGZdIENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgXCIlc1wiIG9mIHVuZGVmaW5lZCB2YWx1ZSBcIiVzXCInLCBwaC5rZXlzW2tdLCBwaC5rZXlzW2stMV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnW3BoLmtleXNba11dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGgucGFyYW1fbm8pIHsgLy8gcG9zaXRpb25hbCBhcmd1bWVudCAoZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbcGgucGFyYW1fbm9dXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChpbXBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3IrK11cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubm90X3R5cGUudGVzdChwaC50eXBlKSAmJiByZS5ub3RfcHJpbWl0aXZlLnRlc3QocGgudHlwZSkgJiYgYXJnIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubnVtZXJpY19hcmcudGVzdChwaC50eXBlKSAmJiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgJiYgaXNOYU4oYXJnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJVQnLCBhcmcpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBpc19wb3NpdGl2ZSA9IGFyZyA+PSAwXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwaC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMCkudG9TdHJpbmcoMilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhcmcsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdqJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IEpTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgcGgud2lkdGggPyBwYXJzZUludChwaC53aWR0aCkgOiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbChwaC5wcmVjaXNpb24pIDogcGFyc2VGbG9hdChhcmcpLnRvRXhwb25lbnRpYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBwYXJzZUZsb2F0KGFyZykudG9GaXhlZChwaC5wcmVjaXNpb24pIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IFN0cmluZyhOdW1iZXIoYXJnLnRvUHJlY2lzaW9uKHBoLnByZWNpc2lvbikpKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyhhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcoISFhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMCkgPj4+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZygxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlLmpzb24udGVzdChwaC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gYXJnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmUubnVtYmVyLnRlc3QocGgudHlwZSkgJiYgKCFpc19wb3NpdGl2ZSB8fCBwaC5zaWduKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGlzX3Bvc2l0aXZlID8gJysnIDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudG9TdHJpbmcoKS5yZXBsYWNlKHJlLnNpZ24sICcnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFkX2NoYXJhY3RlciA9IHBoLnBhZF9jaGFyID8gcGgucGFkX2NoYXIgPT09ICcwJyA/ICcwJyA6IHBoLnBhZF9jaGFyLmNoYXJBdCgxKSA6ICcgJ1xuICAgICAgICAgICAgICAgICAgICBwYWRfbGVuZ3RoID0gcGgud2lkdGggLSAoc2lnbiArIGFyZykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHBhZCA9IHBoLndpZHRoID8gKHBhZF9sZW5ndGggPiAwID8gcGFkX2NoYXJhY3Rlci5yZXBlYXQocGFkX2xlbmd0aCkgOiAnJykgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gcGguYWxpZ24gPyBzaWduICsgYXJnICsgcGFkIDogKHBhZF9jaGFyYWN0ZXIgPT09ICcwJyA/IHNpZ24gKyBwYWQgKyBhcmcgOiBwYWQgKyBzaWduICsgYXJnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgdmFyIHNwcmludGZfY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX3BhcnNlKGZtdCkge1xuICAgICAgICBpZiAoc3ByaW50Zl9jYWNoZVtmbXRdKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZtdCA9IGZtdCwgbWF0Y2gsIHBhcnNlX3RyZWUgPSBbXSwgYXJnX25hbWVzID0gMFxuICAgICAgICB3aGlsZSAoX2ZtdCkge1xuICAgICAgICAgICAgaWYgKChtYXRjaCA9IHJlLnRleHQuZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2gobWF0Y2hbMF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5tb2R1bG8uZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2goJyUnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gcmUucGxhY2Vob2xkZXIuZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnX25hbWVzIHw9IDFcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkX2xpc3QgPSBbXSwgcmVwbGFjZW1lbnRfZmllbGQgPSBtYXRjaFsyXSwgZmllbGRfbWF0Y2ggPSBbXVxuICAgICAgICAgICAgICAgICAgICBpZiAoKGZpZWxkX21hdGNoID0gcmUua2V5LmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZXBsYWNlbWVudF9maWVsZCA9IHJlcGxhY2VtZW50X2ZpZWxkLnN1YnN0cmluZyhmaWVsZF9tYXRjaFswXS5sZW5ndGgpKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZpZWxkX21hdGNoID0gcmUua2V5X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoZmllbGRfbWF0Y2ggPSByZS5pbmRleF9hY2Nlc3MuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXknKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gZmllbGRfbGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnX25hbWVzIHw9IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFyZ19uYW1lcyA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG1hdGNoWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fbm86ICAgIG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogICAgICAgIG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbjogICAgICAgIG1hdGNoWzNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkX2NoYXI6ICAgIG1hdGNoWzRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICAgICAgIG1hdGNoWzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICAgICAgIG1hdGNoWzZdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAgIG1hdGNoWzddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgIG1hdGNoWzhdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSB1bmV4cGVjdGVkIHBsYWNlaG9sZGVyJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9mbXQgPSBfZm10LnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwcmludGZfY2FjaGVbZm10XSA9IHBhcnNlX3RyZWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHBvcnQgdG8gZWl0aGVyIGJyb3dzZXIgb3Igbm9kZS5qc1xuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG4gICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzWydzcHJpbnRmJ10gPSBzcHJpbnRmXG4gICAgICAgIGV4cG9ydHNbJ3ZzcHJpbnRmJ10gPSB2c3ByaW50ZlxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93WydzcHJpbnRmJ10gPSBzcHJpbnRmXG4gICAgICAgIHdpbmRvd1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICdzcHJpbnRmJzogc3ByaW50ZixcbiAgICAgICAgICAgICAgICAgICAgJ3ZzcHJpbnRmJzogdnNwcmludGZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgcXVvdGUtcHJvcHMgKi9cbn0oKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuIiwiLyplc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIqL1xuaW1wb3J0IHsgV2ViU29ja2V0TWFuYWdlck9iamVjdCB9IGZyb20gXCIuL3dlYlNvY2tldE1hbmFnZXJcIjtcblxuZ2xvYmFsLmNvbm5lY3QgPSBnbG9iYWwuY29ubmVjdCB8fCB7fTtcbmNvbm5lY3QuV2ViU29ja2V0TWFuYWdlciA9IFdlYlNvY2tldE1hbmFnZXJPYmplY3Q7XG5cbmV4cG9ydCBjb25zdCBXZWJTb2NrZXRNYW5hZ2VyID0gV2ViU29ja2V0TWFuYWdlck9iamVjdDtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0= - +!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=2)}([function(e,n,t){"use strict";var r=t(1);function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i={assertTrue:function(e,n){if(!e)throw new Error(n)},assertNotNull:function(e,n){return i.assertTrue(null!==e&&void 0!==o(e),Object(r.sprintf)("%s must be provided",n||"A value")),e},isNonEmptyString:function(e){return"string"==typeof e&&e.length>0},assertIsList:function(e,n){if(!Array.isArray(e))throw new Error(n+" is not an array")},isFunction:function(e){return!!(e&&e.constructor&&e.call&&e.apply)},isObject:function(e){return!("object"!==o(e)||null===e)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e}},c=new RegExp("^(wss://)\\w*");i.validWSUrl=function(e){return c.test(e)},i.getSubscriptionResponse=function(e,n,t){return{topic:e,content:{status:n?"success":"failure",topics:t}}},i.assertIsObject=function(e,n){if(!i.isObject(e))throw new Error(n+" is not an object!")},i.addJitter=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;n=Math.min(n,1);var t=Math.random()>.5?1:-1;return Math.floor(e+t*e*Math.random()*n)},i.isNetworkOnline=function(){return navigator.onLine};var s=i,a="NULL",u="CLIENT_LOGGER",l="DEBUG",f="aws/subscribe",p="aws/unsubscribe",d="aws/heartbeat",b="connected",g="disconnected";function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function S(e,n){return!n||"object"!==y(n)&&"function"!=typeof n?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):n}function k(e){return(k=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,n){return(v=Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,n)}function h(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function m(e,n){for(var t=0;t=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var n=e.prefix||"";return this._logsDestination===l?this.consoleLoggerWrapper:new N(n)}},{key:"updateLoggerConfig",value:function(e){var n=e||{};this._level=n.level||I.DEBUG,this._clientLogger=n.logger||null,this._logsDestination=a,n.debug&&(this._logsDestination=l),n.logger&&(this._logsDestination=u)}}]),e}(),O=function(){function e(){h(this,e)}return w(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),e}(),N=function(e){function n(e){var t;return h(this,n),(t=S(this,k(n).call(this))).prefix=e||"",t}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),n&&v(e,n)}(n,O),w(n,[{key:"debug",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t0&&void 0!==arguments[0]?arguments[0]:"";e.debug("["+n+"] Primary WebSocket: "+k(t.primary)+" | Secondary WebSocket: "+k(t.secondary))},h=function(e,n){return e&&e.readyState===n},m=function(e){return h(e,WebSocket.OPEN)},w=function(e){return null===e||void 0===e.readyState||h(e,WebSocket.CLOSED)},C=function(){return null!==t.secondary?t.secondary:t.primary},I=function(){return m(C())},T=function(){if(o.pendingResponse)return e.warn("Heartbeat response not received"),clearInterval(o.intervalHandle),o.pendingResponse=!1,void G();I()?(e.debug("Sending heartbeat"),C().send(D(d)),o.pendingResponse=!0):(e.warn("Failed to send heartbeat since WebSocket is not open"),v("sendHeartBeat"),G())},O=function(){r.exponentialBackOffTime=1e3,o.pendingResponse=!1,r.reconnectWebSocket=!0,clearTimeout(r.lifeTimeTimeoutHandle),clearInterval(o.intervalHandle),clearTimeout(r.exponentialTimeoutHandle),clearTimeout(r.webSocketInitCheckerTimeoutId)},N=function(){u.consecutiveFailedSubscribeAttempts=0,u.consecutiveNoResponseRequest=0,clearInterval(u.responseCheckIntervalId),clearInterval(u.reSubscribeIntervalId)},_=function(){try{e.info("WebSocket connection established!"),v("webSocketOnOpen"),r.connState=b,null===t.secondary&&S(i.connectionGain),O(),0===a.subscribed.size&&m(t.secondary)&&j(t.primary,"[Primary WebSocket] Closing WebSocket"),(a.subscribed.size>0||a.pending.size>0)&&(m(t.secondary)&&e.info("Subscribing secondary websocket to topics of primary websocket"),a.subscribed.forEach(function(e){a.subscriptionHistory.add(e),a.pending.add(e)}),a.subscribed.clear(),F()),T(),o.intervalHandle=setInterval(T,1e4),r.lifeTimeTimeoutHandle=setTimeout(function(){e.debug("Starting scheduled WebSocket manager reconnect"),G()},Date.parse(c.connConfig.webSocketTransport.expiry)-Date.now())}catch(n){e.error("Error after establishing WebSocket connection",n)}},E=function(n){e.info("Socket connection is closed",n),v("webSocketOnClose before-cleanup"),w(t.primary)&&(t.primary=null),w(t.secondary)&&(t.secondary=null),r.reconnectWebSocket&&(m(t.primary)||m(t.secondary)?w(t.primary)&&m(t.secondary)&&(e.info("[Primary] WebSocket Cleanly Closed"),t.primary=t.secondary,t.secondary=null):(e.warn("Neither primary websocket and nor secondary websocket have open connections, attempting to re-establish connection"),r.connState!==g?S(i.connectionLost):e.info("Ignoring connectionLost callback invocation"),r.connState=g,G()),v("webSocketOnClose after-cleanup"))},L=function(n){v("webSocketOnError"),e.error("WebSocketManager Error, error_event: ",n),G()},x=function(n){var r=JSON.parse(n.data);switch(r.topic){case f:if(e.debug("Subscription Message received from webSocket server",n.data),u.requestCompleted=!0,u.consecutiveNoResponseRequest=0,"success"===r.content.status)u.consecutiveFailedSubscribeAttempts=0,r.content.topics.forEach(function(e){a.subscriptionHistory.delete(e),a.pending.delete(e),a.subscribed.add(e)}),0===a.subscriptionHistory.size?m(t.secondary)&&(e.info("Successfully subscribed secondary websocket to all topics of primary websocket"),j(t.primary,"[Primary WebSocket] Closing WebSocket")):F(),S(i.subscriptionUpdate,r);else{if(clearInterval(u.reSubscribeIntervalId),++u.consecutiveFailedSubscribeAttempts,5===u.consecutiveFailedSubscribeAttempts)return S(i.subscriptionFailure,r),void(u.consecutiveFailedSubscribeAttempts=0);u.reSubscribeIntervalId=setInterval(function(){F()},500)}break;case d:e.debug("Heartbeat response received"),o.pendingResponse=!1;break;default:if(r.topic){if(e.debug("Message received for topic "+r.topic),m(t.primary)&&m(t.secondary)&&0===a.subscriptionHistory.size&&this===t.primary)return void e.warn("Ignoring Message for Topic "+r.topic+", to avoid duplicates");if(0===i.allMessage.size&&0===i.topic.size)return void e.warn("No registered callback listener for Topic",r.topic);S(i.allMessage,r),i.topic.has(r.topic)&&S(i.topic.get(r.topic),r)}else r.message?e.warn("WebSocketManager Message Error",r):e.warn("Invalid incoming message",r)}},F=function n(){if(u.consecutiveNoResponseRequest>3)return e.warn("Ignoring subscribePendingTopics since we have exhausted max subscription retries with no response"),void S(i.subscriptionFailure,s.getSubscriptionResponse(f,!1,Array.from(a.pending)));I()?(clearInterval(u.responseCheckIntervalId),C().send(D(f,{topics:Array.from(a.pending)})),u.requestCompleted=!1,u.responseCheckIntervalId=setInterval(function(){u.requestCompleted||(++u.consecutiveNoResponseRequest,n())},1e3)):e.warn("Ignoring subscribePendingTopics call since Default WebSocket is not open")},j=function(n,t){h(n,WebSocket.CONNECTING)||h(n,WebSocket.OPEN)?n.close(1e3,t):e.warn("Ignoring WebSocket Close request, WebSocket State: "+k(n))},R=function(e){j(t.primary,"[Primary] WebSocket "+e),j(t.secondary,"[Secondary] WebSocket "+e)},M=function(){var n=s.addJitter(r.exponentialBackOffTime,.3);Date.now()+n<=c.connConfig.urlConnValidTime?(e.debug("Scheduling WebSocket reinitialization, after delay "+n+" ms"),r.exponentialTimeoutHandle=setTimeout(function(){return A()},n),r.exponentialBackOffTime*=2):(e.warn("WebSocket URL is cannot be used to establish connection"),G())},P=function(){O(),N(),e.error("WebSocket Initialization failed"),r.websocketInitFailed=!0,R("Terminating WebSocket Manager"),clearInterval(y),S(i.initFailure)},D=function(e,n){return JSON.stringify({topic:e,content:n})},H=function(n){return!!(s.isObject(n)&&s.isObject(n.webSocketTransport)&&s.isNonEmptyString(n.webSocketTransport.url)&&s.validWSUrl(n.webSocketTransport.url)&&s.isNonEmptyString(n.webSocketTransport.expiry)&&Date.parse(n.webSocketTransport.expiry)-Date.now()>=36e5)||(e.error("Invalid WebSocket Connection Configuration",n),!1)},G=function n(){if(s.isNetworkOnline())if(r.websocketInitFailed)e.debug("WebSocket Init had failed, ignoring this getWebSocketConnConfig request");else{if(c.promiseCompleted)return O(),e.info("Fetching new WebSocket connection configuration"),c.promiseCompleted=!1,c.promiseHandle=i.getWebSocketTransport(),c.promiseHandle.then(function(n){c.promiseCompleted=!0,e.debug("Successfully fetched webSocket connection configuration",n),H(n)?(c.connConfig=n,c.connConfig.urlConnValidTime=Date.now()+85e3,A()):P()},function(t){c.promiseCompleted=!0,e.error("Failed to fetch webSocket connection configuration",t),setTimeout(function(){return n()},s.addJitter(5e3,.3))});e.debug("There is an ongoing getWebSocketConnConfig request, this request will be ignored")}else e.info("Network offline, ignoring this getWebSocketConnConfig request")},A=function(){if(r.websocketInitFailed)e.info("web-socket initializing had failed, aborting re-init");else if(s.isNetworkOnline()){e.info("Initializing Websocket Manager"),v("initWebSocket");try{if(H(c.connConfig)){var n=null;m(t.primary)?(e.debug("Primary Socket connection is already open"),h(t.secondary,WebSocket.CONNECTING)||(e.debug("Establishing a secondary web-socket connection"),t.secondary=U()),n=t.secondary):(h(t.primary,WebSocket.CONNECTING)||(e.debug("Establishing a primary web-socket connection"),t.primary=U()),n=t.primary),r.webSocketInitCheckerTimeoutId=setTimeout(function(){m(n)||M()},1e3)}}catch(n){e.error("Error Initializing web-socket-manager",n),P()}}else e.warn("System is offline aborting web-socket init")},U=function(){var e=new WebSocket(c.connConfig.webSocketTransport.url);return e.addEventListener("open",_),e.addEventListener("message",x),e.addEventListener("error",L),e.addEventListener("close",E),e};this.init=function(n){if(s.assertTrue(s.isFunction(n),"transportHandle must be a function"),null===i.getWebSocketTransport)return i.getWebSocketTransport=n,G();e.warn("Web Socket Manager was already initialized")},this.onInitFailure=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.initFailure.add(e),r.websocketInitFailed&&e(),function(){return i.initFailure.delete(e)}},this.onConnectionGain=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.connectionGain.add(e),I()&&e(),function(){return i.connectionGain.delete(e)}},this.onConnectionLost=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.connectionLost.add(e),r.connState===g&&e(),function(){return i.connectionLost.delete(e)}},this.onSubscriptionUpdate=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.subscriptionUpdate.add(e),function(){return i.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.subscriptionFailure.add(e),function(){return i.subscriptionFailure.delete(e)}},this.onMessage=function(e,n){return s.assertNotNull(e,"topicName"),s.assertTrue(s.isFunction(n),"cb must be a function"),i.topic.has(e)?i.topic.get(e).add(n):i.topic.set(e,new Set([n])),function(){return i.topic.get(e).delete(n)}},this.onAllMessage=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.allMessage.add(e),function(){return i.allMessage.delete(e)}},this.subscribeTopics=function(e){s.assertNotNull(e,"topics"),s.assertIsList(e),e.forEach(function(e){a.subscribed.has(e)||a.pending.add(e)}),u.consecutiveNoResponseRequest=0,F()},this.sendMessage=function(n){if(s.assertIsObject(n,"payload"),void 0===n.topic||l.has(n.topic))e.warn("Cannot send message, Invalid topic",n);else{try{n=JSON.stringify(n)}catch(t){return void e.warn("Error stringify message",n)}I()?C().send(n):e.warn("Cannot send message, web socket connection is not open")}},this.closeWebSocket=function(){O(),N(),r.reconnectWebSocket=!1,clearInterval(y),R("User request to close WebSocket")}},L={create:function(){return new E},setGlobalConfig:function(e){var n=e.loggerConfig;W.updateLoggerConfig(n)},LogLevel:I,Logger:C}},function(e,n,t){var r;!function(){"use strict";var o={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(e){return function(e,n){var t,r,c,s,a,u,l,f,p,d=1,b=e.length,g="";for(r=0;r=0),s.type){case"b":t=parseInt(t,10).toString(2);break;case"c":t=String.fromCharCode(parseInt(t,10));break;case"d":case"i":t=parseInt(t,10);break;case"j":t=JSON.stringify(t,null,s.width?parseInt(s.width):0);break;case"e":t=s.precision?parseFloat(t).toExponential(s.precision):parseFloat(t).toExponential();break;case"f":t=s.precision?parseFloat(t).toFixed(s.precision):parseFloat(t);break;case"g":t=s.precision?String(Number(t.toPrecision(s.precision))):parseFloat(t);break;case"o":t=(parseInt(t,10)>>>0).toString(8);break;case"s":t=String(t),t=s.precision?t.substring(0,s.precision):t;break;case"t":t=String(!!t),t=s.precision?t.substring(0,s.precision):t;break;case"T":t=Object.prototype.toString.call(t).slice(8,-1).toLowerCase(),t=s.precision?t.substring(0,s.precision):t;break;case"u":t=parseInt(t,10)>>>0;break;case"v":t=t.valueOf(),t=s.precision?t.substring(0,s.precision):t;break;case"x":t=(parseInt(t,10)>>>0).toString(16);break;case"X":t=(parseInt(t,10)>>>0).toString(16).toUpperCase()}o.json.test(s.type)?g+=t:(!o.number.test(s.type)||f&&!s.sign?p="":(p=f?"+":"-",t=t.toString().replace(o.sign,"")),u=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",l=s.width-(p+t).length,a=s.width&&l>0?u.repeat(l):"",g+=s.align?p+t+a:"0"===u?p+a+t:a+p+t)}return g}(function(e){if(s[e])return s[e];var n,t=e,r=[],i=0;for(;t;){if(null!==(n=o.text.exec(t)))r.push(n[0]);else if(null!==(n=o.modulo.exec(t)))r.push("%");else{if(null===(n=o.placeholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");if(n[2]){i|=1;var c=[],a=n[2],u=[];if(null===(u=o.key.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(c.push(u[1]);""!==(a=a.substring(u[0].length));)if(null!==(u=o.key_access.exec(a)))c.push(u[1]);else{if(null===(u=o.index_access.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");c.push(u[1])}n[2]=c}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:n[0],param_no:n[1],keys:n[2],sign:n[3],pad_char:n[4],align:n[5],width:n[6],precision:n[7],type:n[8]})}t=t.substring(n[0].length)}return s[e]=r}(e),arguments)}function c(e,n){return i.apply(null,[e].concat(n||[]))}var s=Object.create(null);n.sprintf=i,n.vsprintf=c,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=c,void 0===(r=function(){return{sprintf:i,vsprintf:c}}.call(n,t,n,e))||(e.exports=r))}()},function(e,n,t){"use strict";t.r(n),function(e){t.d(n,"WebSocketManager",function(){return o});var r=t(0);e.connect=e.connect||{},connect.WebSocketManager=r.a;var o=r.a}.call(this,t(3))},function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(e){"object"==typeof window&&(t=window)}e.exports=t}]); +//# sourceMappingURL=amazon-connect-websocket-manager.js.map /* * Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * @@ -24423,6 +24418,8 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi connect.core.initialized = false; + connect.version = "1.4.8"; + connect.DEFAULT_BATCH_SIZE = 100; var CCP_SYN_TIMEOUT = 1000; // 1 sec @@ -24846,6 +24843,18 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi // Build the upstream conduit communicating with the CCP iframe. var conduit = new connect.IFrameConduit(params.ccpUrl, window, iframe); + // Let CCP know if iframe is visible + iframe.onload = setTimeout(function() { + var style = window.getComputedStyle(iframe, null); + var data = { + display: style.display, + offsetWidth: iframe.offsetWidth, + offsetHeight: iframe.offsetHeight, + clientRectsLength: iframe.getClientRects().length + }; + conduit.sendUpstream(connect.EventType.IFRAME_STYLE, data); + }, 10000); + // Set the global upstream conduit for external use. connect.core.upstream = conduit; @@ -25430,12 +25439,6 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi }; connect.core.popupManager = new connect.PopupManager(); - /**-----------------------------------------------------------------------*/ - connect.core.getPopupManager = function () { - return connect.core.popupManager; - }; - connect.core.popupManager = new connect.PopupManager(); - /**-----------------------------------------------------------------------*/ connect.core.getUpstream = function () { if (!connect.core.upstream) { @@ -25694,7 +25697,7 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi }, failure: function (reason) { if (reason.message && reason.message.includes("SoftphoneConnectionLimitBreachedException")) { - publishError("multiple_softphone_active_sessions", "Number of active sessions are more then allowed limit."); + publishError("multiple_softphone_active_sessions", "Number of active sessions are more then allowed limit.", ""); } reject(Error("requestIceAccess failed")); }, @@ -26444,28 +26447,6 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi self.initData = data; connect.core.init(data); - // Start polling for agent data. - if (!self.agentPolling) { - connect.getLog().info("Kicking off agent polling"); - self.agentPolling = true; - self.pollForAgent(); - } else { - connect.getLog().info("Not kicking off new agent polling, since there's already polling going on"); - } - if (!self.configPolling) { - connect.getLog().info("Kicking off config polling"); - self.configPolling = true; - self.pollForAgentConfiguration({ repeatForever: true }); - } else { - connect.getLog().info("Not kicking off new config polling, since there's already polling going on"); - } - if (!global.checkAuthTokenInterval) { - connect.getLog().info("Kicking off auth token polling"); - global.checkAuthTokenInterval = global.setInterval(connect.hitch(self, self.checkAuthToken), CHECK_AUTH_TOKEN_INTERVAL_MS); - } else { - connect.getLog().info("Not kicking off auth token polling, since there's already polling going on"); - } - // init only once. if (!webSocketManager) { @@ -26509,7 +26490,17 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi webSocketManager.subscribeTopics(topics); }); - webSocketManager.init(connect.hitch(self, self.getWebSocketUrl)); + webSocketManager.init(connect.hitch(self, self.getWebSocketUrl)).then(function() { + // Start polling for agent data. + connect.getLog().info("Kicking off agent polling"); + self.pollForAgent(); + + connect.getLog().info("Kicking off config polling"); + self.pollForAgentConfiguration({ repeatForever: true }); + + connect.getLog().info("Kicking off auth token polling"); + global.setInterval(connect.hitch(self, self.checkAuthToken), CHECK_AUTH_TOKEN_INTERVAL_MS); + }); } else { connect.getLog().info("Not Creating a Websocket instance, since there's already one exist"); } @@ -26598,7 +26589,6 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi } }, authFailure: function () { - self.agentPolling = false; onAuthFail(); }, accessDenied: connect.hitch(self, self.handleAccessDenied) @@ -26639,7 +26629,6 @@ AWS.apiLoader.services['sts']['2011-06-15'] = require('../apis/sts-2011-06-15.mi } }, authFailure: function () { - self.configPolling = false; onAuthFail(); }, accessDenied: connect.hitch(self, self.handleAccessDenied) diff --git a/src/api.js b/src/api.js index 869bd817..07f501b4 100644 --- a/src/api.js +++ b/src/api.js @@ -530,6 +530,10 @@ return this._getData().type; }; + Contact.prototype.getContactDuration = function() { + return this._getData().contactDuration; + } + Contact.prototype.getState = function () { return this._getData().state; }; @@ -863,6 +867,14 @@ } } + // Method for checking whether this connection is an agent-side connection + // (type AGENT or MONITORING) + Connection.prototype._isAgentConnectionType = function () { + var connectionType = this.getType(); + return connectionType === connect.ConnectionType.AGENT + || connectionType === connect.ConnectionType.MONITORING; + } + /** * Utility method for checking whether this connection is an agent-side connection * (type AGENT or MONITORING) diff --git a/src/aws-client.js b/src/aws-client.js index 2d231af4..cbb9d23d 100644 --- a/src/aws-client.js +++ b/src/aws-client.js @@ -1018,7 +1018,8 @@ module.exports={ }, "attributes": { "shape": "S2c" - } + }, + "contactDuration": {} } } }, diff --git a/src/core.js b/src/core.js index 16ba690b..23f0d96c 100644 --- a/src/core.js +++ b/src/core.js @@ -13,6 +13,8 @@ connect.core.initialized = false; + connect.version = "STREAMS_VERSION"; + connect.DEFAULT_BATCH_SIZE = 100; var CCP_SYN_TIMEOUT = 1000; // 1 sec diff --git a/src/lib/amazon-connect-websocket-manager.js b/src/lib/amazon-connect-websocket-manager.js index 1482cce0..dfc90a40 100644 --- a/src/lib/amazon-connect-websocket-manager.js +++ b/src/lib/amazon-connect-websocket-manager.js @@ -1,2 +1,2 @@ -!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=2)}([function(e,n,t){"use strict";var r=t(1);function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i={assertTrue:function(e,n){if(!e)throw new Error(n)},assertNotNull:function(e,n){return i.assertTrue(null!==e&&void 0!==o(e),Object(r.sprintf)("%s must be provided",n||"A value")),e},isString:function(e){return"string"==typeof e},assertIsNonEmptyString:function(e,n){if(!e||"string"!=typeof e)throw new Error(n+" is not a non-empty string!")},assertIsList:function(e,n){if(!Array.isArray(e))throw new Error(n+" is not an array")},assertIsEnum:function(e,n,t){var r;for(r=0;r=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var n=e.prefix||"";return this._logsDestination===l?this.consoleLoggerWrapper:new C(n)}},{key:"updateLoggerConfig",value:function(e){var n=e||{};this._level=n.level||k.INFO,this._clientLogger=n.logger||null,this._logsDestination=s,n.debug&&(this._logsDestination=l),n.logger&&(this._logsDestination=u)}}]),e}(),T=function(){function e(){v(this,e)}return S(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),e}(),C=function(e){function n(e){var t;return v(this,n),(t=b(this,y(n).call(this))).prefix=e||"",t}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),n&&m(e,n)}(n,T),S(n,[{key:"debug",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t1)&&(e.info("Network online, Connecting to websocket"),O())},250),d=function(e,n){e.forEach(function(e){e(n)})},b=function(){if(r.pendingResponse)return e.warn("Heartbeat response not received"),clearInterval(r.intervalHandle),r.pendingResponse=!1,void k();e.debug("Sending heartbeat"),n.send(T(g)),r.pendingResponse=!0},y=function(){t.linearConnectAttempt=0,t.exponentialConnectAttempt=0,t.exponentialBackOffTime=1,r.pendingResponse=!1,t.reconnectWebSocket=!1,clearTimeout(t.lifeTimeTimeoutHandle),clearInterval(r.intervalHandle),clearTimeout(t.exponentialTimeoutHandle)},m=function(){try{if(e.info("WebSocket connection established!"),d(o.connectionGain),y(),a.subscribed.size>0||a.pending.size>0){var c=Array.from(a.subscribed.values());c=c.concat(Array.from(a.pending.values())),a.subscribed.clear(),n.send(T(f,{topics:c}))}b(),r.intervalHandle=setInterval(b,1e4),t.lifeTimeTimeoutHandle=setTimeout(function(){e.debug("Starting scheduled WebSocket manager reconnect"),k()},1e3*i.connConfig.webSocketTransport.transportLifeTimeInSeconds)}catch(n){e.error("Error after establishing web socket connection, error: ",n)}},v=function(n){t.linearConnectAttempt<=1&&d(o.connectionLost),e.info("Socket connection is closed. event: ",n),t.reconnectWebSocket&&E()},h=function(n){e.error("WebSocketManager Error, error_event: ",n),k()},S=function(n){e.debug("Message received from webSocket server",n.data);var t=JSON.parse(n.data);switch(t.topic){case f:"success"===t.content.status?(t.content.topics.forEach(function(e){a.subscribed.add(e),a.pending.delete(e)}),d(o.subscriptionUpdate,t)):d(o.subscriptionFailure,t);break;case g:e.debug("Heartbeat response received"),r.pendingResponse=!1;break;default:if(t.topic){if(0===o.allMessage.size&&0===o.topic.size)return void e.warn("No registered callback listener for Topic: ",t);d(o.allMessage,t),o.topic.has(t.topic)&&d(o.topic.get(t.topic),t)}else t.message?e.warn("WebSocketManager Message Error, error: ",t):e.warn("Invalid incoming message, error: ",t)}},w=function(e){return!(!n||n.readyState===WebSocket.CLOSED)&&(n.close(1e3,e),!0)},k=function(){u?(clearTimeout(t.lifeTimeTimeoutHandle),clearInterval(r.intervalHandle),t.linearConnectAttempt<3?(t.linearConnectAttempt++,e.debug("Starting Consecutive WebSocket reconnect, Attempt : "+t.linearConnectAttempt),t.reconnectWebSocket=!0,O()):t.exponentialConnectAttempt<5?(t.exponentialConnectAttempt++,t.exponentialBackOffTime*=2,e.debug("Starting Exponential WebSocket reconnect, Attempt : "+t.exponentialConnectAttempt+" with delay "+t.exponentialBackOffTime+" sec."),i.promiseCompleted=!1,i.connConfig=null,t.exponentialTimeoutHandle=setTimeout(function(){t.reconnectWebSocket=!0,O()},1e3*t.exponentialBackOffTime)):i.promiseCompleted&&(e.error("Could not connect to WebSocket after several attempts"),_())):w("Network Offline, Closing WebSocket Manager")},_=function(){y(),w("Terminating WebSocket Manager"),e.error("WebSocket Initialization failed"),t.websocketInitFailed=!0,clearInterval(l),d(o.initFailure)},T=function(e,n){return JSON.stringify({topic:e,content:n})},C=function(n){return!!(c.isObject(n)&&c.isObject(n.webSocketTransport)&&c.isString(n.webSocketTransport.url)&&c.validWSUrl(n.webSocketTransport.url)&&c.isNumber(n.webSocketTransport.transportLifeTimeInSeconds)&&n.webSocketTransport.transportLifeTimeInSeconds>=3600)||(e.error("Invalid WebSocket Connection Configuration",n),!1)},O=function(){t.websocketInitFailed||(i.connConfig=null,i.promiseCompleted=!1,i.promiseHandle=o.getWebSocketTransport(),i.promiseHandle.then(function(n){i.promiseCompleted=!0,e.debug("Successfully fetched webSocket connection configuration"),C(n)?(i.connConfig=n,u&&(w("Restarting WebSocket Manager")||E())):_()},function(n){i.promiseCompleted=!0,e.error("Failed to fetch webSocket connection configuration",n),k()}))},E=function(){if(!t.websocketInitFailed){e.debug("Initializing Websocket Manager");try{C(i.connConfig)?((n=new WebSocket(i.connConfig.webSocketTransport.url)).addEventListener("open",m),n.addEventListener("message",S),n.addEventListener("error",h),n.addEventListener("close",v)):i.promiseCompleted&&_()}catch(n){e.error("Error Initializing web-socket-manager",n),_()}}};this.init=function(n){c.assertTrue(c.isFunction(n),"transportHandle must be a function"),null===o.getWebSocketTransport?(o.getWebSocketTransport=n,O()):e.warn("Web Socket Manager was already initialized")},this.onInitFailure=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.initFailure.add(e),t.websocketInitFailed&&e(),function(){return o.initFailure.delete(e)}},this.onConnectionGain=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.connectionGain.add(e),n&&n.readyState===WebSocket.OPEN&&e(),function(){return o.connectionGain.delete(e)}},this.onConnectionLost=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.connectionLost.add(e),n&&n.readyState===WebSocket.CLOSED&&e(),function(){return o.connectionLost.delete(e)}},this.onSubscriptionUpdate=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.subscriptionUpdate.add(e),function(){return o.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.subscriptionFailure.add(e),function(){return o.subscriptionFailure.delete(e)}},this.onMessage=function(e,n){return c.assertNotNull(e,"topicName"),c.assertTrue(c.isFunction(n),"cb must be a function"),o.topic.has(e)?o.topic.get(e).add(n):o.topic.set(e,new Set([n])),function(){return o.topic.get(e).delete(n)}},this.onAllMessage=function(e){return c.assertTrue(c.isFunction(e),"cb must be a function"),o.allMessage.add(e),function(){return o.allMessage.delete(e)}},this.subscribeTopics=function(e){c.assertNotNull(e,"topics"),c.assertIsList(e),e.forEach(function(e){a.pending.add(e)}),n&&n.readyState===WebSocket.OPEN&&n.send(T(f,{topics:e}))},this.sendMessage=function(t){if(c.assertIsObject(t,"payload"),void 0===t.topic||s.has(t.topic))e.warn("Cannot send message, Invalid topic",t);else{try{t=JSON.stringify(t)}catch(n){return void e.warn("Error stringify message",t)}n&&n.readyState===WebSocket.OPEN?(e.debug("WebSocketManager sending message",t),n.send(t)):e.warn("Cannot send message, web socket connection is not open")}},this.closeWebSocket=function(){y(),clearInterval(l),w("User request to close WebSocket")}},L={create:function(){return new E},setGlobalConfig:function(e){var n=e.loggerConfig;x.updateLoggerConfig(n)},LogLevel:k,Logger:w}},function(e,n,t){var r;!function(){"use strict";var o={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(e){return function(e,n){var t,r,a,c,s,u,l,f,p,g=1,d=e.length,b="";for(r=0;r=0),c.type){case"b":t=parseInt(t,10).toString(2);break;case"c":t=String.fromCharCode(parseInt(t,10));break;case"d":case"i":t=parseInt(t,10);break;case"j":t=JSON.stringify(t,null,c.width?parseInt(c.width):0);break;case"e":t=c.precision?parseFloat(t).toExponential(c.precision):parseFloat(t).toExponential();break;case"f":t=c.precision?parseFloat(t).toFixed(c.precision):parseFloat(t);break;case"g":t=c.precision?String(Number(t.toPrecision(c.precision))):parseFloat(t);break;case"o":t=(parseInt(t,10)>>>0).toString(8);break;case"s":t=String(t),t=c.precision?t.substring(0,c.precision):t;break;case"t":t=String(!!t),t=c.precision?t.substring(0,c.precision):t;break;case"T":t=Object.prototype.toString.call(t).slice(8,-1).toLowerCase(),t=c.precision?t.substring(0,c.precision):t;break;case"u":t=parseInt(t,10)>>>0;break;case"v":t=t.valueOf(),t=c.precision?t.substring(0,c.precision):t;break;case"x":t=(parseInt(t,10)>>>0).toString(16);break;case"X":t=(parseInt(t,10)>>>0).toString(16).toUpperCase()}o.json.test(c.type)?b+=t:(!o.number.test(c.type)||f&&!c.sign?p="":(p=f?"+":"-",t=t.toString().replace(o.sign,"")),u=c.pad_char?"0"===c.pad_char?"0":c.pad_char.charAt(1):" ",l=c.width-(p+t).length,s=c.width&&l>0?u.repeat(l):"",b+=c.align?p+t+s:"0"===u?p+s+t:s+p+t)}return b}(function(e){if(c[e])return c[e];var n,t=e,r=[],i=0;for(;t;){if(null!==(n=o.text.exec(t)))r.push(n[0]);else if(null!==(n=o.modulo.exec(t)))r.push("%");else{if(null===(n=o.placeholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");if(n[2]){i|=1;var a=[],s=n[2],u=[];if(null===(u=o.key.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(a.push(u[1]);""!==(s=s.substring(u[0].length));)if(null!==(u=o.key_access.exec(s)))a.push(u[1]);else{if(null===(u=o.index_access.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}n[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:n[0],param_no:n[1],keys:n[2],sign:n[3],pad_char:n[4],align:n[5],width:n[6],precision:n[7],type:n[8]})}t=t.substring(n[0].length)}return c[e]=r}(e),arguments)}function a(e,n){return i.apply(null,[e].concat(n||[]))}var c=Object.create(null);n.sprintf=i,n.vsprintf=a,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=a,void 0===(r=function(){return{sprintf:i,vsprintf:a}}.call(n,t,n,e))||(e.exports=r))}()},function(e,n,t){"use strict";t.r(n),function(e){t.d(n,"WebSocketManager",function(){return o});var r=t(0);e.connect=e.connect||{},connect.WebSocketManager=r.a;var o=r.a}.call(this,t(3))},function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(e){"object"==typeof window&&(t=window)}e.exports=t}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvd2ViU29ja2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIlV0aWxzIiwicHJlbWlzZSIsIm1lc3NhZ2UiLCJFcnJvciIsImFzc2VydFRydWUiLCJ1bmRlZmluZWQiLCJzcHJpbnRmIiwiQXJyYXkiLCJpc0FycmF5IiwiYWxsb3dlZFZhbHVlcyIsImxlbmd0aCIsInZhbHVlcyIsImVudW1PYmoiLCJmb3JFYWNoIiwicmVwbGFjZSIsIngiLCJ5IiwidG9VcHBlckNhc2UiLCJvYmoiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiaXNTdHJpbmciLCJpc051bWJlciIsIndzUmVnZXgiLCJSZWdFeHAiLCJ2YWxpZFdTVXJsIiwid3NVcmwiLCJ0ZXN0IiwiYXNzZXJ0SXNPYmplY3QiLCJpc09iamVjdCIsIkxPR1NfREVTVElOQVRJT04iLCJST1VURV9LRVkiLCJMb2dnZXIiLCJkYXRhIiwiTG9nTGV2ZWwiLCJERUJVRyIsIklORk8iLCJXQVJOIiwiRVJST1IiLCJMb2dNYW5hZ2VySW1wbCIsInRoaXMiLCJ1cGRhdGVMb2dnZXJDb25maWciLCJjb25zb2xlTG9nZ2VyV3JhcHBlciIsImNyZWF0ZUNvbnNvbGVMb2dnZXIiLCJsZXZlbCIsImxvZ1N0YXRlbWVudCIsImhhc0NsaWVudExvZ2dlciIsIl9jbGllbnRMb2dnZXIiLCJkZWJ1ZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiLCJfbGV2ZWwiLCJvcHRpb25zIiwicHJlZml4IiwiX2xvZ3NEZXN0aW5hdGlvbiIsIkxvZ2dlcldyYXBwZXJJbXBsIiwiaW5wdXRDb25maWciLCJjb25maWciLCJsb2dnZXIiLCJMb2dnZXJXcmFwcGVyIiwiYXJncyIsIl9sb2ciLCJMb2dNYW5hZ2VyIiwiaXNMZXZlbEVuYWJsZWQiLCJ3cml0ZVRvQ2xpZW50TG9nZ2VyIiwiX3Nob3VsZExvZyIsIl9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQiLCJfd3JpdGVUb0NsaWVudExvZ2dlciIsImluZGV4IiwiYXJnIiwiX2NvbnZlcnRUb1N0cmluZyIsImlzRnVuY3Rpb24iLCJ0b1N0cmluZyIsInRvU3RyaW5nUmVzdWx0IiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbnNvbGUiLCJXZWJTb2NrZXRNYW5hZ2VyIiwiZ2V0TG9nZ2VyIiwid2ViU29ja2V0IiwicmVjb25uZWN0Q29uZmlnIiwicmVjb25uZWN0V2ViU29ja2V0Iiwid2Vic29ja2V0SW5pdEZhaWxlZCIsImxpbmVhckNvbm5lY3RBdHRlbXB0IiwiZXhwb25lbnRpYWxDb25uZWN0QXR0ZW1wdCIsImV4cG9uZW50aWFsQmFja09mZlRpbWUiLCJleHBvbmVudGlhbFRpbWVvdXRIYW5kbGUiLCJsaWZlVGltZVRpbWVvdXRIYW5kbGUiLCJoZWFydGJlYXRDb25maWciLCJwZW5kaW5nUmVzcG9uc2UiLCJpbnRlcnZhbEhhbmRsZSIsImNhbGxiYWNrcyIsImluaXRGYWlsdXJlIiwiU2V0IiwiZ2V0V2ViU29ja2V0VHJhbnNwb3J0Iiwic3Vic2NyaXB0aW9uVXBkYXRlIiwic3Vic2NyaXB0aW9uRmFpbHVyZSIsInRvcGljIiwiTWFwIiwiYWxsTWVzc2FnZSIsImNvbm5lY3Rpb25HYWluIiwiY29ubmVjdGlvbkxvc3QiLCJ3ZWJTb2NrZXRDb25maWciLCJjb25uQ29uZmlnIiwicHJvbWlzZUhhbmRsZSIsInByb21pc2VDb21wbGV0ZWQiLCJ0b3BpY1N1YnNjcmlwdGlvbiIsInN1YnNjcmliZWQiLCJwZW5kaW5nIiwiaW52YWxpZFNlbmRNZXNzYWdlUm91dGVLZXlzIiwib25saW5lIiwibmF2aWdhdG9yIiwib25MaW5lIiwibmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIiLCJzZXRJbnRlcnZhbCIsInJlYWR5U3RhdGUiLCJnZXRXZWJTb2NrZXRDb25uQ29uZmlnIiwiaW52b2tlQ2FsbGJhY2tzIiwicmVzcG9uc2UiLCJjYWxsYmFjayIsInNlbmRIZWFydEJlYXQiLCJjbGVhckludGVydmFsIiwicmVmcmVzaFdlYlNvY2tldENvbm5lY3Rpb24iLCJzZW5kIiwiY3JlYXRlV2ViU29ja2V0UGF5bG9hZCIsInJlc2V0U3RhdGUiLCJjbGVhclRpbWVvdXQiLCJ3ZWJTb2NrZXRPbk9wZW4iLCJzaXplIiwidG9waWNzIiwiZnJvbSIsImNvbmNhdCIsImNsZWFyIiwic2V0VGltZW91dCIsIndlYlNvY2tldFRyYW5zcG9ydCIsInRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzIiwid2ViU29ja2V0T25DbG9zZSIsImV2ZW50IiwiaW5pdFdlYlNvY2tldCIsIndlYlNvY2tldE9uRXJyb3IiLCJ3ZWJTb2NrZXRPbk1lc3NhZ2UiLCJwYXJzZSIsImNvbnRlbnQiLCJzdGF0dXMiLCJ0b3BpY05hbWUiLCJhZGQiLCJoYXMiLCJjbG9zZVdlYlNvY2tldCIsInJlYXNvbiIsIldlYlNvY2tldCIsIkNMT1NFRCIsImNsb3NlIiwidGVybWluYXRlV2ViU29ja2V0TWFuYWdlciIsInZhbGlkV2ViU29ja2V0Q29ubkNvbmZpZyIsInVybCIsInRoZW4iLCJhZGRFdmVudExpc3RlbmVyIiwiaW5pdCIsInRyYW5zcG9ydEhhbmRsZSIsIm9uSW5pdEZhaWx1cmUiLCJjYiIsIm9uQ29ubmVjdGlvbkdhaW4iLCJPUEVOIiwib25Db25uZWN0aW9uTG9zdCIsIm9uU3Vic2NyaXB0aW9uVXBkYXRlIiwib25TdWJzY3JpcHRpb25GYWlsdXJlIiwib25NZXNzYWdlIiwiYXNzZXJ0Tm90TnVsbCIsInNldCIsIm9uQWxsTWVzc2FnZSIsInN1YnNjcmliZVRvcGljcyIsImFzc2VydElzTGlzdCIsInNlbmRNZXNzYWdlIiwicGF5bG9hZCIsIldlYlNvY2tldE1hbmFnZXJPYmplY3QiLCJzZXRHbG9iYWxDb25maWciLCJsb2dnZXJDb25maWciLCJyZSIsIm5vdF9zdHJpbmciLCJub3RfYm9vbCIsIm5vdF90eXBlIiwibm90X3ByaW1pdGl2ZSIsIm51bWJlciIsIm51bWVyaWNfYXJnIiwianNvbiIsIm5vdF9qc29uIiwidGV4dCIsIm1vZHVsbyIsInBsYWNlaG9sZGVyIiwia2V5X2FjY2VzcyIsImluZGV4X2FjY2VzcyIsInNpZ24iLCJwYXJzZV90cmVlIiwiYXJndiIsImsiLCJwaCIsInBhZCIsInBhZF9jaGFyYWN0ZXIiLCJwYWRfbGVuZ3RoIiwiaXNfcG9zaXRpdmUiLCJjdXJzb3IiLCJ0cmVlX2xlbmd0aCIsIm91dHB1dCIsImtleXMiLCJwYXJhbV9ubyIsInR5cGUiLCJGdW5jdGlvbiIsImlzTmFOIiwiVHlwZUVycm9yIiwicGFyc2VJbnQiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ3aWR0aCIsInByZWNpc2lvbiIsInBhcnNlRmxvYXQiLCJ0b0V4cG9uZW50aWFsIiwidG9GaXhlZCIsIk51bWJlciIsInRvUHJlY2lzaW9uIiwic3Vic3RyaW5nIiwic2xpY2UiLCJ0b0xvd2VyQ2FzZSIsInZhbHVlT2YiLCJwYWRfY2hhciIsImNoYXJBdCIsInJlcGVhdCIsImFsaWduIiwic3ByaW50Zl9mb3JtYXQiLCJmbXQiLCJzcHJpbnRmX2NhY2hlIiwibWF0Y2giLCJfZm10IiwiYXJnX25hbWVzIiwiZXhlYyIsInB1c2giLCJTeW50YXhFcnJvciIsImZpZWxkX2xpc3QiLCJyZXBsYWNlbWVudF9maWVsZCIsImZpZWxkX21hdGNoIiwic3ByaW50Zl9wYXJzZSIsImFyZ3VtZW50cyIsInZzcHJpbnRmIiwid2luZG93IiwiZ2xvYmFsIiwiY29ubmVjdCIsImciLCJlIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU9yQixFQUFvQlUsRUFBRWUsRUFBSUUsRUFBSyxTQUFTQSxHQUFPLE9BQU9OLEVBQU1NLElBQVFDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsR0FJUnpCLEVBQW9CNkIsRUFBSSxTQUFTMUIsR0FDaEMsSUFBSVMsRUFBU1QsR0FBVUEsRUFBT3FCLFdBQzdCLFdBQXdCLE9BQU9yQixFQUFnQixTQUMvQyxXQUE4QixPQUFPQSxHQUV0QyxPQURBSCxFQUFvQlUsRUFBRUUsRUFBUSxJQUFLQSxHQUM1QkEsR0FJUlosRUFBb0JhLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLElBR3pHL0IsRUFBb0JrQyxFQUFJLEdBSWpCbEMsRUFBb0JBLEVBQW9CbUMsRUFBSSxHLCtRQ2pGckQsSUFBTUMsRUFBUSxDQUtkQSxXQUFtQixTQUFTQyxFQUFTQyxHQUNuQyxJQUFLRCxFQUNILE1BQU0sSUFBSUUsTUFBTUQsSUFPcEJGLGNBQXNCLFNBQVNmLEVBQU9WLEdBS3BDLE9BSkF5QixFQUFNSSxXQUNNLE9BQVZuQixRQUFtQ29CLElBQWpCLEVBQU9wQixHQUN6QnFCLGtCQUFRLHNCQUF1Qi9CLEdBQVEsWUFFbENVLEdBR1RlLFNBQWlCLFNBQVNmLEdBQ3hCLE1BQXdCLGlCQUFWQSxHQUdoQmUsdUJBQStCLFNBQVNmLEVBQU9NLEdBQzdDLElBQUtOLEdBQTBCLGlCQUFWQSxFQUNuQixNQUFNLElBQUlrQixNQUFNWixFQUFNLGdDQUkxQlMsYUFBcUIsU0FBU2YsRUFBT00sR0FDbkMsSUFBS2dCLE1BQU1DLFFBQVF2QixHQUNqQixNQUFNLElBQUlrQixNQUFNWixFQUFNLHFCQUkxQlMsYUFBcUIsU0FBU2YsRUFBT3dCLEVBQWVsQixHQUNsRCxJQUFJdkIsRUFDSixJQUFLQSxFQUFJLEVBQUdBLEVBQUl5QyxFQUFjQyxPQUFRMUMsSUFDcEMsR0FBSXlDLEVBQWN6QyxLQUFPaUIsRUFDdkIsT0FHSixNQUFNLElBQUlrQixNQUNSWixFQUFNLDZDQUFvRGtCLElBVzlEVCxTQUFpQixTQUFTVyxHQUN4QixJQUFJQyxFQUFVLEdBWWQsT0FWQUQsRUFBT0UsUUFBUSxTQUFTNUIsR0FDdEIsSUFBSU0sRUFBTU4sRUFDUDZCLFFBQVEsaUJBQWtCLFNBQVNDLEVBQUdDLEdBQ3JDLE9BQU9BLEVBQUVDLGNBQWdCLE1BRTFCSCxRQUFRLEtBQU0sSUFFakJGLEVBQVFyQixHQUFPTixJQUdWMkIsR0FPVFosV0FBbUIsU0FBU2tCLEdBQzFCLFNBQVVBLEdBQU9BLEVBQUlDLGFBQWVELEVBQUkvQyxNQUFRK0MsRUFBSUUsUUFHdERwQixTQUFpQixTQUFTZixHQUN4QixRQUEwQixXQUFqQixFQUFPQSxJQUFnQyxPQUFWQSxLQUd4Q2UsRUFBTXFCLFNBQVcsU0FBU3BDLEdBQ3hCLE1BQXdCLGlCQUFWQSxHQUdoQmUsRUFBTXNCLFNBQVcsU0FBU3JDLEdBQ3hCLE1BQXdCLGlCQUFWQSxHQUdoQixJQUFNc0MsRUFBVSxJQUFJQyxPQUFPLGlCQUMzQnhCLEVBQU15QixXQUFhLFNBQVVDLEdBQzNCLE9BQU9ILEVBQVFJLEtBQUtELElBR3RCMUIsRUFBTTRCLGVBQWlCLFNBQVMzQyxFQUFPTSxHQUNyQyxJQUFLUyxFQUFNNkIsU0FBUzVDLEdBQ2xCLE1BQU0sSUFBSWtCLE1BQU1aLEVBQU0sdUJBSVhTLFFDeEdGOEIsRUFDTCxPQURLQSxFQUVJLGdCQUZKQSxFQUdKLFFBUUlDLEVBQ0EsZ0JBREFBLEVBRUUsa0JBRkZBLEVBR0EsZ0IsazhCQ1hQQyxFLDBFQUNFQyxNLDJCQUVEQSxNLDJCQUVBQSxNLDRCQUVDQSxRLEtBSUZDLEVBQVcsQ0FDZkMsTUFBTyxHQUNQQyxLQUFNLEdBQ05DLEtBQU0sR0FDTkMsTUFBTyxJQUdIQyxFLFdBQ0osYUFBYyxVQUNaQyxLQUFLQyxxQkFDTEQsS0FBS0UscUJBQXVCQyxJLHNEQUdWQyxFQUFPQyxHQUN6QixHQUFLTCxLQUFLTSxrQkFHVixPQUFRRixHQUNOLEtBQUtWLEVBQVNDLE1BQ1osT0FBT0ssS0FBS08sY0FBY0MsTUFBTUgsR0FDbEMsS0FBS1gsRUFBU0UsS0FDWixPQUFPSSxLQUFLTyxjQUFjRSxLQUFLSixHQUNqQyxLQUFLWCxFQUFTRyxLQUNaLE9BQU9HLEtBQUtPLGNBQWNHLEtBQUtMLEdBQ2pDLEtBQUtYLEVBQVNJLE1BQ1osT0FBT0UsS0FBS08sY0FBY0ksTUFBTU4sTSxxQ0FJdkJELEdBQ2IsT0FBT0EsR0FBU0osS0FBS1ksUyx3Q0FJckIsT0FBOEIsT0FBdkJaLEtBQUtPLGdCLGdDQUdKTSxHQUNSLElBQUlDLEVBQVNELEVBQVFDLFFBQVUsR0FDL0IsT0FBSWQsS0FBS2UsbUJBQXFCekIsRUFDckJVLEtBQUtFLHFCQUVQLElBQUljLEVBQWtCRixLLHlDQUdaRyxHQUNqQixJQUFJQyxFQUFTRCxHQUFlLEdBQzVCakIsS0FBS1ksT0FBU00sRUFBT2QsT0FBU1YsRUFBU0UsS0FDdkNJLEtBQUtPLGNBQWdCVyxFQUFPQyxRQUFVLEtBQ3RDbkIsS0FBS2UsaUJBQW1CekIsRUFDcEI0QixFQUFPVixRQUNUUixLQUFLZSxpQkFBbUJ6QixHQUV0QjRCLEVBQU9DLFNBQ1RuQixLQUFLZSxpQkFBbUJ6QixPLEtBS3hCOEIsRSx1TEFVQUosRSxZQUNKLFdBQVlGLEdBQVEsd0JBQ2xCLDJCQUNLQSxPQUFTQSxHQUFVLEdBRk4sRSw0T0FEVU0sRyxtQ0FNZiwyQkFBTkMsRUFBTSx5QkFBTkEsRUFBTSxnQkFDYnJCLEtBQUtzQixLQUFLNUIsRUFBU0MsTUFBTzBCLEssNkJBR2QsMkJBQU5BLEVBQU0seUJBQU5BLEVBQU0sZ0JBQ1pyQixLQUFLc0IsS0FBSzVCLEVBQVNFLEtBQU15QixLLDZCQUdiLDJCQUFOQSxFQUFNLHlCQUFOQSxFQUFNLGdCQUNackIsS0FBS3NCLEtBQUs1QixFQUFTRyxLQUFNd0IsSyw4QkFHWiwyQkFBTkEsRUFBTSx5QkFBTkEsRUFBTSxnQkFDYnJCLEtBQUtzQixLQUFLNUIsRUFBU0ksTUFBT3VCLEssaUNBR2pCakIsR0FDVCxPQUFPbUIsRUFBV2pCLG1CQUFxQmlCLEVBQVdDLGVBQWVwQixLLDJDQUc5Q0EsRUFBT0MsR0FDMUJrQixFQUFXRSxvQkFBb0JyQixFQUFPQyxLLDJCQUduQ0QsRUFBT2lCLEdBQ1YsR0FBSXJCLEtBQUswQixXQUFXdEIsR0FBUSxDQUMxQixJQUFJQyxFQUFlTCxLQUFLMkIsMEJBQTBCTixHQUNsRHJCLEtBQUs0QixxQkFBcUJ4QixFQUFPQyxNLGdEQUlYZ0IsR0FDeEIsSUFBSWhCLEVBQWUsR0FDZkwsS0FBS2MsU0FDUFQsR0FBZ0JMLEtBQUtjLE9BQVMsS0FFaEMsSUFBSyxJQUFJZSxFQUFRLEVBQUdBLEVBQVFSLEVBQUtuRCxPQUFRMkQsSUFBUyxDQUNoRCxJQUFJQyxFQUFNVCxFQUFLUSxHQUNmeEIsR0FBZ0JMLEtBQUsrQixpQkFBaUJELEdBQU8sSUFFL0MsT0FBT3pCLEksdUNBR1F5QixHQUNmLElBQ0UsSUFBS0EsRUFDSCxNQUFPLEdBRVQsR0FBSXRFLEVBQU1xQixTQUFTaUQsR0FDakIsT0FBT0EsRUFFVCxHQUFJdEUsRUFBTTZCLFNBQVN5QyxJQUFRdEUsRUFBTXdFLFdBQVdGLEVBQUlHLFVBQVcsQ0FDekQsSUFBSUMsRUFBaUJKLEVBQUlHLFdBQ3pCLEdBQXVCLG9CQUFuQkMsRUFDRixPQUFPQSxFQUdYLE9BQU9DLEtBQUtDLFVBQVVOLEdBQ3RCLE1BQU9uQixHQUVQLE9BREEwQixRQUFRMUIsTUFBTSw0Q0FBNkNtQixFQUFLbkIsR0FDekQsUSxLQUtUUixFQUFzQixXQUN4QixJQUFJZ0IsRUFBUyxJQUFJQyxFQUtqQixPQUpBRCxFQUFPWCxNQUFRNkIsUUFBUTdCLE1BQ3ZCVyxFQUFPVixLQUFPNEIsUUFBUTVCLEtBQ3RCVSxFQUFPVCxLQUFPMkIsUUFBUTNCLEtBQ3RCUyxFQUFPUixNQUFRMEIsUUFBUTFCLE1BQ2hCUSxHQUdISSxFQUFhLElBQUl4QixFQ3BLdkIsZ0NBV0EsSUFBTXVDLEVBQW1CLFdBRXJCLElBQU1uQixFQUFTSSxFQUFXZ0IsVUFBVSxJQUVoQ0MsRUFBWSxLQUVaQyxFQUFrQixDQUNsQkMsb0JBQW9CLEVBQ3BCQyxxQkFBcUIsRUFDckJDLHFCQUFzQixFQUN0QkMsMEJBQTJCLEVBQzNCQyx1QkFBd0IsRUFDeEJDLHlCQUEwQixLQUMxQkMsc0JBQXVCLE1BR3ZCQyxFQUFrQixDQUNsQkMsaUJBQWlCLEVBQ2pCQyxlQUFnQixNQUdoQkMsRUFBWSxDQUNaQyxZQUFhLElBQUlDLElBQ2pCQyxzQkFBdUIsS0FDdkJDLG1CQUFvQixJQUFJRixJQUN4Qkcsb0JBQXFCLElBQUlILElBQ3pCSSxNQUFPLElBQUlDLElBQ1hDLFdBQVksSUFBSU4sSUFDaEJPLGVBQWdCLElBQUlQLElBQ3BCUSxlQUFnQixJQUFJUixLQUdwQlMsRUFBa0IsQ0FDbEJDLFdBQVksS0FDWkMsY0FBZSxLQUNmQyxrQkFBa0IsR0FHbEJDLEVBQW9CLENBQ3BCQyxXQUFZLElBQUlkLElBQ2hCZSxRQUFTLElBQUlmLEtBR1hnQixFQUE4QixJQUFJaEIsSUFBSSxDQUFDL0QsRUFBcUJBLEVBQXVCQSxJQUVyRmdGLEVBQVNDLFVBQVVDLE9BQ2pCQyxFQUE2QkMsWUFBWSxXQUN2Q0osSUFBV0MsVUFBVUMsU0FDckJGLEVBQVNDLFVBQVVDLFdBQ0hqQyxHQUFhQSxFQUFVb0MsV0FBYSxLQUNoRHpELEVBQU9WLEtBQUssMkNBQ1pvRSxNQUdULEtBRUdDLEVBQWtCLFNBQVMxQixFQUFXMkIsR0FDeEMzQixFQUFVL0UsUUFBUSxTQUFVMkcsR0FDeEJBLEVBQVNELE1BSVhFLEVBQWdCLFdBQ2xCLEdBQUloQyxFQUFnQkMsZ0JBS2hCLE9BSkEvQixFQUFPVCxLQUFLLG1DQUNad0UsY0FBY2pDLEVBQWdCRSxnQkFDOUJGLEVBQWdCQyxpQkFBa0IsT0FDbENpQyxJQUdKaEUsRUFBT1gsTUFBTSxxQkFDYmdDLEVBQVU0QyxLQUFLQyxFQUF1QjlGLElBQ3RDMEQsRUFBZ0JDLGlCQUFrQixHQUdoQ29DLEVBQWEsV0FDZjdDLEVBQWdCRyxxQkFBdUIsRUFDdkNILEVBQWdCSSwwQkFBNEIsRUFDNUNKLEVBQWdCSyx1QkFBeUIsRUFDekNHLEVBQWdCQyxpQkFBa0IsRUFDbENULEVBQWdCQyxvQkFBcUIsRUFFckM2QyxhQUFhOUMsRUFBZ0JPLHVCQUM3QmtDLGNBQWNqQyxFQUFnQkUsZ0JBQzlCb0MsYUFBYTlDLEVBQWdCTSwyQkFHM0J5QyxFQUFrQixXQUNwQixJQU1JLEdBTEFyRSxFQUFPVixLQUFLLHFDQUNacUUsRUFBZ0IxQixFQUFVUyxnQkFFMUJ5QixJQUVJbkIsRUFBa0JDLFdBQVdxQixLQUFPLEdBQUt0QixFQUFrQkUsUUFBUW9CLEtBQU8sRUFBRyxDQUM3RSxJQUFJQyxFQUFTM0gsTUFBTTRILEtBQUt4QixFQUFrQkMsV0FBV2pHLFVBQ3JEdUgsRUFBU0EsRUFBT0UsT0FBTzdILE1BQU00SCxLQUFLeEIsRUFBa0JFLFFBQVFsRyxXQUM1RGdHLEVBQWtCQyxXQUFXeUIsUUFDN0JyRCxFQUFVNEMsS0FBS0MsRUFBdUI5RixFQUFxQixDQUFDLE9BQVVtRyxLQUcxRVQsSUFDQWhDLEVBQWdCRSxlQUFpQndCLFlBQVlNLEVBQWUsS0FFNUR4QyxFQUFnQk8sc0JBQXdCOEMsV0FBVyxXQUMvQzNFLEVBQU9YLE1BQU0sa0RBQ2IyRSxLQUNELElBQU9wQixFQUFnQkMsV0FBVytCLG1CQUFtQkMsNEJBQzFELE1BQU9yRixHQUNMUSxFQUFPUixNQUFNLDBEQUEyREEsS0FJMUVzRixFQUFtQixTQUFTQyxHQUMxQnpELEVBQWdCRyxzQkFBd0IsR0FDeENrQyxFQUFnQjFCLEVBQVVVLGdCQUU5QjNDLEVBQU9WLEtBQUssdUNBQXdDeUYsR0FDaER6RCxFQUFnQkMsb0JBQ2hCeUQsS0FJRkMsRUFBbUIsU0FBU0YsR0FDOUIvRSxFQUFPUixNQUFNLHdDQUF5Q3VGLEdBQ3REZixLQUdFa0IsRUFBcUIsU0FBU0gsR0FDaEMvRSxFQUFPWCxNQUFNLHlDQUEwQzBGLEVBQU16RyxNQUM3RCxJQUFNc0YsRUFBVzVDLEtBQUttRSxNQUFNSixFQUFNekcsTUFDbEMsT0FBUXNGLEVBQVNyQixPQUNiLEtBQUtuRSxFQUMrQixZQUE1QndGLEVBQVN3QixRQUFRQyxRQUNqQnpCLEVBQVN3QixRQUFRYixPQUFPckgsUUFBUyxTQUFVb0ksR0FDdkN0QyxFQUFrQkMsV0FBV3NDLElBQUlELEdBQ2pDdEMsRUFBa0JFLFFBQWxCLE9BQWlDb0MsS0FFckMzQixFQUFnQjFCLEVBQVVJLG1CQUFvQnVCLElBRTlDRCxFQUFnQjFCLEVBQVVLLG9CQUFxQnNCLEdBRW5ELE1BQ0osS0FBS3hGLEVBQ0Q0QixFQUFPWCxNQUFNLCtCQUNieUMsRUFBZ0JDLGlCQUFrQixFQUNsQyxNQUNKLFFBQ0ksR0FBSTZCLEVBQVNyQixNQUFPLENBQ2hCLEdBQWtDLElBQTlCTixFQUFVUSxXQUFXNkIsTUFBdUMsSUFBekJyQyxFQUFVTSxNQUFNK0IsS0FFbkQsWUFEQXRFLEVBQU9ULEtBQUssOENBQStDcUUsR0FHL0RELEVBQWdCMUIsRUFBVVEsV0FBWW1CLEdBQ2xDM0IsRUFBVU0sTUFBTWlELElBQUk1QixFQUFTckIsUUFDN0JvQixFQUFnQjFCLEVBQVVNLE1BQU1ySCxJQUFJMEksRUFBU3JCLE9BQVFxQixRQUVsREEsRUFBU3JILFFBQ2hCeUQsRUFBT1QsS0FBSywwQ0FBMkNxRSxHQUV2RDVELEVBQU9ULEtBQUssb0NBQXFDcUUsS0FLM0Q2QixFQUFpQixTQUFTQyxHQUM1QixTQUFJckUsR0FBYUEsRUFBVW9DLGFBQWVrQyxVQUFVQyxVQUNoRHZFLEVBQVV3RSxNQUFNLElBQU1ILElBQ2YsSUFLVDFCLEVBQTZCLFdBQzFCWixHQUlMZ0IsYUFBYTlDLEVBQWdCTyx1QkFDN0JrQyxjQUFjakMsRUFBZ0JFLGdCQUUxQlYsRUFBZ0JHLHFCRnhMZSxHRXlML0JILEVBQWdCRyx1QkFDaEJ6QixFQUFPWCxNQUFNLHVEQUF5RGlDLEVBQWdCRyxzQkFDdEZILEVBQWdCQyxvQkFBcUIsRUFDckNtQyxLQUNPcEMsRUFBZ0JJLDBCRjVMYSxHRTZMcENKLEVBQWdCSSw0QkFDaEJKLEVBQWdCSyx3QkFBMEIsRUFDMUMzQixFQUFPWCxNQUFNLHVEQUNQaUMsRUFBZ0JJLDBCQUE0QixlQUM1Q0osRUFBZ0JLLHVCQUF5QixTQUcvQ2lCLEVBQWdCRyxrQkFBbUIsRUFDbkNILEVBQWdCQyxXQUFhLEtBRTdCdkIsRUFBZ0JNLHlCQUEyQitDLFdBQVcsV0FDbERyRCxFQUFnQkMsb0JBQXFCLEVBQ3JDbUMsS0FDRCxJQUFPcEMsRUFBZ0JLLHlCQUNuQmlCLEVBQWdCRyxtQkFDdkIvQyxFQUFPUixNQUFNLHlEQUNic0csTUE1QkFMLEVBQWUsK0NBZ0NqQkssRUFBNEIsV0FDOUIzQixJQUNBc0IsRUFBZSxpQ0FDZnpGLEVBQU9SLE1BQU0sbUNBQ2I4QixFQUFnQkUscUJBQXNCLEVBQ3RDdUMsY0FBY1IsR0FDZEksRUFBZ0IxQixFQUFVQyxjQUd4QmdDLEVBQXlCLFNBQVV0SSxFQUFLd0osR0FDMUMsT0FBT3BFLEtBQUtDLFVBQVUsQ0FDbEIsTUFBU3JGLEVBQ1QsUUFBV3dKLEtBcUNiVyxFQUEyQixTQUFVbEQsR0FDdkMsU0FBSXhHLEVBQU02QixTQUFTMkUsSUFBZXhHLEVBQU02QixTQUFTMkUsRUFBVytCLHFCQUNyRHZJLEVBQU1xQixTQUFTbUYsRUFBVytCLG1CQUFtQm9CLE1BQzdDM0osRUFBTXlCLFdBQVcrRSxFQUFXK0IsbUJBQW1Cb0IsTUFDL0MzSixFQUFNc0IsU0FBU2tGLEVBQVcrQixtQkFBbUJDLDZCQUNoRGhDLEVBQVcrQixtQkFBbUJDLDRCRnpRSixRRTRROUI3RSxFQUFPUixNQUFNLDZDQUE4Q3FELElBQ3BELElBR0xhLEVBQXlCLFdBQ3ZCcEMsRUFBZ0JFLHNCQUdwQm9CLEVBQWdCQyxXQUFhLEtBQzdCRCxFQUFnQkcsa0JBQW1CLEVBQ25DSCxFQUFnQkUsY0FBZ0JiLEVBQVVHLHdCQUMxQ1EsRUFBZ0JFLGNBQ1htRCxLQUFLLFNBQVNyQyxHQUNQaEIsRUFBZ0JHLGtCQUFtQixFQUNuQy9DLEVBQU9YLE1BQU0sMkRBQ1IwRyxFQUF5Qm5DLElBSTlCaEIsRUFBZ0JDLFdBQWFlLEVBQ3hCUixJQUdEcUMsRUFBZSxpQ0FHbkJULE1BVkljLEtBWVIsU0FBU0osR0FDTDlDLEVBQWdCRyxrQkFBbUIsRUFDbkMvQyxFQUFPUixNQUFNLHFEQUFzRGtHLEdBQ25FMUIsUUFJVmdCLEVBQWdCLFdBQ2xCLElBQUkxRCxFQUFnQkUsb0JBQXBCLENBR0F4QixFQUFPWCxNQUFNLGtDQUNiLElBQ1EwRyxFQUF5Qm5ELEVBQWdCQyxjQUV6Q3hCLEVBQVksSUFBSXNFLFVBQVUvQyxFQUFnQkMsV0FBVytCLG1CQUFtQm9CLE1BQzlERSxpQkFBaUIsT0FBUTdCLEdBQ25DaEQsRUFBVTZFLGlCQUFpQixVQUFXaEIsR0FDdEM3RCxFQUFVNkUsaUJBQWlCLFFBQVNqQixHQUNwQzVELEVBQVU2RSxpQkFBaUIsUUFBU3BCLElBRWhDbEMsRUFBZ0JHLGtCQUNoQitDLElBR1YsTUFBT3RHLEdBQ0xRLEVBQU9SLE1BQU0sd0NBQXlDQSxHQUN0RHNHLE9BdUVSakgsS0FBS3NILEtBeENRLFNBQVNDLEdBQ2xCL0osRUFBTUksV0FBV0osRUFBTXdFLFdBQVd1RixHQUFrQixzQ0FDWixPQUFwQ25FLEVBQVVHLHVCQUlkSCxFQUFVRyxzQkFBd0JnRSxFQUVsQzFDLEtBTEkxRCxFQUFPVCxLQUFLLCtDQXNDcEJWLEtBQUt3SCxjQWxEaUIsU0FBU0MsR0FNM0IsT0FMQWpLLEVBQU1JLFdBQVdKLEVBQU13RSxXQUFXeUYsR0FBSyx5QkFDdkNyRSxFQUFVQyxZQUFZcUQsSUFBSWUsR0FDdEJoRixFQUFnQkUscUJBQ2hCOEUsSUFFRyxrQkFBTXJFLEVBQVVDLFlBQVYsT0FBNkJvRSxLQTZDOUN6SCxLQUFLMEgsaUJBckVvQixTQUFTRCxHQU05QixPQUxBakssRUFBTUksV0FBV0osRUFBTXdFLFdBQVd5RixHQUFLLHlCQUN2Q3JFLEVBQVVTLGVBQWU2QyxJQUFJZSxHQUN6QmpGLEdBQWFBLEVBQVVvQyxhQUFla0MsVUFBVWEsTUFDaERGLElBRUcsa0JBQU1yRSxFQUFVUyxlQUFWLE9BQWdDNEQsS0FnRWpEekgsS0FBSzRILGlCQTdEb0IsU0FBU0gsR0FNOUIsT0FMQWpLLEVBQU1JLFdBQVdKLEVBQU13RSxXQUFXeUYsR0FBSyx5QkFDdkNyRSxFQUFVVSxlQUFlNEMsSUFBSWUsR0FDekJqRixHQUFhQSxFQUFVb0MsYUFBZWtDLFVBQVVDLFFBQ2hEVSxJQUVHLGtCQUFNckUsRUFBVVUsZUFBVixPQUFnQzJELEtBd0RqRHpILEtBQUs2SCxxQkFqQ3dCLFNBQVNKLEdBR2xDLE9BRkFqSyxFQUFNSSxXQUFXSixFQUFNd0UsV0FBV3lGLEdBQUsseUJBQ3ZDckUsRUFBVUksbUJBQW1Ca0QsSUFBSWUsR0FDMUIsa0JBQU1yRSxFQUFVSSxtQkFBVixPQUFvQ2lFLEtBK0JyRHpILEtBQUs4SCxzQkE1QnlCLFNBQVNMLEdBR25DLE9BRkFqSyxFQUFNSSxXQUFXSixFQUFNd0UsV0FBV3lGLEdBQUsseUJBQ3ZDckUsRUFBVUssb0JBQW9CaUQsSUFBSWUsR0FDM0Isa0JBQU1yRSxFQUFVSyxvQkFBVixPQUFxQ2dFLEtBMEJ0RHpILEtBQUsrSCxVQXZCYSxTQUFTdEIsRUFBV2dCLEdBUWxDLE9BUEFqSyxFQUFNd0ssY0FBY3ZCLEVBQVcsYUFDL0JqSixFQUFNSSxXQUFXSixFQUFNd0UsV0FBV3lGLEdBQUsseUJBQ25DckUsRUFBVU0sTUFBTWlELElBQUlGLEdBQ3BCckQsRUFBVU0sTUFBTXJILElBQUlvSyxHQUFXQyxJQUFJZSxHQUVuQ3JFLEVBQVVNLE1BQU11RSxJQUFJeEIsRUFBVyxJQUFJbkQsSUFBSSxDQUFDbUUsS0FFckMsa0JBQU1yRSxFQUFVTSxNQUFNckgsSUFBSW9LLEdBQXBCLE9BQXNDZ0IsS0FnQnZEekgsS0FBS2tJLGFBYmdCLFNBQVVULEdBRzNCLE9BRkFqSyxFQUFNSSxXQUFXSixFQUFNd0UsV0FBV3lGLEdBQUsseUJBQ3ZDckUsRUFBVVEsV0FBVzhDLElBQUllLEdBQ2xCLGtCQUFNckUsRUFBVVEsV0FBVixPQUE0QjZELEtBVzdDekgsS0FBS21JLGdCQTNKbUIsU0FBU3pDLEdBQzdCbEksRUFBTXdLLGNBQWN0QyxFQUFRLFVBQzVCbEksRUFBTTRLLGFBQWExQyxHQUVuQkEsRUFBT3JILFFBQVEsU0FBVXFGLEdBQ3JCUyxFQUFrQkUsUUFBUXFDLElBQUloRCxLQUc5QmxCLEdBQWFBLEVBQVVvQyxhQUFla0MsVUFBVWEsTUFDaERuRixFQUFVNEMsS0FBS0MsRUFBdUI5RixFQUFxQixDQUFDLE9BQVVtRyxNQW1KOUUxRixLQUFLcUksWUFoTGUsU0FBU0MsR0FFekIsR0FEQTlLLEVBQU00QixlQUFla0osRUFBUyxnQkFDUnpLLElBQWxCeUssRUFBUTVFLE9BQXVCWSxFQUE0QnFDLElBQUkyQixFQUFRNUUsT0FDdkV2QyxFQUFPVCxLQUFLLHFDQUFzQzRILE9BRHRELENBSUEsSUFDSUEsRUFBVW5HLEtBQUtDLFVBQVVrRyxHQUMzQixNQUFPM0gsR0FFTCxZQURBUSxFQUFPVCxLQUFLLDBCQUEyQjRILEdBR3ZDOUYsR0FBYUEsRUFBVW9DLGFBQWVrQyxVQUFVYSxNQUNoRHhHLEVBQU9YLE1BQU0sbUNBQW9DOEgsR0FDakQ5RixFQUFVNEMsS0FBS2tELElBRWZuSCxFQUFPVCxLQUFLLDREQWtLcEJWLEtBQUs0RyxlQUFpQixXQUNsQnRCLElBQ0FKLGNBQWNSLEdBQ2RrQyxFQUFlLHFDQWFqQjJCLEVBQXlCLENBQzNCekwsT0FWZ0MsV0FDaEMsT0FBTyxJQUFJd0YsR0FVWGtHLGdCQVBvQixTQUFBdEgsR0FDcEIsSUFBTXVILEVBQWV2SCxFQUFPdUgsYUFDNUJsSCxFQUFXdEIsbUJBQW1Cd0ksSUFNOUIvSSxTQUFVQSxFQUNWRixPQUFRQSxJLGdCQ2hiWixPQUVDLFdBQ0csYUFFQSxJQUFJa0osRUFBSyxDQUNMQyxXQUFZLE9BQ1pDLFNBQVUsT0FDVkMsU0FBVSxPQUNWQyxjQUFlLE9BQ2ZDLE9BQVEsVUFDUkMsWUFBYSxlQUNiQyxLQUFNLE1BQ05DLFNBQVUsT0FDVkMsS0FBTSxZQUNOQyxPQUFRLFdBQ1JDLFlBQWEsMkZBQ2J0TSxJQUFLLHNCQUNMdU0sV0FBWSx3QkFDWkMsYUFBYyxhQUNkQyxLQUFNLFNBR1YsU0FBUzFMLEVBQVFmLEdBRWIsT0FPSixTQUF3QjBNLEVBQVlDLEdBQ2hDLElBQWlENUgsRUFBa0J0RyxFQUFHbU8sRUFBR0MsRUFBSUMsRUFBS0MsRUFBZUMsRUFBWUMsRUFBYVIsRUFBdEhTLEVBQVMsRUFBR0MsRUFBY1QsRUFBV3ZMLE9BQWFpTSxFQUFTLEdBQy9ELElBQUszTyxFQUFJLEVBQUdBLEVBQUkwTyxFQUFhMU8sSUFDekIsR0FBNkIsaUJBQWxCaU8sRUFBV2pPLEdBQ2xCMk8sR0FBVVYsRUFBV2pPLFFBRXBCLEdBQTZCLGlCQUFsQmlPLEVBQVdqTyxHQUFpQixDQUV4QyxJQURBb08sRUFBS0gsRUFBV2pPLElBQ1Q0TyxLQUVILElBREF0SSxFQUFNNEgsRUFBS08sR0FDTk4sRUFBSSxFQUFHQSxFQUFJQyxFQUFHUSxLQUFLbE0sT0FBUXlMLElBQUssQ0FDakMsR0FBVzlMLE1BQVBpRSxFQUNBLE1BQU0sSUFBSW5FLE1BQU1HLEVBQVEsZ0VBQWlFOEwsRUFBR1EsS0FBS1QsR0FBSUMsRUFBR1EsS0FBS1QsRUFBRSxLQUVuSDdILEVBQU1BLEVBQUk4SCxFQUFHUSxLQUFLVCxTQUl0QjdILEVBREs4SCxFQUFHUyxTQUNGWCxFQUFLRSxFQUFHUyxVQUdSWCxFQUFLTyxLQU9mLEdBSkl2QixFQUFHRyxTQUFTMUosS0FBS3lLLEVBQUdVLE9BQVM1QixFQUFHSSxjQUFjM0osS0FBS3lLLEVBQUdVLE9BQVN4SSxhQUFleUksV0FDOUV6SSxFQUFNQSxLQUdONEcsRUFBR00sWUFBWTdKLEtBQUt5SyxFQUFHVSxPQUF5QixpQkFBUnhJLEdBQW9CMEksTUFBTTFJLEdBQ2xFLE1BQU0sSUFBSTJJLFVBQVUzTSxFQUFRLDBDQUEyQ2dFLElBTzNFLE9BSkk0RyxFQUFHSyxPQUFPNUosS0FBS3lLLEVBQUdVLFFBQ2xCTixFQUFjbEksR0FBTyxHQUdqQjhILEVBQUdVLE1BQ1AsSUFBSyxJQUNEeEksRUFBTTRJLFNBQVM1SSxFQUFLLElBQUlHLFNBQVMsR0FDakMsTUFDSixJQUFLLElBQ0RILEVBQU02SSxPQUFPQyxhQUFhRixTQUFTNUksRUFBSyxLQUN4QyxNQUNKLElBQUssSUFDTCxJQUFLLElBQ0RBLEVBQU00SSxTQUFTNUksRUFBSyxJQUNwQixNQUNKLElBQUssSUFDREEsRUFBTUssS0FBS0MsVUFBVU4sRUFBSyxLQUFNOEgsRUFBR2lCLE1BQVFILFNBQVNkLEVBQUdpQixPQUFTLEdBQ2hFLE1BQ0osSUFBSyxJQUNEL0ksRUFBTThILEVBQUdrQixVQUFZQyxXQUFXakosR0FBS2tKLGNBQWNwQixFQUFHa0IsV0FBYUMsV0FBV2pKLEdBQUtrSixnQkFDbkYsTUFDSixJQUFLLElBQ0RsSixFQUFNOEgsRUFBR2tCLFVBQVlDLFdBQVdqSixHQUFLbUosUUFBUXJCLEVBQUdrQixXQUFhQyxXQUFXakosR0FDeEUsTUFDSixJQUFLLElBQ0RBLEVBQU04SCxFQUFHa0IsVUFBWUgsT0FBT08sT0FBT3BKLEVBQUlxSixZQUFZdkIsRUFBR2tCLGFBQWVDLFdBQVdqSixHQUNoRixNQUNKLElBQUssSUFDREEsR0FBTzRJLFNBQVM1SSxFQUFLLE1BQVEsR0FBR0csU0FBUyxHQUN6QyxNQUNKLElBQUssSUFDREgsRUFBTTZJLE9BQU83SSxHQUNiQSxFQUFPOEgsRUFBR2tCLFVBQVloSixFQUFJc0osVUFBVSxFQUFHeEIsRUFBR2tCLFdBQWFoSixFQUN2RCxNQUNKLElBQUssSUFDREEsRUFBTTZJLFNBQVM3SSxHQUNmQSxFQUFPOEgsRUFBR2tCLFVBQVloSixFQUFJc0osVUFBVSxFQUFHeEIsRUFBR2tCLFdBQWFoSixFQUN2RCxNQUNKLElBQUssSUFDREEsRUFBTTVGLE9BQU9rQixVQUFVNkUsU0FBU3RHLEtBQUttRyxHQUFLdUosTUFBTSxHQUFJLEdBQUdDLGNBQ3ZEeEosRUFBTzhILEVBQUdrQixVQUFZaEosRUFBSXNKLFVBQVUsRUFBR3hCLEVBQUdrQixXQUFhaEosRUFDdkQsTUFDSixJQUFLLElBQ0RBLEVBQU00SSxTQUFTNUksRUFBSyxNQUFRLEVBQzVCLE1BQ0osSUFBSyxJQUNEQSxFQUFNQSxFQUFJeUosVUFDVnpKLEVBQU84SCxFQUFHa0IsVUFBWWhKLEVBQUlzSixVQUFVLEVBQUd4QixFQUFHa0IsV0FBYWhKLEVBQ3ZELE1BQ0osSUFBSyxJQUNEQSxHQUFPNEksU0FBUzVJLEVBQUssTUFBUSxHQUFHRyxTQUFTLElBQ3pDLE1BQ0osSUFBSyxJQUNESCxHQUFPNEksU0FBUzVJLEVBQUssTUFBUSxHQUFHRyxTQUFTLElBQUl4RCxjQUdqRGlLLEVBQUdPLEtBQUs5SixLQUFLeUssRUFBR1UsTUFDaEJILEdBQVVySSxJQUdONEcsRUFBR0ssT0FBTzVKLEtBQUt5SyxFQUFHVSxPQUFXTixJQUFlSixFQUFHSixLQUsvQ0EsRUFBTyxJQUpQQSxFQUFPUSxFQUFjLElBQU0sSUFDM0JsSSxFQUFNQSxFQUFJRyxXQUFXM0QsUUFBUW9LLEVBQUdjLEtBQU0sS0FLMUNNLEVBQWdCRixFQUFHNEIsU0FBMkIsTUFBaEI1QixFQUFHNEIsU0FBbUIsSUFBTTVCLEVBQUc0QixTQUFTQyxPQUFPLEdBQUssSUFDbEYxQixFQUFhSCxFQUFHaUIsT0FBU3JCLEVBQU8xSCxHQUFLNUQsT0FDckMyTCxFQUFNRCxFQUFHaUIsT0FBU2QsRUFBYSxFQUFJRCxFQUFjNEIsT0FBTzNCLEdBQW9CLEdBQzVFSSxHQUFVUCxFQUFHK0IsTUFBUW5DLEVBQU8xSCxFQUFNK0gsRUFBeUIsTUFBbEJDLEVBQXdCTixFQUFPSyxFQUFNL0gsRUFBTStILEVBQU1MLEVBQU8xSCxHQUk3RyxPQUFPcUksRUFqSEF5QixDQXNIWCxTQUF1QkMsR0FDbkIsR0FBSUMsRUFBY0QsR0FDZCxPQUFPQyxFQUFjRCxHQUd6QixJQUFnQkUsRUFBWkMsRUFBT0gsRUFBWXBDLEVBQWEsR0FBSXdDLEVBQVksRUFDcEQsS0FBT0QsR0FBTSxDQUNULEdBQXFDLFFBQWhDRCxFQUFRckQsRUFBR1MsS0FBSytDLEtBQUtGLElBQ3RCdkMsRUFBVzBDLEtBQUtKLEVBQU0sU0FFckIsR0FBdUMsUUFBbENBLEVBQVFyRCxFQUFHVSxPQUFPOEMsS0FBS0YsSUFDN0J2QyxFQUFXMEMsS0FBSyxTQUVmLElBQTRDLFFBQXZDSixFQUFRckQsRUFBR1csWUFBWTZDLEtBQUtGLElBNkNsQyxNQUFNLElBQUlJLFlBQVksb0NBNUN0QixHQUFJTCxFQUFNLEdBQUksQ0FDVkUsR0FBYSxFQUNiLElBQUlJLEVBQWEsR0FBSUMsRUFBb0JQLEVBQU0sR0FBSVEsRUFBYyxHQUNqRSxHQUF1RCxRQUFsREEsRUFBYzdELEVBQUczTCxJQUFJbVAsS0FBS0ksSUFlM0IsTUFBTSxJQUFJRixZQUFZLGdEQWJ0QixJQURBQyxFQUFXRixLQUFLSSxFQUFZLElBQ3dELE1BQTVFRCxFQUFvQkEsRUFBa0JsQixVQUFVbUIsRUFBWSxHQUFHck8sVUFDbkUsR0FBOEQsUUFBekRxTyxFQUFjN0QsRUFBR1ksV0FBVzRDLEtBQUtJLElBQ2xDRCxFQUFXRixLQUFLSSxFQUFZLFFBRTNCLElBQWdFLFFBQTNEQSxFQUFjN0QsRUFBR2EsYUFBYTJDLEtBQUtJLElBSXpDLE1BQU0sSUFBSUYsWUFBWSxnREFIdEJDLEVBQVdGLEtBQUtJLEVBQVksSUFVeENSLEVBQU0sR0FBS00sT0FHWEosR0FBYSxFQUVqQixHQUFrQixJQUFkQSxFQUNBLE1BQU0sSUFBSXRPLE1BQU0sNkVBR3BCOEwsRUFBVzBDLEtBQ1AsQ0FDSTlDLFlBQWEwQyxFQUFNLEdBQ25CMUIsU0FBYTBCLEVBQU0sR0FDbkIzQixLQUFhMkIsRUFBTSxHQUNuQnZDLEtBQWF1QyxFQUFNLEdBQ25CUCxTQUFhTyxFQUFNLEdBQ25CSixNQUFhSSxFQUFNLEdBQ25CbEIsTUFBYWtCLEVBQU0sR0FDbkJqQixVQUFhaUIsRUFBTSxHQUNuQnpCLEtBQWF5QixFQUFNLEtBTy9CQyxFQUFPQSxFQUFLWixVQUFVVyxFQUFNLEdBQUc3TixRQUVuQyxPQUFPNE4sRUFBY0QsR0FBT3BDLEVBcExOK0MsQ0FBY3pQLEdBQU0wUCxXQUc5QyxTQUFTQyxFQUFTYixFQUFLbkMsR0FDbkIsT0FBTzVMLEVBQVFjLE1BQU0sS0FBTSxDQUFDaU4sR0FBS2pHLE9BQU84RCxHQUFRLEtBZ0hwRCxJQUFJb0MsRUFBZ0I1UCxPQUFPWSxPQUFPLE1Bd0U5QnhCLEVBQWlCLFFBQUl3QyxFQUNyQnhDLEVBQWtCLFNBQUlvUixFQUVKLG9CQUFYQyxTQUNQQSxPQUFnQixRQUFJN08sRUFDcEI2TyxPQUFpQixTQUFJRCxPQVFoQixLQUxELGFBQ0ksTUFBTyxDQUNILFFBQVc1TyxFQUNYLFNBQVk0TyxJQUVuQiwrQkFoT1osSSw2QkNGRCw2RUFHQUUsRUFBT0MsUUFBVUQsRUFBT0MsU0FBVyxHQUNuQ0EsUUFBUXZLLGlCQUFtQmlHLElBRXBCLElBQU1qRyxFQUFtQmlHLEssK0JDTmhDLElBQUl1RSxFQUdKQSxFQUFJLFdBQ0gsT0FBTzlNLEtBREosR0FJSixJQUVDOE0sRUFBSUEsR0FBSyxJQUFJdkMsU0FBUyxjQUFiLEdBQ1IsTUFBT3dDLEdBRWMsaUJBQVhKLFNBQXFCRyxFQUFJSCxRQU9yQ3BSLEVBQU9ELFFBQVV3UiIsImZpbGUiOiJhbWF6b24tY29ubmVjdC13ZWJzb2NrZXQtbWFuYWdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyKTtcbiIsImltcG9ydCB7IHNwcmludGYgfSBmcm9tIFwic3ByaW50Zi1qc1wiO1xuY29uc3QgVXRpbHMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSBwcmVtaXNlIGlzIHRydWUuXG4gKi9cblV0aWxzLmFzc2VydFRydWUgPSBmdW5jdGlvbihwcmVtaXNlLCBtZXNzYWdlKSB7XG4gIGlmICghcHJlbWlzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBub3QgbnVsbCBvciB1bmRlZmluZWQuXG4gKi9cblV0aWxzLmFzc2VydE5vdE51bGwgPSBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICBVdGlscy5hc3NlcnRUcnVlKFxuICAgIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgIHNwcmludGYoXCIlcyBtdXN0IGJlIHByb3ZpZGVkXCIsIG5hbWUgfHwgXCJBIHZhbHVlXCIpXG4gICk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblV0aWxzLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcbn07XG5cblV0aWxzLmFzc2VydElzTm9uRW1wdHlTdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGtleSArIFwiIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmchXCIpO1xuICB9XG59O1xuXG5VdGlscy5hc3NlcnRJc0xpc3QgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioa2V5ICsgXCIgaXMgbm90IGFuIGFycmF5XCIpO1xuICB9XG59O1xuXG5VdGlscy5hc3NlcnRJc0VudW0gPSBmdW5jdGlvbih2YWx1ZSwgYWxsb3dlZFZhbHVlcywga2V5KSB7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhbGxvd2VkVmFsdWVzW2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAga2V5ICsgXCIgcGFzc2VkIGlzIG5vdCB2YWxpZC4gXCIgKyBcIkFsbG93ZWQgdmFsdWVzIGFyZTogXCIgKyBhbGxvd2VkVmFsdWVzXG4gICk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGVudW0gZnJvbSB0aGUgZ2l2ZW4gbGlzdCBvZiBsb3dlci1jYXNlIGVudW0gdmFsdWVzLFxuICogd2hlcmUgdGhlIGVudW0ga2V5cyB3aWxsIGJlIHVwcGVyIGNhc2UuXG4gKlxuICogQ29udmVyc2lvbiBmcm9tIHBhc2NhbCBjYXNlIGJhc2VkIG9uIGNvZGUgZnJvbSBoZXJlOlxuICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDUyMTIyNFxuICovXG5VdGlscy5tYWtlRW51bSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgZW51bU9iaiA9IHt9O1xuXG4gIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlXG4gICAgICAucmVwbGFjZSgvXFwuPyhbYS16XSspXz8vZywgZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4geS50b1VwcGVyQ2FzZSgpICsgXCJfXCI7XG4gICAgICB9KVxuICAgICAgLnJlcGxhY2UoL18kLywgXCJcIik7XG5cbiAgICBlbnVtT2JqW2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGVudW1PYmo7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0eXBlLlxuICogQm9ycm93ZWQgZnJvbSBVbmRlcnNjb3JlLmpzLlxuICovXG5VdGlscy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiAhIShvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jYWxsICYmIG9iai5hcHBseSk7XG59O1xuXG5VdGlscy5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiAhKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCk7XG59O1xuXG5VdGlscy5pc1N0cmluZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59O1xuXG5VdGlscy5pc051bWJlciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XG59O1xuXG5jb25zdCB3c1JlZ2V4ID0gbmV3IFJlZ0V4cChcIl4od3NzOi8vKVxcXFx3KlwiKTtcblV0aWxzLnZhbGlkV1NVcmwgPSBmdW5jdGlvbiAod3NVcmwpIHtcbiAgcmV0dXJuIHdzUmVnZXgudGVzdCh3c1VybCk7XG59O1xuXG5VdGlscy5hc3NlcnRJc09iamVjdCA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFVdGlscy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioa2V5ICsgXCIgaXMgbm90IGFuIG9iamVjdCFcIik7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFV0aWxzO1xuXG4iLCJcbmV4cG9ydCBjb25zdCBMT0dTX0RFU1RJTkFUSU9OID0ge1xuICBOVUxMOiBcIk5VTExcIixcbiAgQ0xJRU5UX0xPR0dFUjogXCJDTElFTlRfTE9HR0VSXCIsXG4gIERFQlVHOiBcIkRFQlVHXCJcbn07XG5cbmV4cG9ydCBjb25zdCBNSU5fV0VCU09DS0VUX0xJRkVUSU1FID0gMzYwMDtcbmV4cG9ydCBjb25zdCBNQVhfTElORUFSX0NPTk5FQ1RfQVRURU1QVFMgPSAzO1xuZXhwb3J0IGNvbnN0IE1BWF9FWFBPTkVOVElBTF9DT05ORUNUX0FUVEVNUFRTID0gNTtcbmV4cG9ydCBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUwgPSAxMDsgLy9zZWNvbmRzXG5cbmV4cG9ydCBjb25zdCBST1VURV9LRVkgPSB7XG4gIFNVQlNDUklCRTogXCJhd3Mvc3Vic2NyaWJlXCIsXG4gIFVOU1VCU0NSSUJFOiBcImF3cy91bnN1YnNjcmliZVwiLFxuICBIRUFSVEJFQVQ6IFwiYXdzL2hlYXJ0YmVhdFwiXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBMT0dTX0RFU1RJTkFUSU9OIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMqL1xuY2xhc3MgTG9nZ2VyIHtcbiAgZGVidWcoZGF0YSkge31cblxuICBpbmZvKGRhdGEpIHt9XG5cbiAgd2FybihkYXRhKSB7fVxuXG4gIGVycm9yKGRhdGEpIHt9XG59XG4vKmVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMqL1xuXG5jb25zdCBMb2dMZXZlbCA9IHtcbiAgREVCVUc6IDEwLFxuICBJTkZPOiAyMCxcbiAgV0FSTjogMzAsXG4gIEVSUk9SOiA0MFxufTtcblxuY2xhc3MgTG9nTWFuYWdlckltcGwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnVwZGF0ZUxvZ2dlckNvbmZpZygpO1xuICAgIHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXIgPSBjcmVhdGVDb25zb2xlTG9nZ2VyKCk7XG4gIH1cblxuICB3cml0ZVRvQ2xpZW50TG9nZ2VyKGxldmVsLCBsb2dTdGF0ZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuaGFzQ2xpZW50TG9nZ2VyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5ERUJVRzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyhsb2dTdGF0ZW1lbnQpO1xuICAgICAgY2FzZSBMb2dMZXZlbC5JTkZPOlxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8obG9nU3RhdGVtZW50KTtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuV0FSTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKGxvZ1N0YXRlbWVudCk7XG4gICAgICBjYXNlIExvZ0xldmVsLkVSUk9SOlxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKGxvZ1N0YXRlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaXNMZXZlbEVuYWJsZWQobGV2ZWwpIHtcbiAgICByZXR1cm4gbGV2ZWwgPj0gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBoYXNDbGllbnRMb2dnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlciAhPT0gbnVsbDtcbiAgfVxuXG4gIGdldExvZ2dlcihvcHRpb25zKSB7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IFwiXCI7XG4gICAgaWYgKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbiA9PT0gTE9HU19ERVNUSU5BVElPTi5ERUJVRykge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTG9nZ2VyV3JhcHBlckltcGwocHJlZml4KTtcbiAgfVxuXG4gIHVwZGF0ZUxvZ2dlckNvbmZpZyhpbnB1dENvbmZpZykge1xuICAgIHZhciBjb25maWcgPSBpbnB1dENvbmZpZyB8fCB7fTtcbiAgICB0aGlzLl9sZXZlbCA9IGNvbmZpZy5sZXZlbCB8fCBMb2dMZXZlbC5JTkZPO1xuICAgIHRoaXMuX2NsaWVudExvZ2dlciA9IGNvbmZpZy5sb2dnZXIgfHwgbnVsbDtcbiAgICB0aGlzLl9sb2dzRGVzdGluYXRpb24gPSBMT0dTX0RFU1RJTkFUSU9OLk5VTEw7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgdGhpcy5fbG9nc0Rlc3RpbmF0aW9uID0gTE9HU19ERVNUSU5BVElPTi5ERUJVRztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5sb2dnZXIpIHtcbiAgICAgIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbiA9IExPR1NfREVTVElOQVRJT04uQ0xJRU5UX0xPR0dFUjtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTG9nZ2VyV3JhcHBlciB7XG4gIGRlYnVnKCkge31cblxuICBpbmZvKCkge31cblxuICB3YXJuKCkge31cblxuICBlcnJvcigpIHt9XG59XG5cbmNsYXNzIExvZ2dlcldyYXBwZXJJbXBsIGV4dGVuZHMgTG9nZ2VyV3JhcHBlciB7XG4gIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXggfHwgXCJcIjtcbiAgfVxuXG4gIGRlYnVnKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9sb2coTG9nTGV2ZWwuREVCVUcsIGFyZ3MpO1xuICB9XG5cbiAgaW5mbyguLi5hcmdzKSB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLklORk8sIGFyZ3MpO1xuICB9XG5cbiAgd2FybiguLi5hcmdzKSB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLldBUk4sIGFyZ3MpO1xuICB9XG5cbiAgZXJyb3IoLi4uYXJncykge1xuICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5FUlJPUiwgYXJncyk7XG4gIH1cblxuICBfc2hvdWxkTG9nKGxldmVsKSB7XG4gICAgcmV0dXJuIExvZ01hbmFnZXIuaGFzQ2xpZW50TG9nZ2VyKCkgJiYgTG9nTWFuYWdlci5pc0xldmVsRW5hYmxlZChsZXZlbCk7XG4gIH1cblxuICBfd3JpdGVUb0NsaWVudExvZ2dlcihsZXZlbCwgbG9nU3RhdGVtZW50KSB7XG4gICAgTG9nTWFuYWdlci53cml0ZVRvQ2xpZW50TG9nZ2VyKGxldmVsLCBsb2dTdGF0ZW1lbnQpO1xuICB9XG5cbiAgX2xvZyhsZXZlbCwgYXJncykge1xuICAgIGlmICh0aGlzLl9zaG91bGRMb2cobGV2ZWwpKSB7XG4gICAgICB2YXIgbG9nU3RhdGVtZW50ID0gdGhpcy5fY29udmVydFRvU2luZ2xlU3RhdGVtZW50KGFyZ3MpO1xuICAgICAgdGhpcy5fd3JpdGVUb0NsaWVudExvZ2dlcihsZXZlbCwgbG9nU3RhdGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBfY29udmVydFRvU2luZ2xlU3RhdGVtZW50KGFyZ3MpIHtcbiAgICB2YXIgbG9nU3RhdGVtZW50ID0gXCJcIjtcbiAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgIGxvZ1N0YXRlbWVudCArPSB0aGlzLnByZWZpeCArIFwiIFwiO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBhcmcgPSBhcmdzW2luZGV4XTtcbiAgICAgIGxvZ1N0YXRlbWVudCArPSB0aGlzLl9jb252ZXJ0VG9TdHJpbmcoYXJnKSArIFwiIFwiO1xuICAgIH1cbiAgICByZXR1cm4gbG9nU3RhdGVtZW50O1xuICB9XG5cbiAgX2NvbnZlcnRUb1N0cmluZyhhcmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbHMuaXNTdHJpbmcoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWxzLmlzT2JqZWN0KGFyZykgJiYgVXRpbHMuaXNGdW5jdGlvbihhcmcudG9TdHJpbmcpKSB7XG4gICAgICAgIHZhciB0b1N0cmluZ1Jlc3VsdCA9IGFyZy50b1N0cmluZygpO1xuICAgICAgICBpZiAodG9TdHJpbmdSZXN1bHQgIT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgICAgICByZXR1cm4gdG9TdHJpbmdSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgY29udmVydGluZyBhcmd1bWVudCB0byBzdHJpbmdcIiwgYXJnLCBlcnJvcik7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUNvbnNvbGVMb2dnZXIgPSAoKSA9PiB7XG4gIHZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyV3JhcHBlcigpO1xuICBsb2dnZXIuZGVidWcgPSBjb25zb2xlLmRlYnVnO1xuICBsb2dnZXIuaW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgbG9nZ2VyLndhcm4gPSBjb25zb2xlLndhcm47XG4gIGxvZ2dlci5lcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gIHJldHVybiBsb2dnZXI7XG59O1xuXG5jb25zdCBMb2dNYW5hZ2VyID0gbmV3IExvZ01hbmFnZXJJbXBsKCk7XG5cbmV4cG9ydCB7IExvZ01hbmFnZXIsIExvZ2dlciwgTG9nTGV2ZWwgfTtcbiIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgTG9nTWFuYWdlciwgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IHtcbiAgICBNSU5fV0VCU09DS0VUX0xJRkVUSU1FLFxuICAgIE1BWF9MSU5FQVJfQ09OTkVDVF9BVFRFTVBUUyxcbiAgICBNQVhfRVhQT05FTlRJQUxfQ09OTkVDVF9BVFRFTVBUUyxcbiAgICBIRUFSVEJFQVRfSU5URVJWQUwsXG4gICAgUk9VVEVfS0VZXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5cbmNvbnN0IFdlYlNvY2tldE1hbmFnZXIgPSBmdW5jdGlvbigpIHtcblxuICAgIGNvbnN0IGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyKHt9KTtcblxuICAgIGxldCB3ZWJTb2NrZXQgPSBudWxsO1xuXG4gICAgbGV0IHJlY29ubmVjdENvbmZpZyA9IHtcbiAgICAgICAgcmVjb25uZWN0V2ViU29ja2V0OiBmYWxzZSxcbiAgICAgICAgd2Vic29ja2V0SW5pdEZhaWxlZDogZmFsc2UsXG4gICAgICAgIGxpbmVhckNvbm5lY3RBdHRlbXB0OiAwLFxuICAgICAgICBleHBvbmVudGlhbENvbm5lY3RBdHRlbXB0OiAwLFxuICAgICAgICBleHBvbmVudGlhbEJhY2tPZmZUaW1lOiAxLFxuICAgICAgICBleHBvbmVudGlhbFRpbWVvdXRIYW5kbGU6IG51bGwsXG4gICAgICAgIGxpZmVUaW1lVGltZW91dEhhbmRsZTogbnVsbFxuICAgIH07XG5cbiAgICBsZXQgaGVhcnRiZWF0Q29uZmlnID0ge1xuICAgICAgICBwZW5kaW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICBpbnRlcnZhbEhhbmRsZTogbnVsbFxuICAgIH07XG5cbiAgICBsZXQgY2FsbGJhY2tzID0ge1xuICAgICAgICBpbml0RmFpbHVyZTogbmV3IFNldCgpLFxuICAgICAgICBnZXRXZWJTb2NrZXRUcmFuc3BvcnQ6IG51bGwsXG4gICAgICAgIHN1YnNjcmlwdGlvblVwZGF0ZTogbmV3IFNldCgpLFxuICAgICAgICBzdWJzY3JpcHRpb25GYWlsdXJlOiBuZXcgU2V0KCksXG4gICAgICAgIHRvcGljOiBuZXcgTWFwKCksXG4gICAgICAgIGFsbE1lc3NhZ2U6IG5ldyBTZXQoKSxcbiAgICAgICAgY29ubmVjdGlvbkdhaW46IG5ldyBTZXQoKSxcbiAgICAgICAgY29ubmVjdGlvbkxvc3Q6IG5ldyBTZXQoKVxuICAgIH07XG5cbiAgICBsZXQgd2ViU29ja2V0Q29uZmlnID0ge1xuICAgICAgICBjb25uQ29uZmlnOiBudWxsLFxuICAgICAgICBwcm9taXNlSGFuZGxlOiBudWxsLFxuICAgICAgICBwcm9taXNlQ29tcGxldGVkOiBmYWxzZVxuICAgIH07XG5cbiAgICBsZXQgdG9waWNTdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIHN1YnNjcmliZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgcGVuZGluZzogbmV3IFNldCgpXG4gICAgfTtcblxuICAgIGNvbnN0IGludmFsaWRTZW5kTWVzc2FnZVJvdXRlS2V5cyA9IG5ldyBTZXQoW1JPVVRFX0tFWS5TVUJTQ1JJQkUsIFJPVVRFX0tFWS5VTlNVQlNDUklCRSwgUk9VVEVfS0VZLkhFQVJUQkVBVF0pO1xuXG4gICAgbGV0IG9ubGluZSA9IG5hdmlnYXRvci5vbkxpbmU7XG4gICAgY29uc3QgbmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvbmxpbmUgIT09IG5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgICAgIG9ubGluZSA9IG5hdmlnYXRvci5vbkxpbmU7XG4gICAgICAgICAgICBpZiAob25saW5lICYmICghd2ViU29ja2V0IHx8IHdlYlNvY2tldC5yZWFkeVN0YXRlID4gMSkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIk5ldHdvcmsgb25saW5lLCBDb25uZWN0aW5nIHRvIHdlYnNvY2tldFwiKTtcbiAgICAgICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAyNTApO1xuXG4gICAgY29uc3QgaW52b2tlQ2FsbGJhY2tzID0gZnVuY3Rpb24oY2FsbGJhY2tzLCByZXNwb25zZSkge1xuICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNlbmRIZWFydEJlYXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGhlYXJ0YmVhdENvbmZpZy5wZW5kaW5nUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiSGVhcnRiZWF0IHJlc3BvbnNlIG5vdCByZWNlaXZlZFwiKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaGVhcnRiZWF0Q29uZmlnLmludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGhlYXJ0YmVhdENvbmZpZy5wZW5kaW5nUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICAgIHdlYlNvY2tldC5zZW5kKGNyZWF0ZVdlYlNvY2tldFBheWxvYWQoUk9VVEVfS0VZLkhFQVJUQkVBVCkpO1xuICAgICAgICBoZWFydGJlYXRDb25maWcucGVuZGluZ1Jlc3BvbnNlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzZXRTdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWNvbm5lY3RDb25maWcubGluZWFyQ29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICByZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxDb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbEJhY2tPZmZUaW1lID0gMTtcbiAgICAgICAgaGVhcnRiZWF0Q29uZmlnLnBlbmRpbmdSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICByZWNvbm5lY3RDb25maWcucmVjb25uZWN0V2ViU29ja2V0ID0gZmFsc2U7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlY29ubmVjdENvbmZpZy5saWZlVGltZVRpbWVvdXRIYW5kbGUpO1xuICAgICAgICBjbGVhckludGVydmFsKGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgIGNsZWFyVGltZW91dChyZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd2ViU29ja2V0T25PcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIldlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkIVwiKTtcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuY29ubmVjdGlvbkdhaW4pO1xuXG4gICAgICAgICAgICByZXNldFN0YXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0b3BpY1N1YnNjcmlwdGlvbi5zdWJzY3JpYmVkLnNpemUgPiAwIHx8IHRvcGljU3Vic2NyaXB0aW9uLnBlbmRpbmcuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9waWNzID0gQXJyYXkuZnJvbSh0b3BpY1N1YnNjcmlwdGlvbi5zdWJzY3JpYmVkLnZhbHVlcygpKTtcbiAgICAgICAgICAgICAgICB0b3BpY3MgPSB0b3BpY3MuY29uY2F0KEFycmF5LmZyb20odG9waWNTdWJzY3JpcHRpb24ucGVuZGluZy52YWx1ZXMoKSkpO1xuICAgICAgICAgICAgICAgIHRvcGljU3Vic2NyaXB0aW9uLnN1YnNjcmliZWQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuc2VuZChjcmVhdGVXZWJTb2NrZXRQYXlsb2FkKFJPVVRFX0tFWS5TVUJTQ1JJQkUsIHtcInRvcGljc1wiOiB0b3BpY3N9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRIZWFydEJlYXQoKTtcbiAgICAgICAgICAgIGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKHNlbmRIZWFydEJlYXQsIDEwMDAgKiBIRUFSVEJFQVRfSU5URVJWQUwpO1xuXG4gICAgICAgICAgICByZWNvbm5lY3RDb25maWcubGlmZVRpbWVUaW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBzY2hlZHVsZWQgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0XCIpO1xuICAgICAgICAgICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICB9LCAxMDAwICogd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGFmdGVyIGVzdGFibGlzaGluZyB3ZWIgc29ja2V0IGNvbm5lY3Rpb24sIGVycm9yOiBcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHdlYlNvY2tldE9uQ2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAocmVjb25uZWN0Q29uZmlnLmxpbmVhckNvbm5lY3RBdHRlbXB0IDw9IDEpIHtcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuY29ubmVjdGlvbkxvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiBldmVudDogXCIsIGV2ZW50KTtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy5yZWNvbm5lY3RXZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIGluaXRXZWJTb2NrZXQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB3ZWJTb2NrZXRPbkVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6IFwiLCBldmVudCk7XG4gICAgICAgIHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdlYlNvY2tldE9uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIk1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3ZWJTb2NrZXQgc2VydmVyXCIsIGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgIHN3aXRjaCAocmVzcG9uc2UudG9waWMpIHtcbiAgICAgICAgICAgIGNhc2UgUk9VVEVfS0VZLlNVQlNDUklCRTpcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY29udGVudC5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRlbnQudG9waWNzLmZvckVhY2goKGZ1bmN0aW9uICh0b3BpY05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljU3Vic2NyaXB0aW9uLnN1YnNjcmliZWQuYWRkKHRvcGljTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BpY1N1YnNjcmlwdGlvbi5wZW5kaW5nLmRlbGV0ZSh0b3BpY05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3Muc3Vic2NyaXB0aW9uVXBkYXRlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy5zdWJzY3JpcHRpb25GYWlsdXJlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBST1VURV9LRVkuSEVBUlRCRUFUOlxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkhlYXJ0YmVhdCByZXNwb25zZSByZWNlaXZlZFwiKTtcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRDb25maWcucGVuZGluZ1Jlc3BvbnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50b3BpYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLmFsbE1lc3NhZ2Uuc2l6ZSA9PT0gMCAmJiBjYWxsYmFja3MudG9waWMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ05vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgbGlzdGVuZXIgZm9yIFRvcGljOiAnLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy5hbGxNZXNzYWdlLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MudG9waWMuaGFzKHJlc3BvbnNlLnRvcGljKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tzKGNhbGxiYWNrcy50b3BpYy5nZXQocmVzcG9uc2UudG9waWMpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJXZWJTb2NrZXRNYW5hZ2VyIE1lc3NhZ2UgRXJyb3IsIGVycm9yOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiSW52YWxpZCBpbmNvbWluZyBtZXNzYWdlLCBlcnJvcjogXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xvc2VXZWJTb2NrZXQgPSBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgaWYgKHdlYlNvY2tldCAmJiB3ZWJTb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NFRCkge1xuICAgICAgICAgICAgd2ViU29ja2V0LmNsb3NlKDEwMDAsIHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlZnJlc2hXZWJTb2NrZXRDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIW9ubGluZSkge1xuICAgICAgICAgICAgY2xvc2VXZWJTb2NrZXQoXCJOZXR3b3JrIE9mZmxpbmUsIENsb3NpbmcgV2ViU29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlY29ubmVjdENvbmZpZy5saWZlVGltZVRpbWVvdXRIYW5kbGUpO1xuICAgICAgICBjbGVhckludGVydmFsKGhlYXJ0YmVhdENvbmZpZy5pbnRlcnZhbEhhbmRsZSk7XG5cbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy5saW5lYXJDb25uZWN0QXR0ZW1wdCA8IE1BWF9MSU5FQVJfQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLmxpbmVhckNvbm5lY3RBdHRlbXB0Kys7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBDb25zZWN1dGl2ZSBXZWJTb2NrZXQgcmVjb25uZWN0LCBBdHRlbXB0IDogXCIgKyByZWNvbm5lY3RDb25maWcubGluZWFyQ29ubmVjdEF0dGVtcHQpO1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLnJlY29ubmVjdFdlYlNvY2tldCA9IHRydWU7XG4gICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQ29ubmVjdEF0dGVtcHQgPCBNQVhfRVhQT05FTlRJQUxfQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgICAgcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQ29ubmVjdEF0dGVtcHQrKztcbiAgICAgICAgICAgIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbEJhY2tPZmZUaW1lICo9IDI7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJTdGFydGluZyBFeHBvbmVudGlhbCBXZWJTb2NrZXQgcmVjb25uZWN0LCBBdHRlbXB0IDogXCJcbiAgICAgICAgICAgICAgICArIHJlY29ubmVjdENvbmZpZy5leHBvbmVudGlhbENvbm5lY3RBdHRlbXB0ICsgXCIgd2l0aCBkZWxheSBcIlxuICAgICAgICAgICAgICAgICsgcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQmFja09mZlRpbWUgKyBcIiBzZWMuXCIpO1xuXG4gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3Igc2NlbmFyaW9zIHdoZW4gZXJyb3IgYW5kIGNsb3NlIGV2ZW50cyBhcmUgZmlyZWQgYmFjayB0byBiYWNrXG4gICAgICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSBudWxsO1xuXG4gICAgICAgICAgICByZWNvbm5lY3RDb25maWcuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RDb25maWcucmVjb25uZWN0V2ViU29ja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBnZXRXZWJTb2NrZXRDb25uQ29uZmlnKCk7XG4gICAgICAgICAgICB9LCAxMDAwICogcmVjb25uZWN0Q29uZmlnLmV4cG9uZW50aWFsQmFja09mZlRpbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDb3VsZCBub3QgY29ubmVjdCB0byBXZWJTb2NrZXQgYWZ0ZXIgc2V2ZXJhbCBhdHRlbXB0c1wiKTtcbiAgICAgICAgICAgIHRlcm1pbmF0ZVdlYlNvY2tldE1hbmFnZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNldFN0YXRlKCk7XG4gICAgICAgIGNsb3NlV2ViU29ja2V0KFwiVGVybWluYXRpbmcgV2ViU29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcIldlYlNvY2tldCBJbml0aWFsaXphdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChuZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlcik7XG4gICAgICAgIGludm9rZUNhbGxiYWNrcyhjYWxsYmFja3MuaW5pdEZhaWx1cmUpO1xuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVXZWJTb2NrZXRQYXlsb2FkID0gZnVuY3Rpb24gKGtleSwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJ0b3BpY1wiOiBrZXksXG4gICAgICAgICAgICBcImNvbnRlbnRcIjogY29udGVudFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VuZE1lc3NhZ2UgPSBmdW5jdGlvbihwYXlsb2FkKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydElzT2JqZWN0KHBheWxvYWQsIFwicGF5bG9hZFwiKTtcbiAgICAgICAgaWYgKHBheWxvYWQudG9waWMgPT09IHVuZGVmaW5lZCB8fCBpbnZhbGlkU2VuZE1lc3NhZ2VSb3V0ZUtleXMuaGFzKHBheWxvYWQudG9waWMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIEludmFsaWQgdG9waWNcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXJyb3Igc3RyaW5naWZ5IG1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlYlNvY2tldCAmJiB3ZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2ViU29ja2V0TWFuYWdlciBzZW5kaW5nIG1lc3NhZ2UnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIHdlYlNvY2tldC5zZW5kKHBheWxvYWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IG9wZW5cIik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlVG9waWNzID0gZnVuY3Rpb24odG9waWNzKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydE5vdE51bGwodG9waWNzLCAndG9waWNzJyk7XG4gICAgICAgIFV0aWxzLmFzc2VydElzTGlzdCh0b3BpY3MpO1xuXG4gICAgICAgIHRvcGljcy5mb3JFYWNoKGZ1bmN0aW9uICh0b3BpYykge1xuICAgICAgICAgICAgdG9waWNTdWJzY3JpcHRpb24ucGVuZGluZy5hZGQodG9waWMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAod2ViU29ja2V0ICYmIHdlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgd2ViU29ja2V0LnNlbmQoY3JlYXRlV2ViU29ja2V0UGF5bG9hZChST1VURV9LRVkuU1VCU0NSSUJFLCB7XCJ0b3BpY3NcIjogdG9waWNzfSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHZhbGlkV2ViU29ja2V0Q29ubkNvbmZpZyA9IGZ1bmN0aW9uIChjb25uQ29uZmlnKSB7XG4gICAgICAgIGlmIChVdGlscy5pc09iamVjdChjb25uQ29uZmlnKSAmJiBVdGlscy5pc09iamVjdChjb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydClcbiAgICAgICAgICAgICYmIFV0aWxzLmlzU3RyaW5nKGNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnVybClcbiAgICAgICAgICAgICYmIFV0aWxzLnZhbGlkV1NVcmwoY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKVxuICAgICAgICAgICAgJiYgVXRpbHMuaXNOdW1iZXIoY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMpICYmXG4gICAgICAgICAgICBjb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcyA+PSBNSU5fV0VCU09DS0VUX0xJRkVUSU1FKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoXCJJbnZhbGlkIFdlYlNvY2tldCBDb25uZWN0aW9uIENvbmZpZ3VyYXRpb25cIiwgY29ubkNvbmZpZyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSBudWxsO1xuICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICB3ZWJTb2NrZXRDb25maWcucHJvbWlzZUhhbmRsZSA9IGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQoKTtcbiAgICAgICAgd2ViU29ja2V0Q29uZmlnLnByb21pc2VIYW5kbGVcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU3VjY2Vzc2Z1bGx5IGZldGNoZWQgd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZFdlYlNvY2tldENvbm5Db25maWcocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2ViU29ja2V0Q29uZmlnLmNvbm5Db25maWcgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VXZWJTb2NrZXQoXCJSZXN0YXJ0aW5nIFdlYlNvY2tldCBNYW5hZ2VyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5pdFdlYlNvY2tldCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYlNvY2tldENvbmZpZy5wcm9taXNlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIiwgcmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFdlYlNvY2tldENvbm5lY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5pdFdlYlNvY2tldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmVjb25uZWN0Q29uZmlnLndlYnNvY2tldEluaXRGYWlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoXCJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXJcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodmFsaWRXZWJTb2NrZXRDb25uQ29uZmlnKHdlYlNvY2tldENvbmZpZy5jb25uQ29uZmlnKSkge1xuXG4gICAgICAgICAgICAgICAgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25maWcuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgd2ViU29ja2V0T25PcGVuKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgd2ViU29ja2V0T25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHdlYlNvY2tldE9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgd2ViU29ja2V0T25DbG9zZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh3ZWJTb2NrZXRDb25maWcucHJvbWlzZUNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgSW5pdGlhbGl6aW5nIHdlYi1zb2NrZXQtbWFuYWdlclwiLCBlcnJvcik7XG4gICAgICAgICAgICB0ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db25uZWN0aW9uR2FpbiA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLmNvbm5lY3Rpb25HYWluLmFkZChjYik7XG4gICAgICAgIGlmICh3ZWJTb2NrZXQgJiYgd2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3MuY29ubmVjdGlvbkdhaW4uZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db25uZWN0aW9uTG9zdCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLmNvbm5lY3Rpb25Mb3N0LmFkZChjYik7XG4gICAgICAgIGlmICh3ZWJTb2NrZXQgJiYgd2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IGNhbGxiYWNrcy5jb25uZWN0aW9uTG9zdC5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkluaXRGYWlsdXJlID0gZnVuY3Rpb24oY2IpIHtcbiAgICAgICAgVXRpbHMuYXNzZXJ0VHJ1ZShVdGlscy5pc0Z1bmN0aW9uKGNiKSwgJ2NiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICBjYWxsYmFja3MuaW5pdEZhaWx1cmUuYWRkKGNiKTtcbiAgICAgICAgaWYgKHJlY29ubmVjdENvbmZpZy53ZWJzb2NrZXRJbml0RmFpbGVkKSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3MuaW5pdEZhaWx1cmUuZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5pdCA9IGZ1bmN0aW9uKHRyYW5zcG9ydEhhbmRsZSkge1xuICAgICAgICBVdGlscy5hc3NlcnRUcnVlKFV0aWxzLmlzRnVuY3Rpb24odHJhbnNwb3J0SGFuZGxlKSwgJ3RyYW5zcG9ydEhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiV2ViIFNvY2tldCBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrcy5nZXRXZWJTb2NrZXRUcmFuc3BvcnQgPSB0cmFuc3BvcnRIYW5kbGU7XG5cbiAgICAgICAgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZygpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN1YnNjcmlwdGlvblVwZGF0ZSA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgY2FsbGJhY2tzLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQoY2IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FsbGJhY2tzLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN1YnNjcmlwdGlvbkZhaWx1cmUgPSBmdW5jdGlvbihjYikge1xuICAgICAgICBVdGlscy5hc3NlcnRUcnVlKFV0aWxzLmlzRnVuY3Rpb24oY2IpLCAnY2IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIGNhbGxiYWNrcy5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZChjYik7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYWxsYmFja3Muc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbk1lc3NhZ2UgPSBmdW5jdGlvbih0b3BpY05hbWUsIGNiKSB7XG4gICAgICAgIFV0aWxzLmFzc2VydE5vdE51bGwodG9waWNOYW1lLCAndG9waWNOYW1lJyk7XG4gICAgICAgIFV0aWxzLmFzc2VydFRydWUoVXRpbHMuaXNGdW5jdGlvbihjYiksICdjYiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy50b3BpYy5oYXModG9waWNOYW1lKSkge1xuICAgICAgICAgICAgY2FsbGJhY2tzLnRvcGljLmdldCh0b3BpY05hbWUpLmFkZChjYik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFja3MudG9waWMuc2V0KHRvcGljTmFtZSwgbmV3IFNldChbY2JdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IGNhbGxiYWNrcy50b3BpYy5nZXQodG9waWNOYW1lKS5kZWxldGUoY2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkFsbE1lc3NhZ2UgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgVXRpbHMuYXNzZXJ0VHJ1ZShVdGlscy5pc0Z1bmN0aW9uKGNiKSwgJ2NiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICBjYWxsYmFja3MuYWxsTWVzc2FnZS5hZGQoY2IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FsbGJhY2tzLmFsbE1lc3NhZ2UuZGVsZXRlKGNiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gaW5pdDtcbiAgICB0aGlzLm9uSW5pdEZhaWx1cmUgPSBvbkluaXRGYWlsdXJlO1xuICAgIHRoaXMub25Db25uZWN0aW9uR2FpbiA9IG9uQ29ubmVjdGlvbkdhaW47XG4gICAgdGhpcy5vbkNvbm5lY3Rpb25Mb3N0ID0gb25Db25uZWN0aW9uTG9zdDtcbiAgICB0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlID0gb25TdWJzY3JpcHRpb25VcGRhdGU7XG4gICAgdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmUgPSBvblN1YnNjcmlwdGlvbkZhaWx1cmU7XG4gICAgdGhpcy5vbk1lc3NhZ2UgPSBvbk1lc3NhZ2U7XG4gICAgdGhpcy5vbkFsbE1lc3NhZ2UgPSBvbkFsbE1lc3NhZ2U7XG4gICAgdGhpcy5zdWJzY3JpYmVUb3BpY3MgPSBzdWJzY3JpYmVUb3BpY3M7XG4gICAgdGhpcy5zZW5kTWVzc2FnZSA9IHNlbmRNZXNzYWdlO1xuXG4gICAgdGhpcy5jbG9zZVdlYlNvY2tldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNldFN0YXRlKCk7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwobmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIpO1xuICAgICAgICBjbG9zZVdlYlNvY2tldChcIlVzZXIgcmVxdWVzdCB0byBjbG9zZSBXZWJTb2NrZXRcIik7XG4gICAgfTtcbn07XG5cbmNvbnN0IFdlYlNvY2tldE1hbmFnZXJDb25zdHJ1Y3RvciA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFdlYlNvY2tldE1hbmFnZXIoKTtcbn07XG5cbmNvbnN0IHNldEdsb2JhbENvbmZpZyA9IGNvbmZpZyA9PiB7XG4gICAgY29uc3QgbG9nZ2VyQ29uZmlnID0gY29uZmlnLmxvZ2dlckNvbmZpZztcbiAgICBMb2dNYW5hZ2VyLnVwZGF0ZUxvZ2dlckNvbmZpZyhsb2dnZXJDb25maWcpO1xufTtcblxuY29uc3QgV2ViU29ja2V0TWFuYWdlck9iamVjdCA9IHtcbiAgICBjcmVhdGU6IFdlYlNvY2tldE1hbmFnZXJDb25zdHJ1Y3RvcixcbiAgICBzZXRHbG9iYWxDb25maWc6IHNldEdsb2JhbENvbmZpZyxcbiAgICBMb2dMZXZlbDogTG9nTGV2ZWwsXG4gICAgTG9nZ2VyOiBMb2dnZXJcbn07XG5cbmV4cG9ydCB7IFdlYlNvY2tldE1hbmFnZXJPYmplY3QgfTsiLCIvKiBnbG9iYWwgd2luZG93LCBleHBvcnRzLCBkZWZpbmUgKi9cblxuIWZ1bmN0aW9uKCkge1xuICAgICd1c2Ugc3RyaWN0J1xuXG4gICAgdmFyIHJlID0ge1xuICAgICAgICBub3Rfc3RyaW5nOiAvW15zXS8sXG4gICAgICAgIG5vdF9ib29sOiAvW150XS8sXG4gICAgICAgIG5vdF90eXBlOiAvW15UXS8sXG4gICAgICAgIG5vdF9wcmltaXRpdmU6IC9bXnZdLyxcbiAgICAgICAgbnVtYmVyOiAvW2RpZWZnXS8sXG4gICAgICAgIG51bWVyaWNfYXJnOiAvW2JjZGllZmd1eFhdLyxcbiAgICAgICAganNvbjogL1tqXS8sXG4gICAgICAgIG5vdF9qc29uOiAvW15qXS8sXG4gICAgICAgIHRleHQ6IC9eW15cXHgyNV0rLyxcbiAgICAgICAgbW9kdWxvOiAvXlxceDI1ezJ9LyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IC9eXFx4MjUoPzooWzEtOV1cXGQqKVxcJHxcXCgoW14pXSspXFwpKT8oXFwrKT8oMHwnW14kXSk/KC0pPyhcXGQrKT8oPzpcXC4oXFxkKykpPyhbYi1naWpvc3RUdXZ4WF0pLyxcbiAgICAgICAga2V5OiAvXihbYS16X11bYS16X1xcZF0qKS9pLFxuICAgICAgICBrZXlfYWNjZXNzOiAvXlxcLihbYS16X11bYS16X1xcZF0qKS9pLFxuICAgICAgICBpbmRleF9hY2Nlc3M6IC9eXFxbKFxcZCspXFxdLyxcbiAgICAgICAgc2lnbjogL15bKy1dL1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNwcmludGYoa2V5KSB7XG4gICAgICAgIC8vIGBhcmd1bWVudHNgIGlzIG5vdCBhbiBhcnJheSwgYnV0IHNob3VsZCBiZSBmaW5lIGZvciB0aGlzIGNhbGxcbiAgICAgICAgcmV0dXJuIHNwcmludGZfZm9ybWF0KHNwcmludGZfcGFyc2Uoa2V5KSwgYXJndW1lbnRzKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZzcHJpbnRmKGZtdCwgYXJndikge1xuICAgICAgICByZXR1cm4gc3ByaW50Zi5hcHBseShudWxsLCBbZm10XS5jb25jYXQoYXJndiB8fCBbXSkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50Zl9mb3JtYXQocGFyc2VfdHJlZSwgYXJndikge1xuICAgICAgICB2YXIgY3Vyc29yID0gMSwgdHJlZV9sZW5ndGggPSBwYXJzZV90cmVlLmxlbmd0aCwgYXJnLCBvdXRwdXQgPSAnJywgaSwgaywgcGgsIHBhZCwgcGFkX2NoYXJhY3RlciwgcGFkX2xlbmd0aCwgaXNfcG9zaXRpdmUsIHNpZ25cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyZWVfbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gcGFyc2VfdHJlZVtpXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBhcnNlX3RyZWVbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcGggPSBwYXJzZV90cmVlW2ldIC8vIGNvbnZlbmllbmNlIHB1cnBvc2VzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAocGgua2V5cykgeyAvLyBrZXl3b3JkIGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbY3Vyc29yXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcGgua2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignW3NwcmludGZdIENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgXCIlc1wiIG9mIHVuZGVmaW5lZCB2YWx1ZSBcIiVzXCInLCBwaC5rZXlzW2tdLCBwaC5rZXlzW2stMV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnW3BoLmtleXNba11dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGgucGFyYW1fbm8pIHsgLy8gcG9zaXRpb25hbCBhcmd1bWVudCAoZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbcGgucGFyYW1fbm9dXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChpbXBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3IrK11cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubm90X3R5cGUudGVzdChwaC50eXBlKSAmJiByZS5ub3RfcHJpbWl0aXZlLnRlc3QocGgudHlwZSkgJiYgYXJnIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubnVtZXJpY19hcmcudGVzdChwaC50eXBlKSAmJiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgJiYgaXNOYU4oYXJnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJVQnLCBhcmcpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBpc19wb3NpdGl2ZSA9IGFyZyA+PSAwXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwaC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMCkudG9TdHJpbmcoMilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhcmcsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdqJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IEpTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgcGgud2lkdGggPyBwYXJzZUludChwaC53aWR0aCkgOiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbChwaC5wcmVjaXNpb24pIDogcGFyc2VGbG9hdChhcmcpLnRvRXhwb25lbnRpYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBwYXJzZUZsb2F0KGFyZykudG9GaXhlZChwaC5wcmVjaXNpb24pIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IFN0cmluZyhOdW1iZXIoYXJnLnRvUHJlY2lzaW9uKHBoLnByZWNpc2lvbikpKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyhhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcoISFhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMCkgPj4+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZygxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlLmpzb24udGVzdChwaC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gYXJnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmUubnVtYmVyLnRlc3QocGgudHlwZSkgJiYgKCFpc19wb3NpdGl2ZSB8fCBwaC5zaWduKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGlzX3Bvc2l0aXZlID8gJysnIDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudG9TdHJpbmcoKS5yZXBsYWNlKHJlLnNpZ24sICcnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFkX2NoYXJhY3RlciA9IHBoLnBhZF9jaGFyID8gcGgucGFkX2NoYXIgPT09ICcwJyA/ICcwJyA6IHBoLnBhZF9jaGFyLmNoYXJBdCgxKSA6ICcgJ1xuICAgICAgICAgICAgICAgICAgICBwYWRfbGVuZ3RoID0gcGgud2lkdGggLSAoc2lnbiArIGFyZykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHBhZCA9IHBoLndpZHRoID8gKHBhZF9sZW5ndGggPiAwID8gcGFkX2NoYXJhY3Rlci5yZXBlYXQocGFkX2xlbmd0aCkgOiAnJykgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gcGguYWxpZ24gPyBzaWduICsgYXJnICsgcGFkIDogKHBhZF9jaGFyYWN0ZXIgPT09ICcwJyA/IHNpZ24gKyBwYWQgKyBhcmcgOiBwYWQgKyBzaWduICsgYXJnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgdmFyIHNwcmludGZfY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX3BhcnNlKGZtdCkge1xuICAgICAgICBpZiAoc3ByaW50Zl9jYWNoZVtmbXRdKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZtdCA9IGZtdCwgbWF0Y2gsIHBhcnNlX3RyZWUgPSBbXSwgYXJnX25hbWVzID0gMFxuICAgICAgICB3aGlsZSAoX2ZtdCkge1xuICAgICAgICAgICAgaWYgKChtYXRjaCA9IHJlLnRleHQuZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2gobWF0Y2hbMF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5tb2R1bG8uZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2goJyUnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gcmUucGxhY2Vob2xkZXIuZXhlYyhfZm10KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnX25hbWVzIHw9IDFcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkX2xpc3QgPSBbXSwgcmVwbGFjZW1lbnRfZmllbGQgPSBtYXRjaFsyXSwgZmllbGRfbWF0Y2ggPSBbXVxuICAgICAgICAgICAgICAgICAgICBpZiAoKGZpZWxkX21hdGNoID0gcmUua2V5LmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZXBsYWNlbWVudF9maWVsZCA9IHJlcGxhY2VtZW50X2ZpZWxkLnN1YnN0cmluZyhmaWVsZF9tYXRjaFswXS5sZW5ndGgpKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZpZWxkX21hdGNoID0gcmUua2V5X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoZmllbGRfbWF0Y2ggPSByZS5pbmRleF9hY2Nlc3MuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXknKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gZmllbGRfbGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnX25hbWVzIHw9IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFyZ19uYW1lcyA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IG1hdGNoWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fbm86ICAgIG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogICAgICAgIG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbjogICAgICAgIG1hdGNoWzNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkX2NoYXI6ICAgIG1hdGNoWzRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICAgICAgIG1hdGNoWzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICAgICAgIG1hdGNoWzZdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAgIG1hdGNoWzddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgIG1hdGNoWzhdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSB1bmV4cGVjdGVkIHBsYWNlaG9sZGVyJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9mbXQgPSBfZm10LnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwcmludGZfY2FjaGVbZm10XSA9IHBhcnNlX3RyZWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHBvcnQgdG8gZWl0aGVyIGJyb3dzZXIgb3Igbm9kZS5qc1xuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG4gICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzWydzcHJpbnRmJ10gPSBzcHJpbnRmXG4gICAgICAgIGV4cG9ydHNbJ3ZzcHJpbnRmJ10gPSB2c3ByaW50ZlxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93WydzcHJpbnRmJ10gPSBzcHJpbnRmXG4gICAgICAgIHdpbmRvd1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICdzcHJpbnRmJzogc3ByaW50ZixcbiAgICAgICAgICAgICAgICAgICAgJ3ZzcHJpbnRmJzogdnNwcmludGZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgcXVvdGUtcHJvcHMgKi9cbn0oKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuIiwiLyplc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIqL1xuaW1wb3J0IHsgV2ViU29ja2V0TWFuYWdlck9iamVjdCB9IGZyb20gXCIuL3dlYlNvY2tldE1hbmFnZXJcIjtcblxuZ2xvYmFsLmNvbm5lY3QgPSBnbG9iYWwuY29ubmVjdCB8fCB7fTtcbmNvbm5lY3QuV2ViU29ja2V0TWFuYWdlciA9IFdlYlNvY2tldE1hbmFnZXJPYmplY3Q7XG5cbmV4cG9ydCBjb25zdCBXZWJTb2NrZXRNYW5hZ2VyID0gV2ViU29ja2V0TWFuYWdlck9iamVjdDtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0= +!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=2)}([function(e,n,t){"use strict";var r=t(1);function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i={assertTrue:function(e,n){if(!e)throw new Error(n)},assertNotNull:function(e,n){return i.assertTrue(null!==e&&void 0!==o(e),Object(r.sprintf)("%s must be provided",n||"A value")),e},isNonEmptyString:function(e){return"string"==typeof e&&e.length>0},assertIsList:function(e,n){if(!Array.isArray(e))throw new Error(n+" is not an array")},isFunction:function(e){return!!(e&&e.constructor&&e.call&&e.apply)},isObject:function(e){return!("object"!==o(e)||null===e)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e}},c=new RegExp("^(wss://)\\w*");i.validWSUrl=function(e){return c.test(e)},i.getSubscriptionResponse=function(e,n,t){return{topic:e,content:{status:n?"success":"failure",topics:t}}},i.assertIsObject=function(e,n){if(!i.isObject(e))throw new Error(n+" is not an object!")},i.addJitter=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;n=Math.min(n,1);var t=Math.random()>.5?1:-1;return Math.floor(e+t*e*Math.random()*n)},i.isNetworkOnline=function(){return navigator.onLine};var s=i,a="NULL",u="CLIENT_LOGGER",l="DEBUG",f="aws/subscribe",p="aws/unsubscribe",d="aws/heartbeat",b="connected",g="disconnected";function y(e){return(y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function S(e,n){return!n||"object"!==y(n)&&"function"!=typeof n?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):n}function k(e){return(k=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,n){return(v=Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,n)}function h(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function m(e,n){for(var t=0;t=this._level}},{key:"hasClientLogger",value:function(){return null!==this._clientLogger}},{key:"getLogger",value:function(e){var n=e.prefix||"";return this._logsDestination===l?this.consoleLoggerWrapper:new N(n)}},{key:"updateLoggerConfig",value:function(e){var n=e||{};this._level=n.level||I.DEBUG,this._clientLogger=n.logger||null,this._logsDestination=a,n.debug&&(this._logsDestination=l),n.logger&&(this._logsDestination=u)}}]),e}(),O=function(){function e(){h(this,e)}return w(e,[{key:"debug",value:function(){}},{key:"info",value:function(){}},{key:"warn",value:function(){}},{key:"error",value:function(){}}]),e}(),N=function(e){function n(e){var t;return h(this,n),(t=S(this,k(n).call(this))).prefix=e||"",t}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),n&&v(e,n)}(n,O),w(n,[{key:"debug",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t0&&void 0!==arguments[0]?arguments[0]:"";e.debug("["+n+"] Primary WebSocket: "+k(t.primary)+" | Secondary WebSocket: "+k(t.secondary))},h=function(e,n){return e&&e.readyState===n},m=function(e){return h(e,WebSocket.OPEN)},w=function(e){return null===e||void 0===e.readyState||h(e,WebSocket.CLOSED)},C=function(){return null!==t.secondary?t.secondary:t.primary},I=function(){return m(C())},T=function(){if(o.pendingResponse)return e.warn("Heartbeat response not received"),clearInterval(o.intervalHandle),o.pendingResponse=!1,void G();I()?(e.debug("Sending heartbeat"),C().send(D(d)),o.pendingResponse=!0):(e.warn("Failed to send heartbeat since WebSocket is not open"),v("sendHeartBeat"),G())},O=function(){r.exponentialBackOffTime=1e3,o.pendingResponse=!1,r.reconnectWebSocket=!0,clearTimeout(r.lifeTimeTimeoutHandle),clearInterval(o.intervalHandle),clearTimeout(r.exponentialTimeoutHandle),clearTimeout(r.webSocketInitCheckerTimeoutId)},N=function(){u.consecutiveFailedSubscribeAttempts=0,u.consecutiveNoResponseRequest=0,clearInterval(u.responseCheckIntervalId),clearInterval(u.reSubscribeIntervalId)},_=function(){try{e.info("WebSocket connection established!"),v("webSocketOnOpen"),r.connState=b,null===t.secondary&&S(i.connectionGain),O(),0===a.subscribed.size&&m(t.secondary)&&j(t.primary,"[Primary WebSocket] Closing WebSocket"),(a.subscribed.size>0||a.pending.size>0)&&(m(t.secondary)&&e.info("Subscribing secondary websocket to topics of primary websocket"),a.subscribed.forEach(function(e){a.subscriptionHistory.add(e),a.pending.add(e)}),a.subscribed.clear(),F()),T(),o.intervalHandle=setInterval(T,1e4),r.lifeTimeTimeoutHandle=setTimeout(function(){e.debug("Starting scheduled WebSocket manager reconnect"),G()},Date.parse(c.connConfig.webSocketTransport.expiry)-Date.now())}catch(n){e.error("Error after establishing WebSocket connection",n)}},E=function(n){e.info("Socket connection is closed",n),v("webSocketOnClose before-cleanup"),w(t.primary)&&(t.primary=null),w(t.secondary)&&(t.secondary=null),r.reconnectWebSocket&&(m(t.primary)||m(t.secondary)?w(t.primary)&&m(t.secondary)&&(e.info("[Primary] WebSocket Cleanly Closed"),t.primary=t.secondary,t.secondary=null):(e.warn("Neither primary websocket and nor secondary websocket have open connections, attempting to re-establish connection"),r.connState!==g?S(i.connectionLost):e.info("Ignoring connectionLost callback invocation"),r.connState=g,G()),v("webSocketOnClose after-cleanup"))},L=function(n){v("webSocketOnError"),e.error("WebSocketManager Error, error_event: ",n),G()},x=function(n){var r=JSON.parse(n.data);switch(r.topic){case f:if(e.debug("Subscription Message received from webSocket server",n.data),u.requestCompleted=!0,u.consecutiveNoResponseRequest=0,"success"===r.content.status)u.consecutiveFailedSubscribeAttempts=0,r.content.topics.forEach(function(e){a.subscriptionHistory.delete(e),a.pending.delete(e),a.subscribed.add(e)}),0===a.subscriptionHistory.size?m(t.secondary)&&(e.info("Successfully subscribed secondary websocket to all topics of primary websocket"),j(t.primary,"[Primary WebSocket] Closing WebSocket")):F(),S(i.subscriptionUpdate,r);else{if(clearInterval(u.reSubscribeIntervalId),++u.consecutiveFailedSubscribeAttempts,5===u.consecutiveFailedSubscribeAttempts)return S(i.subscriptionFailure,r),void(u.consecutiveFailedSubscribeAttempts=0);u.reSubscribeIntervalId=setInterval(function(){F()},500)}break;case d:e.debug("Heartbeat response received"),o.pendingResponse=!1;break;default:if(r.topic){if(e.debug("Message received for topic "+r.topic),m(t.primary)&&m(t.secondary)&&0===a.subscriptionHistory.size&&this===t.primary)return void e.warn("Ignoring Message for Topic "+r.topic+", to avoid duplicates");if(0===i.allMessage.size&&0===i.topic.size)return void e.warn("No registered callback listener for Topic",r.topic);S(i.allMessage,r),i.topic.has(r.topic)&&S(i.topic.get(r.topic),r)}else r.message?e.warn("WebSocketManager Message Error",r):e.warn("Invalid incoming message",r)}},F=function n(){if(u.consecutiveNoResponseRequest>3)return e.warn("Ignoring subscribePendingTopics since we have exhausted max subscription retries with no response"),void S(i.subscriptionFailure,s.getSubscriptionResponse(f,!1,Array.from(a.pending)));I()?(clearInterval(u.responseCheckIntervalId),C().send(D(f,{topics:Array.from(a.pending)})),u.requestCompleted=!1,u.responseCheckIntervalId=setInterval(function(){u.requestCompleted||(++u.consecutiveNoResponseRequest,n())},1e3)):e.warn("Ignoring subscribePendingTopics call since Default WebSocket is not open")},j=function(n,t){h(n,WebSocket.CONNECTING)||h(n,WebSocket.OPEN)?n.close(1e3,t):e.warn("Ignoring WebSocket Close request, WebSocket State: "+k(n))},R=function(e){j(t.primary,"[Primary] WebSocket "+e),j(t.secondary,"[Secondary] WebSocket "+e)},M=function(){var n=s.addJitter(r.exponentialBackOffTime,.3);Date.now()+n<=c.connConfig.urlConnValidTime?(e.debug("Scheduling WebSocket reinitialization, after delay "+n+" ms"),r.exponentialTimeoutHandle=setTimeout(function(){return A()},n),r.exponentialBackOffTime*=2):(e.warn("WebSocket URL is cannot be used to establish connection"),G())},P=function(){O(),N(),e.error("WebSocket Initialization failed"),r.websocketInitFailed=!0,R("Terminating WebSocket Manager"),clearInterval(y),S(i.initFailure)},D=function(e,n){return JSON.stringify({topic:e,content:n})},H=function(n){return!!(s.isObject(n)&&s.isObject(n.webSocketTransport)&&s.isNonEmptyString(n.webSocketTransport.url)&&s.validWSUrl(n.webSocketTransport.url)&&s.isNonEmptyString(n.webSocketTransport.expiry)&&Date.parse(n.webSocketTransport.expiry)-Date.now()>=36e5)||(e.error("Invalid WebSocket Connection Configuration",n),!1)},G=function n(){if(s.isNetworkOnline())if(r.websocketInitFailed)e.debug("WebSocket Init had failed, ignoring this getWebSocketConnConfig request");else{if(c.promiseCompleted)return O(),e.info("Fetching new WebSocket connection configuration"),c.promiseCompleted=!1,c.promiseHandle=i.getWebSocketTransport(),c.promiseHandle.then(function(n){c.promiseCompleted=!0,e.debug("Successfully fetched webSocket connection configuration",n),H(n)?(c.connConfig=n,c.connConfig.urlConnValidTime=Date.now()+85e3,A()):P()},function(t){c.promiseCompleted=!0,e.error("Failed to fetch webSocket connection configuration",t),setTimeout(function(){return n()},s.addJitter(5e3,.3))});e.debug("There is an ongoing getWebSocketConnConfig request, this request will be ignored")}else e.info("Network offline, ignoring this getWebSocketConnConfig request")},A=function(){if(r.websocketInitFailed)e.info("web-socket initializing had failed, aborting re-init");else if(s.isNetworkOnline()){e.info("Initializing Websocket Manager"),v("initWebSocket");try{if(H(c.connConfig)){var n=null;m(t.primary)?(e.debug("Primary Socket connection is already open"),h(t.secondary,WebSocket.CONNECTING)||(e.debug("Establishing a secondary web-socket connection"),t.secondary=U()),n=t.secondary):(h(t.primary,WebSocket.CONNECTING)||(e.debug("Establishing a primary web-socket connection"),t.primary=U()),n=t.primary),r.webSocketInitCheckerTimeoutId=setTimeout(function(){m(n)||M()},1e3)}}catch(n){e.error("Error Initializing web-socket-manager",n),P()}}else e.warn("System is offline aborting web-socket init")},U=function(){var e=new WebSocket(c.connConfig.webSocketTransport.url);return e.addEventListener("open",_),e.addEventListener("message",x),e.addEventListener("error",L),e.addEventListener("close",E),e};this.init=function(n){if(s.assertTrue(s.isFunction(n),"transportHandle must be a function"),null===i.getWebSocketTransport)return i.getWebSocketTransport=n,G();e.warn("Web Socket Manager was already initialized")},this.onInitFailure=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.initFailure.add(e),r.websocketInitFailed&&e(),function(){return i.initFailure.delete(e)}},this.onConnectionGain=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.connectionGain.add(e),I()&&e(),function(){return i.connectionGain.delete(e)}},this.onConnectionLost=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.connectionLost.add(e),r.connState===g&&e(),function(){return i.connectionLost.delete(e)}},this.onSubscriptionUpdate=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.subscriptionUpdate.add(e),function(){return i.subscriptionUpdate.delete(e)}},this.onSubscriptionFailure=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.subscriptionFailure.add(e),function(){return i.subscriptionFailure.delete(e)}},this.onMessage=function(e,n){return s.assertNotNull(e,"topicName"),s.assertTrue(s.isFunction(n),"cb must be a function"),i.topic.has(e)?i.topic.get(e).add(n):i.topic.set(e,new Set([n])),function(){return i.topic.get(e).delete(n)}},this.onAllMessage=function(e){return s.assertTrue(s.isFunction(e),"cb must be a function"),i.allMessage.add(e),function(){return i.allMessage.delete(e)}},this.subscribeTopics=function(e){s.assertNotNull(e,"topics"),s.assertIsList(e),e.forEach(function(e){a.subscribed.has(e)||a.pending.add(e)}),u.consecutiveNoResponseRequest=0,F()},this.sendMessage=function(n){if(s.assertIsObject(n,"payload"),void 0===n.topic||l.has(n.topic))e.warn("Cannot send message, Invalid topic",n);else{try{n=JSON.stringify(n)}catch(t){return void e.warn("Error stringify message",n)}I()?C().send(n):e.warn("Cannot send message, web socket connection is not open")}},this.closeWebSocket=function(){O(),N(),r.reconnectWebSocket=!1,clearInterval(y),R("User request to close WebSocket")}},L={create:function(){return new E},setGlobalConfig:function(e){var n=e.loggerConfig;W.updateLoggerConfig(n)},LogLevel:I,Logger:C}},function(e,n,t){var r;!function(){"use strict";var o={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(e){return function(e,n){var t,r,c,s,a,u,l,f,p,d=1,b=e.length,g="";for(r=0;r=0),s.type){case"b":t=parseInt(t,10).toString(2);break;case"c":t=String.fromCharCode(parseInt(t,10));break;case"d":case"i":t=parseInt(t,10);break;case"j":t=JSON.stringify(t,null,s.width?parseInt(s.width):0);break;case"e":t=s.precision?parseFloat(t).toExponential(s.precision):parseFloat(t).toExponential();break;case"f":t=s.precision?parseFloat(t).toFixed(s.precision):parseFloat(t);break;case"g":t=s.precision?String(Number(t.toPrecision(s.precision))):parseFloat(t);break;case"o":t=(parseInt(t,10)>>>0).toString(8);break;case"s":t=String(t),t=s.precision?t.substring(0,s.precision):t;break;case"t":t=String(!!t),t=s.precision?t.substring(0,s.precision):t;break;case"T":t=Object.prototype.toString.call(t).slice(8,-1).toLowerCase(),t=s.precision?t.substring(0,s.precision):t;break;case"u":t=parseInt(t,10)>>>0;break;case"v":t=t.valueOf(),t=s.precision?t.substring(0,s.precision):t;break;case"x":t=(parseInt(t,10)>>>0).toString(16);break;case"X":t=(parseInt(t,10)>>>0).toString(16).toUpperCase()}o.json.test(s.type)?g+=t:(!o.number.test(s.type)||f&&!s.sign?p="":(p=f?"+":"-",t=t.toString().replace(o.sign,"")),u=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",l=s.width-(p+t).length,a=s.width&&l>0?u.repeat(l):"",g+=s.align?p+t+a:"0"===u?p+a+t:a+p+t)}return g}(function(e){if(s[e])return s[e];var n,t=e,r=[],i=0;for(;t;){if(null!==(n=o.text.exec(t)))r.push(n[0]);else if(null!==(n=o.modulo.exec(t)))r.push("%");else{if(null===(n=o.placeholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");if(n[2]){i|=1;var c=[],a=n[2],u=[];if(null===(u=o.key.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(c.push(u[1]);""!==(a=a.substring(u[0].length));)if(null!==(u=o.key_access.exec(a)))c.push(u[1]);else{if(null===(u=o.index_access.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");c.push(u[1])}n[2]=c}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:n[0],param_no:n[1],keys:n[2],sign:n[3],pad_char:n[4],align:n[5],width:n[6],precision:n[7],type:n[8]})}t=t.substring(n[0].length)}return s[e]=r}(e),arguments)}function c(e,n){return i.apply(null,[e].concat(n||[]))}var s=Object.create(null);n.sprintf=i,n.vsprintf=c,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=c,void 0===(r=function(){return{sprintf:i,vsprintf:c}}.call(n,t,n,e))||(e.exports=r))}()},function(e,n,t){"use strict";t.r(n),function(e){t.d(n,"WebSocketManager",function(){return o});var r=t(0);e.connect=e.connect||{},connect.WebSocketManager=r.a;var o=r.a}.call(this,t(3))},function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(e){"object"==typeof window&&(t=window)}e.exports=t}]); +//# sourceMappingURL=amazon-connect-websocket-manager.js.map \ No newline at end of file diff --git a/src/lib/amazon-connect-websocket-manager.js.map b/src/lib/amazon-connect-websocket-manager.js.map new file mode 100644 index 00000000..49bd0e03 --- /dev/null +++ b/src/lib/amazon-connect-websocket-manager.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/utils.js","webpack:///./src/constants.js","webpack:///./src/log.js","webpack:///./src/webSocketManager.js","webpack:///./node_modules/sprintf-js/src/sprintf.js","webpack:///./src/index.js","webpack:///(webpack)/buildin/global.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Utils","premise","message","Error","assertTrue","undefined","_typeof","sprintf","length","Array","isArray","obj","constructor","apply","wsRegex","RegExp","validWSUrl","wsUrl","test","getSubscriptionResponse","routeKey","isSuccess","topicList","topic","content","status","topics","assertIsObject","isObject","addJitter","base","maxJitter","arguments","Math","min","sign","random","floor","isNetworkOnline","navigator","onLine","LOGS_DESTINATION","ROUTE_KEY","CONN_STATE","Logger","data","LogLevel","DEBUG","INFO","WARN","ERROR","LogManagerImpl","_classCallCheck","this","updateLoggerConfig","consoleLoggerWrapper","createConsoleLogger","level","logStatement","hasClientLogger","_clientLogger","debug","info","warn","error","_level","options","prefix","_logsDestination","LoggerWrapperImpl","inputConfig","config","logger","LoggerWrapper","_this","_possibleConstructorReturn","_getPrototypeOf","_len","args","_key","_log","_len2","_key2","_len3","_key3","_len4","_key4","LogManager","isLevelEnabled","writeToClientLogger","_shouldLog","_convertToSingleStatement","_writeToClientLogger","index","arg","_convertToString","isString","isFunction","toString","toStringResult","JSON","stringify","console","__webpack_exports__","WebSocketManagerObject","WebSocketManager","getLogger","online","webSocket","primary","secondary","reconnectConfig","reconnectWebSocket","websocketInitFailed","exponentialBackOffTime","exponentialTimeoutHandle","lifeTimeTimeoutHandle","webSocketInitCheckerTimeoutId","connState","heartbeatConfig","pendingResponse","intervalHandle","callbacks","initFailure","Set","getWebSocketTransport","subscriptionUpdate","subscriptionFailure","Map","allMessage","connectionGain","connectionLost","webSocketConfig","connConfig","promiseHandle","promiseCompleted","topicSubscription","subscribed","pending","subscriptionHistory","topicSubscriptionConfig","responseCheckIntervalId","requestCompleted","reSubscribeIntervalId","consecutiveFailedSubscribeAttempts","consecutiveNoResponseRequest","invalidSendMessageRouteKeys","networkConnectivityChecker","setInterval","ws","getDefaultWebSocket","isWebSocketState","WebSocket","CLOSING","CLOSED","getWebSocketConnConfig","invokeCallbacks","response","forEach","callback","getWebSocketStates","readyState","CONNECTING","OPEN","printWebSocketState","event","webSocketStateCode","isWebSocketOpen","isWebSocketClosed","isDefaultWebSocketOpen","sendHeartBeat","clearInterval","send","createWebSocketPayload","resetWebSocketState","clearTimeout","resetSubscriptions","webSocketOnOpen","size","closeSpecificWebSocket","add","clear","subscribePendingTopics","setTimeout","Date","parse","webSocketTransport","expiry","now","webSocketOnClose","webSocketOnError","webSocketOnMessage","topicName","has","from","reason","close","closeWebSocket","retryWebSocketInitialization","waitTime","urlConnValidTime","initWebSocket","terminateWebSocketManager","validWebSocketConnConfig","isNonEmptyString","url","then","getNewWebSocket","addEventListener","init","transportHandle","onInitFailure","cb","onConnectionGain","onConnectionLost","onSubscriptionUpdate","onSubscriptionFailure","onMessage","assertNotNull","set","onAllMessage","subscribeTopics","assertIsList","sendMessage","payload","setGlobalConfig","loggerConfig","__WEBPACK_AMD_DEFINE_RESULT__","re","not_string","not_bool","not_type","not_primitive","number","numeric_arg","json","not_json","text","modulo","placeholder","key_access","index_access","parse_tree","argv","k","ph","pad","pad_character","pad_length","is_positive","cursor","tree_length","output","keys","param_no","type","Function","isNaN","TypeError","parseInt","String","fromCharCode","width","precision","parseFloat","toExponential","toFixed","Number","toPrecision","substring","slice","toLowerCase","valueOf","toUpperCase","replace","pad_char","charAt","repeat","align","sprintf_format","fmt","sprintf_cache","match","_fmt","arg_names","exec","push","SyntaxError","field_list","replacement_field","field_match","sprintf_parse","vsprintf","concat","window","global","_webSocketManager__WEBPACK_IMPORTED_MODULE_0__","connect","g","e"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,+QCjFrD,IAAMC,EAAQ,CAKdA,WAAmB,SAASC,EAASC,GACnC,IAAKD,EACH,MAAM,IAAIE,MAAMD,IAOpBF,cAAsB,SAASf,EAAOV,GAKpC,OAJAyB,EAAMI,WACM,OAAVnB,QAAmCoB,IAAjBC,EAAOrB,GACzBsB,kBAAQ,sBAAuBhC,GAAQ,YAElCU,GAGTe,iBAAyB,SAASf,GAChC,MAAwB,iBAAVA,GAAsBA,EAAMuB,OAAS,GAGrDR,aAAqB,SAASf,EAAOM,GACnC,IAAKkB,MAAMC,QAAQzB,GACjB,MAAM,IAAIkB,MAAMZ,EAAM,qBAQ1BS,WAAmB,SAASW,GAC1B,SAAUA,GAAOA,EAAIC,aAAeD,EAAIxC,MAAQwC,EAAIE,QAGtDb,SAAiB,SAASf,GACxB,QAA0B,WAAjBqB,EAAOrB,IAAgC,OAAVA,IAGxCe,SAAiB,SAASf,GACxB,MAAwB,iBAAVA,GAGhBe,SAAiB,SAASf,GACxB,MAAwB,iBAAVA,IAGV6B,EAAU,IAAIC,OAAO,iBAC3Bf,EAAMgB,WAAa,SAAUC,GAC3B,OAAOH,EAAQI,KAAKD,IAGtBjB,EAAMmB,wBAA0B,SAACC,EAAUC,EAAWC,GACpD,MAAO,CACLC,MAAOH,EACPI,QAAU,CACRC,OAAQJ,EAAY,UAAY,UAChCK,OAAQJ,KAKdtB,EAAM2B,eAAiB,SAAS1C,EAAOM,GACrC,IAAKS,EAAM4B,SAAS3C,GAClB,MAAM,IAAIkB,MAAMZ,EAAM,uBAI1BS,EAAM6B,UAAY,SAAUC,GAAqB,IAAfC,EAAeC,UAAAxB,OAAA,QAAAH,IAAA2B,UAAA,GAAAA,UAAA,GAAH,EAC5CD,EAAYE,KAAKC,IAAIH,EAAW,GAChC,IAAMI,EAAOF,KAAKG,SAAW,GAAM,GAAK,EACxC,OAAOH,KAAKI,MAAMP,EAAOK,EAAOL,EAAOG,KAAKG,SAAWL,IAGzD/B,EAAMsC,gBAAkB,kBAAMC,UAAUC,QAEzBxC,QCjFFyC,EACL,OADKA,EAEI,gBAFJA,EAGJ,QAeIC,EACA,gBADAA,EAEE,kBAFFA,EAGA,gBAGAC,EACA,YADAA,EAEG,e,k8BCvBVC,E,0EACEC,M,2BAEDA,M,2BAEAA,M,4BAECA,Q,KAIFC,EAAW,CACfC,MAAO,GACPC,KAAM,GACNC,KAAM,GACNC,MAAO,IAGHC,E,WACJ,SAAAA,IAAcC,EAAAC,KAAAF,GACZE,KAAKC,qBACLD,KAAKE,qBAAuBC,I,sDAGVC,EAAOC,GACzB,GAAKL,KAAKM,kBAGV,OAAQF,GACN,KAAKX,EAASC,MACZ,OAAOM,KAAKO,cAAcC,MAAMH,GAClC,KAAKZ,EAASE,KACZ,OAAOK,KAAKO,cAAcE,KAAKJ,GACjC,KAAKZ,EAASG,KACZ,OAAOI,KAAKO,cAAcG,KAAKL,GACjC,KAAKZ,EAASI,MACZ,OAAOG,KAAKO,cAAcI,MAAMN,M,qCAIvBD,GACb,OAAOA,GAASJ,KAAKY,S,wCAIrB,OAA8B,OAAvBZ,KAAKO,gB,gCAGJM,GACR,IAAIC,EAASD,EAAQC,QAAU,GAC/B,OAAId,KAAKe,mBAAqB3B,EACrBY,KAAKE,qBAEP,IAAIc,EAAkBF,K,yCAGZG,GACjB,IAAIC,EAASD,GAAe,GAC5BjB,KAAKY,OAASM,EAAOd,OAASX,EAASC,MACvCM,KAAKO,cAAgBW,EAAOC,QAAU,KACtCnB,KAAKe,iBAAmB3B,EACpB8B,EAAOV,QACTR,KAAKe,iBAAmB3B,GAEtB8B,EAAOC,SACTnB,KAAKe,iBAAmB3B,O,KAKxBgC,E,uLAUAJ,E,YACJ,SAAAA,EAAYF,GAAQ,IAAAO,EAAA,OAAAtB,EAAAC,KAAAgB,IAClBK,EAAAC,EAAAtB,KAAAuB,EAAAP,GAAAlG,KAAAkF,QACKc,OAASA,GAAU,GAFNO,E,4OADUD,G,mCAMf,QAAAI,EAAA7C,UAAAxB,OAANsE,EAAM,IAAArE,MAAAoE,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA/C,UAAA+C,GACb1B,KAAK2B,KAAKlC,EAASC,MAAO+B,K,6BAGd,QAAAG,EAAAjD,UAAAxB,OAANsE,EAAM,IAAArE,MAAAwE,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAANJ,EAAMI,GAAAlD,UAAAkD,GACZ7B,KAAK2B,KAAKlC,EAASE,KAAM8B,K,6BAGb,QAAAK,EAAAnD,UAAAxB,OAANsE,EAAM,IAAArE,MAAA0E,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAANN,EAAMM,GAAApD,UAAAoD,GACZ/B,KAAK2B,KAAKlC,EAASG,KAAM6B,K,8BAGZ,QAAAO,EAAArD,UAAAxB,OAANsE,EAAM,IAAArE,MAAA4E,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAANR,EAAMQ,GAAAtD,UAAAsD,GACbjC,KAAK2B,KAAKlC,EAASI,MAAO4B,K,iCAGjBrB,GACT,OAAO8B,EAAW5B,mBAAqB4B,EAAWC,eAAe/B,K,2CAG9CA,EAAOC,GAC1B6B,EAAWE,oBAAoBhC,EAAOC,K,2BAGnCD,EAAOqB,GACV,GAAIzB,KAAKqC,WAAWjC,GAAQ,CAC1B,IAAIC,EAAeL,KAAKsC,0BAA0Bb,GAClDzB,KAAKuC,qBAAqBnC,EAAOC,M,gDAIXoB,GACxB,IAAIpB,EAAe,GACfL,KAAKc,SACPT,GAAgBL,KAAKc,OAAS,KAEhC,IAAK,IAAI0B,EAAQ,EAAGA,EAAQf,EAAKtE,OAAQqF,IAAS,CAChD,IAAIC,EAAMhB,EAAKe,GACfnC,GAAgBL,KAAK0C,iBAAiBD,GAAO,IAE/C,OAAOpC,I,uCAGQoC,GACf,IACE,IAAKA,EACH,MAAO,GAET,GAAI9F,EAAMgG,SAASF,GACjB,OAAOA,EAET,GAAI9F,EAAM4B,SAASkE,IAAQ9F,EAAMiG,WAAWH,EAAII,UAAW,CACzD,IAAIC,EAAiBL,EAAII,WACzB,GAAuB,oBAAnBC,EACF,OAAOA,EAGX,OAAOC,KAAKC,UAAUP,GACtB,MAAO9B,GAEP,OADAsC,QAAQtC,MAAM,4CAA6C8B,EAAK9B,GACzD,Q,KAKTR,EAAsB,WACxB,IAAIgB,EAAS,IAAIC,EAKjB,OAJAD,EAAOX,MAAQyC,QAAQzC,MACvBW,EAAOV,KAAOwC,QAAQxC,KACtBU,EAAOT,KAAOuC,QAAQvC,KACtBS,EAAOR,MAAQsC,QAAQtC,MAChBQ,GAGHe,EAAa,IAAIpC,ECpKvBvF,EAAAU,EAAAiI,EAAA,sBAAAC,IAmBA,IAAMC,EAAmB,WAErB,IAAMjC,EAASe,EAAWmB,UAAU,IAEhCC,EAAS3G,EAAMsC,kBAEfsE,EAAY,CACZC,QAAS,KACTC,UAAW,MAGXC,EAAkB,CAClBC,oBAAoB,EACpBC,qBAAqB,EACrBC,uBAAwB,IACxBC,yBAA0B,KAC1BC,sBAAuB,KACvBC,8BAA+B,KAC/BC,UAAW,MAGXC,EAAkB,CAClBC,iBAAiB,EACjBC,eAAgB,MAGhBC,EAAY,CACZC,YAAa,IAAIC,IACjBC,sBAAuB,KACvBC,mBAAoB,IAAIF,IACxBG,oBAAqB,IAAIH,IACzBrG,MAAO,IAAIyG,IACXC,WAAY,IAAIL,IAChBM,eAAgB,IAAIN,IACpBO,eAAgB,IAAIP,KAGpBQ,EAAkB,CAClBC,WAAY,KACZC,cAAe,KACfC,kBAAkB,GAGlBC,EAAoB,CACpBC,WAAY,IAAIb,IAChBc,QAAS,IAAId,IACbe,oBAAqB,IAAIf,KAGzBgB,EAA0B,CAC1BC,wBAAyB,KACzBC,kBAAkB,EAClBC,sBAAuB,KACvBC,mCAAoC,EACpCC,6BAA8B,GAG5BC,EAA8B,IAAItB,IAAI,CAAClF,EAAqBA,EAAuBA,IAEnFyG,EAA6BC,YAAY,WAC3C,GAAIzC,IAAW3G,EAAMsC,kBAAmB,CAEpC,KADAqE,EAAS3G,EAAMsC,mBAGX,YADAkC,EAAOV,KAAK,mBAGhB,IAAMuF,EAAKC,IACP3C,KAAY0C,GAAME,EAAiBF,EAAIG,UAAUC,UAAYF,EAAiBF,EAAIG,UAAUE,WAC5FlF,EAAOV,KAAK,kDACZ6F,OFzE8B,KE8EpCC,EAAkB,SAASlC,EAAWmC,GACxCnC,EAAUoC,QAAQ,SAAUC,GACxB,IACIA,EAASF,GACX,MAAO7F,GACLQ,EAAOR,MAAM,2BAA4BA,OAK/CgG,EAAqB,SAASX,GAChC,GAAW,OAAPA,EAAa,MAAO,OACxB,OAAQA,EAAGY,YACP,KAAKT,UAAUU,WACX,MAAO,aACX,KAAKV,UAAUW,KACX,MAAO,OACX,KAAKX,UAAUC,QACX,MAAO,UACX,KAAKD,UAAUE,OACX,MAAO,SACX,QACI,MAAO,cAIbU,EAAsB,WAAsB,IAAZC,EAAYrI,UAAAxB,OAAA,QAAAH,IAAA2B,UAAA,GAAAA,UAAA,GAAJ,GAC1CwC,EAAOX,MAAM,IAAMwG,EAAQ,wBAA0BL,EAAmBpD,EAAUC,SAC5E,2BAAkCmD,EAAmBpD,EAAUE,aAGnEyC,EAAmB,SAASF,EAAIiB,GAClC,OAAOjB,GAAMA,EAAGY,aAAeK,GAG7BC,EAAkB,SAASlB,GAC7B,OAAOE,EAAiBF,EAAIG,UAAUW,OAGpCK,EAAoB,SAASnB,GAE/B,OAAc,OAAPA,QAAiChJ,IAAlBgJ,EAAGY,YAA4BV,EAAiBF,EAAIG,UAAUE,SAQlFJ,EAAsB,WACxB,OAA4B,OAAxB1C,EAAUE,UACHF,EAAUE,UAEdF,EAAUC,SAGf4D,EAAyB,WAC3B,OAAOF,EAAgBjB,MAGrBoB,EAAgB,WAClB,GAAInD,EAAgBC,gBAKhB,OAJAhD,EAAOT,KAAK,mCACZ4G,cAAcpD,EAAgBE,gBAC9BF,EAAgBC,iBAAkB,OAClCmC,IAGAc,KACAjG,EAAOX,MAAM,qBACbyF,IAAsBsB,KAAKC,EAAuBnI,IAClD6E,EAAgBC,iBAAkB,IAElChD,EAAOT,KAAK,wDACZqG,EAAoB,iBACpBT,MAIFmB,EAAsB,WACxB/D,EAAgBG,uBAAyB,IACzCK,EAAgBC,iBAAkB,EAClCT,EAAgBC,oBAAqB,EAErC+D,aAAahE,EAAgBK,uBAC7BuD,cAAcpD,EAAgBE,gBAC9BsD,aAAahE,EAAgBI,0BAC7B4D,aAAahE,EAAgBM,gCAG3B2D,EAAqB,WACvBpC,EAAwBI,mCAAqC,EAC7DJ,EAAwBK,6BAA+B,EACvD0B,cAAc/B,EAAwBC,yBACtC8B,cAAc/B,EAAwBG,wBAGpCkC,EAAkB,WACpB,IACIzG,EAAOV,KAAK,qCACZsG,EAAoB,mBACpBrD,EAAgBO,UAAY3E,EAEA,OAAxBiE,EAAUE,WACV8C,EAAgBlC,EAAUQ,gBAG9B4C,IAG0C,IAAtCtC,EAAkBC,WAAWyC,MAAcX,EAAgB3D,EAAUE,YACrEqE,EAAuBvE,EAAUC,QAAS,0CAE1C2B,EAAkBC,WAAWyC,KAAO,GAAK1C,EAAkBE,QAAQwC,KAAO,KACtEX,EAAgB3D,EAAUE,YAC1BtC,EAAOV,KAAK,kEAEhB0E,EAAkBC,WAAWqB,QAAQ,SAAAvI,GACjCiH,EAAkBG,oBAAoByC,IAAI7J,GAC1CiH,EAAkBE,QAAQ0C,IAAI7J,KAElCiH,EAAkBC,WAAW4C,QAC7BC,KAGJZ,IACAnD,EAAgBE,eAAiB2B,YAAYsB,EFnNpB,KEqNzB3D,EAAgBK,sBAAwBmE,WAAW,WAC/C/G,EAAOX,MAAM,kDACb8F,KACA6B,KAAKC,MAAMrD,EAAgBC,WAAWqD,mBAAmBC,QAAUH,KAAKI,OAC9E,MAAO5H,GACLQ,EAAOR,MAAM,gDAAiDA,KAIhE6H,EAAmB,SAASxB,GAC9B7F,EAAOV,KAAK,8BAA+BuG,GAC3CD,EAAoB,mCAChBI,EAAkB5D,EAAUC,WAC5BD,EAAUC,QAAU,MAEpB2D,EAAkB5D,EAAUE,aAC5BF,EAAUE,UAAY,MAErBC,EAAgBC,qBAGhBuD,EAAgB3D,EAAUC,UAAa0D,EAAgB3D,EAAUE,WAiB3D0D,EAAkB5D,EAAUC,UAAY0D,EAAgB3D,EAAUE,aACzEtC,EAAOV,KAAK,sCACZ8C,EAAUC,QAAUD,EAAUE,UAC9BF,EAAUE,UAAY,OAnBtBtC,EAAOT,KAAK,sHACRgD,EAAgBO,YAAc3E,EAS9BiH,EAAgBlC,EAAUS,gBAE1B3D,EAAOV,KAAK,+CAEhBiD,EAAgBO,UAAY3E,EAC5BgH,KAMJS,EAAoB,oCAGlB0B,EAAmB,SAASzB,GAC9BD,EAAoB,oBACpB5F,EAAOR,MAAM,wCAAyCqG,GACtDV,KAGEoC,EAAqB,SAAS1B,GAChC,IAAMR,EAAWzD,KAAKqF,MAAMpB,EAAMxH,MAElC,OAAQgH,EAAStI,OAEb,KAAKmB,EAKD,GAJA8B,EAAOX,MAAM,sDAAuDwG,EAAMxH,MAC1E+F,EAAwBE,kBAAmB,EAC3CF,EAAwBK,6BAA+B,EAEvB,YAA5BY,EAASrI,QAAQC,OACjBmH,EAAwBI,mCAAqC,EAC7Da,EAASrI,QAAQE,OAAOoI,QAAS,SAAAkC,GAC7BxD,EAAkBG,oBAAlB,OAA6CqD,GAC7CxD,EAAkBE,QAAlB,OAAiCsD,GACjCxD,EAAkBC,WAAW2C,IAAIY,KAEc,IAA/CxD,EAAkBG,oBAAoBuC,KAClCX,EAAgB3D,EAAUE,aAC1BtC,EAAOV,KAAK,kFACZqH,EAAuBvE,EAAUC,QAAS,0CAG9CyE,IAEJ1B,EAAgBlC,EAAUI,mBAAoB+B,OAE3C,CAGH,GAFAc,cAAc/B,EAAwBG,yBACpCH,EAAwBI,mCFlSK,IEmS3BJ,EAAwBI,mCAGxB,OAFAY,EAAgBlC,EAAUK,oBAAqB8B,QAC/CjB,EAAwBI,mCAAqC,GAGjEJ,EAAwBG,sBAAwBK,YAAY,WACxDkC,KF1S4B,KE6SpC,MAEJ,KAAK5I,EACD8B,EAAOX,MAAM,+BACb0D,EAAgBC,iBAAkB,EAClC,MAEJ,QACI,GAAIqC,EAAStI,MAAO,CAEhB,GADAiD,EAAOX,MAAM,8BAAgCgG,EAAStI,OAClDgJ,EAAgB3D,EAAUC,UAAY0D,EAAgB3D,EAAUE,YACd,IAA/C0B,EAAkBG,oBAAoBuC,MAAc7H,OAASuD,EAAUC,QAO1E,YADArC,EAAOT,KAAK,8BAAgC8F,EAAStI,MAAQ,yBAIjE,GAAkC,IAA9BmG,EAAUO,WAAWiD,MAAuC,IAAzBxD,EAAUnG,MAAM2J,KAEnD,YADA1G,EAAOT,KAAK,4CAA6C8F,EAAStI,OAGtEqI,EAAgBlC,EAAUO,WAAY4B,GAClCnC,EAAUnG,MAAM0K,IAAIpC,EAAStI,QAC7BqI,EAAgBlC,EAAUnG,MAAM1C,IAAIgL,EAAStI,OAAQsI,QAGlDA,EAAS3J,QAChBsE,EAAOT,KAAK,iCAAkC8F,GAE9CrF,EAAOT,KAAK,2BAA4B8F,KAKlDyB,EAAyB,SAAzBA,IACF,GAAI1C,EAAwBK,6BFjVwB,EEoVhD,OAFAzE,EAAOT,KAAK,0GACZ6F,EAAgBlC,EAAUK,oBAAqB/H,EAAMmB,wBAAwBuB,GAAqB,EAAOjC,MAAMyL,KAAK1D,EAAkBE,WAGrI+B,KAKLE,cAAc/B,EAAwBC,yBAEtCS,IAAsBsB,KAAKC,EAAuBnI,EAAqB,CACnEhB,OAAUjB,MAAMyL,KAAK1D,EAAkBE,YAE3CE,EAAwBE,kBAAmB,EAG3CF,EAAwBC,wBAA0BO,YAAY,WACrDR,EAAwBE,qBACvBF,EAAwBK,6BAC1BqC,MFvW6C,MEwVjD9G,EAAOT,KAAK,6EAoBdoH,EAAyB,SAAS9B,EAAI8C,GACpC5C,EAAiBF,EAAIG,UAAUU,aAAeX,EAAiBF,EAAIG,UAAUW,MAC7Ed,EAAG+C,MAAM,IAAMD,GAEf3H,EAAOT,KAAK,sDAAwDiG,EAAmBX,KAIzFgD,EAAiB,SAASF,GAC5BhB,EAAuBvE,EAAUC,QAAS,uBAAyBsF,GACnEhB,EAAuBvE,EAAUE,UAAW,yBAA2BqF,IAGrEG,EAA+B,WACjC,IAAMC,EAAWvM,EAAM6B,UAAUkF,EAAgBG,uBFvXlB,IEwX3BsE,KAAKI,MAAQW,GAAYnE,EAAgBC,WAAWmE,kBACpDhI,EAAOX,MAAM,sDAAwD0I,EAAW,OAChFxF,EAAgBI,yBAA2BoE,WAAW,kBAAMkB,KAAiBF,GAC7ExF,EAAgBG,wBAA0B,IAE1C1C,EAAOT,KAAK,2DACZ4F,MAIF+C,EAA4B,WAC9B5B,IACAE,IACAxG,EAAOR,MAAM,mCACb+C,EAAgBE,qBAAsB,EACtCoF,EAAe,iCACf1B,cAAcxB,GACdS,EAAgBlC,EAAUC,cAGxBkD,EAAyB,SAAUtL,EAAKiC,GAC1C,OAAO4E,KAAKC,UAAU,CAClB9E,MAAShC,EACTiC,QAAWA,KAqCbmL,EAA2B,SAAUtE,GACvC,SAAIrI,EAAM4B,SAASyG,IAAerI,EAAM4B,SAASyG,EAAWqD,qBACrD1L,EAAM4M,iBAAiBvE,EAAWqD,mBAAmBmB,MACrD7M,EAAMgB,WAAWqH,EAAWqD,mBAAmBmB,MAC/C7M,EAAM4M,iBAAiBvE,EAAWqD,mBAAmBC,SACvDH,KAAKC,MAAMpD,EAAWqD,mBAAmBC,QAAUH,KAAKI,OFlc5B,QEqcjCpH,EAAOR,MAAM,6CAA8CqE,IACpD,IAGLsB,EAAyB,SAAzBA,IACF,GAAK3J,EAAMsC,kBAIX,GAAIyE,EAAgBE,oBAChBzC,EAAOX,MAAM,+EADjB,CAIA,GAAKuE,EAAgBG,iBAQrB,OAJAuC,IACAtG,EAAOV,KAAK,mDACZsE,EAAgBG,kBAAmB,EACnCH,EAAgBE,cAAgBZ,EAAUG,wBACnCO,EAAgBE,cAClBwE,KAAK,SAASjD,GACPzB,EAAgBG,kBAAmB,EACnC/D,EAAOX,MAAM,0DAA2DgG,GACnE8C,EAAyB9C,IAI9BzB,EAAgBC,WAAawB,EAE7BzB,EAAgBC,WAAWmE,iBAAmBhB,KAAKI,MFje5B,KEkevBa,KANIC,KAQR,SAASP,GACL/D,EAAgBG,kBAAmB,EACnC/D,EAAOR,MAAM,qDAAsDmI,GACnEZ,WAAW,kBAAM5B,KAA0B3J,EAAM6B,UFxejB,IAQR,OEychC2C,EAAOX,MAAM,yFARbW,EAAOV,KAAK,kEAmCd2I,EAAgB,WAClB,GAAI1F,EAAgBE,oBAChBzC,EAAOV,KAAK,6DAGhB,GAAK9D,EAAMsC,kBAAX,CAIAkC,EAAOV,KAAK,kCACZsG,EAAoB,iBACpB,IACI,GAAIuC,EAAyBvE,EAAgBC,YAAa,CACtD,IAAIgB,EAAK,KACLkB,EAAgB3D,EAAUC,UAC1BrC,EAAOX,MAAM,6CACR0F,EAAiB3C,EAAUE,UAAW0C,UAAUU,cACjD1F,EAAOX,MAAM,kDACb+C,EAAUE,UAAYiG,KAE1B1D,EAAKzC,EAAUE,YAEVyC,EAAiB3C,EAAUC,QAAS2C,UAAUU,cAC/C1F,EAAOX,MAAM,gDACb+C,EAAUC,QAAUkG,KAExB1D,EAAKzC,EAAUC,SAInBE,EAAgBM,8BAAgCkE,WAAW,WAClDhB,EAAgBlB,IACjBiD,KAEL,MAET,MAAOtI,GACLQ,EAAOR,MAAM,wCAAyCA,GACtD0I,UAhCAlI,EAAOT,KAAK,+CAoCdgJ,EAAkB,WACpB,IAAI1D,EAAK,IAAIG,UAAUpB,EAAgBC,WAAWqD,mBAAmBmB,KAKrE,OAJAxD,EAAG2D,iBAAiB,OAAQ/B,GAC5B5B,EAAG2D,iBAAiB,UAAWjB,GAC/B1C,EAAG2D,iBAAiB,QAASlB,GAC7BzC,EAAG2D,iBAAiB,QAASnB,GACtBxC,GAsEXhG,KAAK4J,KAxCQ,SAASC,GAElB,GADAlN,EAAMI,WAAWJ,EAAMiG,WAAWiH,GAAkB,sCACZ,OAApCxF,EAAUG,sBAMd,OAFAH,EAAUG,sBAAwBqF,EAE3BvD,IALHnF,EAAOT,KAAK,+CAsCpBV,KAAK8J,cAlDiB,SAASC,GAM3B,OALApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUC,YAAYyD,IAAIgC,GACtBrG,EAAgBE,qBAChBmG,IAEG,kBAAM1F,EAAUC,YAAV,OAA6ByF,KA6C9C/J,KAAKgK,iBArEoB,SAASD,GAM9B,OALApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUQ,eAAekD,IAAIgC,GACzB3C,KACA2C,IAEG,kBAAM1F,EAAUQ,eAAV,OAAgCkF,KAgEjD/J,KAAKiK,iBA7DoB,SAASF,GAM9B,OALApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUS,eAAeiD,IAAIgC,GACzBrG,EAAgBO,YAAc3E,GAC9ByK,IAEG,kBAAM1F,EAAUS,eAAV,OAAgCiF,KAwDjD/J,KAAKkK,qBAjCwB,SAASH,GAGlC,OAFApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUI,mBAAmBsD,IAAIgC,GAC1B,kBAAM1F,EAAUI,mBAAV,OAAoCsF,KA+BrD/J,KAAKmK,sBA5ByB,SAASJ,GAGnC,OAFApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUK,oBAAoBqD,IAAIgC,GAC3B,kBAAM1F,EAAUK,oBAAV,OAAqCqF,KA0BtD/J,KAAKoK,UAvBa,SAASzB,EAAWoB,GAQlC,OAPApN,EAAM0N,cAAc1B,EAAW,aAC/BhM,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACnC1F,EAAUnG,MAAM0K,IAAID,GACpBtE,EAAUnG,MAAM1C,IAAImN,GAAWZ,IAAIgC,GAEnC1F,EAAUnG,MAAMoM,IAAI3B,EAAW,IAAIpE,IAAI,CAACwF,KAErC,kBAAM1F,EAAUnG,MAAM1C,IAAImN,GAApB,OAAsCoB,KAgBvD/J,KAAKuK,aAbgB,SAAUR,GAG3B,OAFApN,EAAMI,WAAWJ,EAAMiG,WAAWmH,GAAK,yBACvC1F,EAAUO,WAAWmD,IAAIgC,GAClB,kBAAM1F,EAAUO,WAAV,OAA4BmF,KAW7C/J,KAAKwK,gBA7LmB,SAASnM,GAC7B1B,EAAM0N,cAAchM,EAAQ,UAC5B1B,EAAM8N,aAAapM,GAEnBA,EAAOoI,QAAQ,SAAAvI,GACNiH,EAAkBC,WAAWwD,IAAI1K,IAClCiH,EAAkBE,QAAQ0C,IAAI7J,KAItCqH,EAAwBK,6BAA+B,EACvDqC,KAmLJjI,KAAK0K,YAjNe,SAASC,GAEzB,GADAhO,EAAM2B,eAAeqM,EAAS,gBACR3N,IAAlB2N,EAAQzM,OAAuB2H,EAA4B+C,IAAI+B,EAAQzM,OACvEiD,EAAOT,KAAK,qCAAsCiK,OADtD,CAIA,IACIA,EAAU5H,KAAKC,UAAU2H,GAC3B,MAAOhK,GAEL,YADAQ,EAAOT,KAAK,0BAA2BiK,GAGvCvD,IACAnB,IAAsBsB,KAAKoD,GAE3BxJ,EAAOT,KAAK,4DAoMpBV,KAAKgJ,eAAiB,WAClBvB,IACAE,IACAjE,EAAgBC,oBAAqB,EACrC2D,cAAcxB,GACdkD,EAAe,qCAajB7F,EAAyB,CAC3BlH,OAVgC,WAChC,OAAO,IAAImH,GAUXwH,gBAPoB,SAAA1J,GACpB,IAAM2J,EAAe3J,EAAO2J,aAC5B3I,EAAWjC,mBAAmB4K,IAM9BpL,SAAUA,EACVF,OAAQA,I,gBC5oBZ,IAAAuL,GAEC,WACG,aAEA,IAAIC,EAAK,CACLC,WAAY,OACZC,SAAU,OACVC,SAAU,OACVC,cAAe,OACfC,OAAQ,UACRC,YAAa,eACbC,KAAM,MACNC,SAAU,OACVC,KAAM,YACNC,OAAQ,WACRC,YAAa,2FACbxP,IAAK,sBACLyP,WAAY,wBACZC,aAAc,aACd9M,KAAM,SAGV,SAAS5B,EAAQhB,GAEb,OAOJ,SAAwB2P,EAAYC,GAChC,IAAiDrJ,EAAkB9H,EAAGoR,EAAGC,EAAIC,EAAKC,EAAeC,EAAYC,EAAatN,EAAtHuN,EAAS,EAAGC,EAAcT,EAAW1O,OAAaoP,EAAS,GAC/D,IAAK5R,EAAI,EAAGA,EAAI2R,EAAa3R,IACzB,GAA6B,iBAAlBkR,EAAWlR,GAClB4R,GAAUV,EAAWlR,QAEpB,GAA6B,iBAAlBkR,EAAWlR,GAAiB,CAExC,IADAqR,EAAKH,EAAWlR,IACT6R,KAEH,IADA/J,EAAMqJ,EAAKO,GACNN,EAAI,EAAGA,EAAIC,EAAGQ,KAAKrP,OAAQ4O,IAAK,CACjC,GAAW/O,MAAPyF,EACA,MAAM,IAAI3F,MAAMI,EAAQ,gEAAiE8O,EAAGQ,KAAKT,GAAIC,EAAGQ,KAAKT,EAAE,KAEnHtJ,EAAMA,EAAIuJ,EAAGQ,KAAKT,SAItBtJ,EADKuJ,EAAGS,SACFX,EAAKE,EAAGS,UAGRX,EAAKO,KAOf,GAJItB,EAAGG,SAASrN,KAAKmO,EAAGU,OAAS3B,EAAGI,cAActN,KAAKmO,EAAGU,OAASjK,aAAekK,WAC9ElK,EAAMA,KAGNsI,EAAGM,YAAYxN,KAAKmO,EAAGU,OAAyB,iBAARjK,GAAoBmK,MAAMnK,GAClE,MAAM,IAAIoK,UAAU3P,EAAQ,0CAA2CuF,IAO3E,OAJIsI,EAAGK,OAAOvN,KAAKmO,EAAGU,QAClBN,EAAc3J,GAAO,GAGjBuJ,EAAGU,MACP,IAAK,IACDjK,EAAMqK,SAASrK,EAAK,IAAII,SAAS,GACjC,MACJ,IAAK,IACDJ,EAAMsK,OAAOC,aAAaF,SAASrK,EAAK,KACxC,MACJ,IAAK,IACL,IAAK,IACDA,EAAMqK,SAASrK,EAAK,IACpB,MACJ,IAAK,IACDA,EAAMM,KAAKC,UAAUP,EAAK,KAAMuJ,EAAGiB,MAAQH,SAASd,EAAGiB,OAAS,GAChE,MACJ,IAAK,IACDxK,EAAMuJ,EAAGkB,UAAYC,WAAW1K,GAAK2K,cAAcpB,EAAGkB,WAAaC,WAAW1K,GAAK2K,gBACnF,MACJ,IAAK,IACD3K,EAAMuJ,EAAGkB,UAAYC,WAAW1K,GAAK4K,QAAQrB,EAAGkB,WAAaC,WAAW1K,GACxE,MACJ,IAAK,IACDA,EAAMuJ,EAAGkB,UAAYH,OAAOO,OAAO7K,EAAI8K,YAAYvB,EAAGkB,aAAeC,WAAW1K,GAChF,MACJ,IAAK,IACDA,GAAOqK,SAASrK,EAAK,MAAQ,GAAGI,SAAS,GACzC,MACJ,IAAK,IACDJ,EAAMsK,OAAOtK,GACbA,EAAOuJ,EAAGkB,UAAYzK,EAAI+K,UAAU,EAAGxB,EAAGkB,WAAazK,EACvD,MACJ,IAAK,IACDA,EAAMsK,SAAStK,GACfA,EAAOuJ,EAAGkB,UAAYzK,EAAI+K,UAAU,EAAGxB,EAAGkB,WAAazK,EACvD,MACJ,IAAK,IACDA,EAAMpH,OAAOkB,UAAUsG,SAAS/H,KAAK2H,GAAKgL,MAAM,GAAI,GAAGC,cACvDjL,EAAOuJ,EAAGkB,UAAYzK,EAAI+K,UAAU,EAAGxB,EAAGkB,WAAazK,EACvD,MACJ,IAAK,IACDA,EAAMqK,SAASrK,EAAK,MAAQ,EAC5B,MACJ,IAAK,IACDA,EAAMA,EAAIkL,UACVlL,EAAOuJ,EAAGkB,UAAYzK,EAAI+K,UAAU,EAAGxB,EAAGkB,WAAazK,EACvD,MACJ,IAAK,IACDA,GAAOqK,SAASrK,EAAK,MAAQ,GAAGI,SAAS,IACzC,MACJ,IAAK,IACDJ,GAAOqK,SAASrK,EAAK,MAAQ,GAAGI,SAAS,IAAI+K,cAGjD7C,EAAGO,KAAKzN,KAAKmO,EAAGU,MAChBH,GAAU9J,IAGNsI,EAAGK,OAAOvN,KAAKmO,EAAGU,OAAWN,IAAeJ,EAAGlN,KAK/CA,EAAO,IAJPA,EAAOsN,EAAc,IAAM,IAC3B3J,EAAMA,EAAII,WAAWgL,QAAQ9C,EAAGjM,KAAM,KAK1CoN,EAAgBF,EAAG8B,SAA2B,MAAhB9B,EAAG8B,SAAmB,IAAM9B,EAAG8B,SAASC,OAAO,GAAK,IAClF5B,EAAaH,EAAGiB,OAASnO,EAAO2D,GAAKtF,OACrC8O,EAAMD,EAAGiB,OAASd,EAAa,EAAID,EAAc8B,OAAO7B,GAAoB,GAC5EI,GAAUP,EAAGiC,MAAQnP,EAAO2D,EAAMwJ,EAAyB,MAAlBC,EAAwBpN,EAAOmN,EAAMxJ,EAAMwJ,EAAMnN,EAAO2D,GAI7G,OAAO8J,EAjHA2B,CAsHX,SAAuBC,GACnB,GAAIC,EAAcD,GACd,OAAOC,EAAcD,GAGzB,IAAgBE,EAAZC,EAAOH,EAAYtC,EAAa,GAAI0C,EAAY,EACpD,KAAOD,GAAM,CACT,GAAqC,QAAhCD,EAAQtD,EAAGS,KAAKgD,KAAKF,IACtBzC,EAAW4C,KAAKJ,EAAM,SAErB,GAAuC,QAAlCA,EAAQtD,EAAGU,OAAO+C,KAAKF,IAC7BzC,EAAW4C,KAAK,SAEf,IAA4C,QAAvCJ,EAAQtD,EAAGW,YAAY8C,KAAKF,IA6ClC,MAAM,IAAII,YAAY,oCA5CtB,GAAIL,EAAM,GAAI,CACVE,GAAa,EACb,IAAII,EAAa,GAAIC,EAAoBP,EAAM,GAAIQ,EAAc,GACjE,GAAuD,QAAlDA,EAAc9D,EAAG7O,IAAIsS,KAAKI,IAe3B,MAAM,IAAIF,YAAY,gDAbtB,IADAC,EAAWF,KAAKI,EAAY,IACwD,MAA5ED,EAAoBA,EAAkBpB,UAAUqB,EAAY,GAAG1R,UACnE,GAA8D,QAAzD0R,EAAc9D,EAAGY,WAAW6C,KAAKI,IAClCD,EAAWF,KAAKI,EAAY,QAE3B,IAAgE,QAA3DA,EAAc9D,EAAGa,aAAa4C,KAAKI,IAIzC,MAAM,IAAIF,YAAY,gDAHtBC,EAAWF,KAAKI,EAAY,IAUxCR,EAAM,GAAKM,OAGXJ,GAAa,EAEjB,GAAkB,IAAdA,EACA,MAAM,IAAIzR,MAAM,6EAGpB+O,EAAW4C,KACP,CACI/C,YAAa2C,EAAM,GACnB5B,SAAa4B,EAAM,GACnB7B,KAAa6B,EAAM,GACnBvP,KAAauP,EAAM,GACnBP,SAAaO,EAAM,GACnBJ,MAAaI,EAAM,GACnBpB,MAAaoB,EAAM,GACnBnB,UAAamB,EAAM,GACnB3B,KAAa2B,EAAM,KAO/BC,EAAOA,EAAKd,UAAUa,EAAM,GAAGlR,QAEnC,OAAOiR,EAAcD,GAAOtC,EApLNiD,CAAc5S,GAAMyC,WAG9C,SAASoQ,EAASZ,EAAKrC,GACnB,OAAO5O,EAAQM,MAAM,KAAM,CAAC2Q,GAAKa,OAAOlD,GAAQ,KAgHpD,IAAIsC,EAAgB/S,OAAOY,OAAO,MAwE9BxB,EAAiB,QAAIyC,EACrBzC,EAAkB,SAAIsU,EAEJ,oBAAXE,SACPA,OAAgB,QAAI/R,EACpB+R,OAAiB,SAAIF,OAQhB/R,KALD8N,EAAA,WACI,MAAO,CACH5N,QAAWA,EACX6R,SAAYA,IAEnBjU,KAAAL,EAAAF,EAAAE,EAAAC,QAAAD,QAAAqQ,IAhOZ,I,6BCFDvQ,EAAAkB,EAAAyH,GAAA,SAAAgM,GAAA3U,EAAAU,EAAAiI,EAAA,qCAAAE,IAAA,IAAA+L,EAAA5U,EAAA,GAGA2U,EAAOE,QAAUF,EAAOE,SAAW,GACnCA,QAAQhM,iBAAmBD,IAEpB,IAAMC,EAAmBD,K,+BCNhC,IAAIkM,EAGJA,EAAI,WACH,OAAOrP,KADJ,GAIJ,IAECqP,EAAIA,GAAK,IAAI1C,SAAS,cAAb,GACR,MAAO2C,GAEc,iBAAXL,SAAqBI,EAAIJ,QAOrCvU,EAAOD,QAAU4U","file":"amazon-connect-websocket-manager.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","import { sprintf } from \"sprintf-js\";\nconst Utils = {};\n\n/**\n * Asserts that a premise is true.\n */\nUtils.assertTrue = function(premise, message) {\n if (!premise) {\n throw new Error(message);\n }\n};\n\n/**\n * Asserts that a value is not null or undefined.\n */\nUtils.assertNotNull = function(value, name) {\n Utils.assertTrue(\n value !== null && typeof value !== undefined,\n sprintf(\"%s must be provided\", name || \"A value\")\n );\n return value;\n};\n\nUtils.isNonEmptyString = function(value) {\n return typeof value === \"string\" && value.length > 0;\n};\n\nUtils.assertIsList = function(value, key) {\n if (!Array.isArray(value)) {\n throw new Error(key + \" is not an array\");\n }\n};\n\n/**\n * Determine if the given value is a callable function type.\n * Borrowed from Underscore.js.\n */\nUtils.isFunction = function(obj) {\n return !!(obj && obj.constructor && obj.call && obj.apply);\n};\n\nUtils.isObject = function(value) {\n return !(typeof value !== \"object\" || value === null);\n};\n\nUtils.isString = function(value) {\n return typeof value === \"string\";\n};\n\nUtils.isNumber = function(value) {\n return typeof value === \"number\";\n};\n\nconst wsRegex = new RegExp(\"^(wss://)\\\\w*\");\nUtils.validWSUrl = function (wsUrl) {\n return wsRegex.test(wsUrl);\n};\n\nUtils.getSubscriptionResponse = (routeKey, isSuccess, topicList) => {\n return {\n topic: routeKey,\n content : {\n status: isSuccess ? \"success\" : \"failure\",\n topics: topicList\n }\n };\n};\n\nUtils.assertIsObject = function(value, key) {\n if (!Utils.isObject(value)) {\n throw new Error(key + \" is not an object!\");\n }\n};\n\nUtils.addJitter = function (base, maxJitter = 1) {\n maxJitter = Math.min(maxJitter, 1.0);\n const sign = Math.random() > 0.5 ? 1 : -1;\n return Math.floor(base + sign * base * Math.random() * maxJitter);\n};\n\nUtils.isNetworkOnline = () => navigator.onLine;\n\nexport default Utils;\n\n","\nexport const LOGS_DESTINATION = {\n NULL: \"NULL\",\n CLIENT_LOGGER: \"CLIENT_LOGGER\",\n DEBUG: \"DEBUG\"\n};\n\nexport const MIN_WEBSOCKET_LIFETIME_MS = 3600000;\nexport const HEARTBEAT_INTERVAL_MS = 10000;\nexport const GET_WEBSOCKET_CONNECTION_INTERVAL_MS = 5000;\nexport const WEBSOCKET_URL_VALID_TIME_MS = 85000;\nexport const TOPIC_SUBSCRIPTION_RETRY_INTERVAL_MS = 500;\nexport const MAX_CONSECUTIVE_FAILED_SUB_ATTEMPTS = 5;\nexport const MAX_WAIT_TIME_SUB_REQUEST_WITH_NO_RESPONSE_MS = 1000;\nexport const MAX_CONSECUTIVE_SUB_REQUEST_WITH_NO_RESPONSE = 3;\nexport const NETWORK_CONN_CHECK_INTERVAL_MS = 250;\nexport const WEBSOCKET_REINIT_JITTER = 0.3;\nexport const WEBSOCKET_CONN_CONFIG_JITTER = 0.3;\n\nexport const ROUTE_KEY = {\n SUBSCRIBE: \"aws/subscribe\",\n UNSUBSCRIBE: \"aws/unsubscribe\",\n HEARTBEAT: \"aws/heartbeat\"\n};\n\nexport const CONN_STATE = {\n CONNECTED: \"connected\",\n DISCONNECTED: \"disconnected\"\n};\n","import Utils from \"./utils\";\nimport { LOGS_DESTINATION } from \"./constants\";\n\n/*eslint-disable no-unused-vars*/\nclass Logger {\n debug(data) {}\n\n info(data) {}\n\n warn(data) {}\n\n error(data) {}\n}\n/*eslint-enable no-unused-vars*/\n\nconst LogLevel = {\n DEBUG: 10,\n INFO: 20,\n WARN: 30,\n ERROR: 40\n};\n\nclass LogManagerImpl {\n constructor() {\n this.updateLoggerConfig();\n this.consoleLoggerWrapper = createConsoleLogger();\n }\n\n writeToClientLogger(level, logStatement) {\n if (!this.hasClientLogger()) {\n return;\n }\n switch (level) {\n case LogLevel.DEBUG:\n return this._clientLogger.debug(logStatement);\n case LogLevel.INFO:\n return this._clientLogger.info(logStatement);\n case LogLevel.WARN:\n return this._clientLogger.warn(logStatement);\n case LogLevel.ERROR:\n return this._clientLogger.error(logStatement);\n }\n }\n\n isLevelEnabled(level) {\n return level >= this._level;\n }\n\n hasClientLogger() {\n return this._clientLogger !== null;\n }\n\n getLogger(options) {\n var prefix = options.prefix || \"\";\n if (this._logsDestination === LOGS_DESTINATION.DEBUG) {\n return this.consoleLoggerWrapper;\n }\n return new LoggerWrapperImpl(prefix);\n }\n\n updateLoggerConfig(inputConfig) {\n var config = inputConfig || {};\n this._level = config.level || LogLevel.DEBUG;\n this._clientLogger = config.logger || null;\n this._logsDestination = LOGS_DESTINATION.NULL;\n if (config.debug) {\n this._logsDestination = LOGS_DESTINATION.DEBUG;\n }\n if (config.logger) {\n this._logsDestination = LOGS_DESTINATION.CLIENT_LOGGER;\n }\n }\n}\n\nclass LoggerWrapper {\n debug() {}\n\n info() {}\n\n warn() {}\n\n error() {}\n}\n\nclass LoggerWrapperImpl extends LoggerWrapper {\n constructor(prefix) {\n super();\n this.prefix = prefix || \"\";\n }\n\n debug(...args) {\n this._log(LogLevel.DEBUG, args);\n }\n\n info(...args) {\n this._log(LogLevel.INFO, args);\n }\n\n warn(...args) {\n this._log(LogLevel.WARN, args);\n }\n\n error(...args) {\n this._log(LogLevel.ERROR, args);\n }\n\n _shouldLog(level) {\n return LogManager.hasClientLogger() && LogManager.isLevelEnabled(level);\n }\n\n _writeToClientLogger(level, logStatement) {\n LogManager.writeToClientLogger(level, logStatement);\n }\n\n _log(level, args) {\n if (this._shouldLog(level)) {\n var logStatement = this._convertToSingleStatement(args);\n this._writeToClientLogger(level, logStatement);\n }\n }\n\n _convertToSingleStatement(args) {\n var logStatement = \"\";\n if (this.prefix) {\n logStatement += this.prefix + \" \";\n }\n for (var index = 0; index < args.length; index++) {\n var arg = args[index];\n logStatement += this._convertToString(arg) + \" \";\n }\n return logStatement;\n }\n\n _convertToString(arg) {\n try {\n if (!arg) {\n return \"\";\n }\n if (Utils.isString(arg)) {\n return arg;\n }\n if (Utils.isObject(arg) && Utils.isFunction(arg.toString)) {\n var toStringResult = arg.toString();\n if (toStringResult !== \"[object Object]\") {\n return toStringResult;\n }\n }\n return JSON.stringify(arg);\n } catch (error) {\n console.error(\"Error while converting argument to string\", arg, error);\n return \"\";\n }\n }\n}\n\nvar createConsoleLogger = () => {\n var logger = new LoggerWrapper();\n logger.debug = console.debug;\n logger.info = console.info;\n logger.warn = console.warn;\n logger.error = console.error;\n return logger;\n};\n\nconst LogManager = new LogManagerImpl();\n\nexport { LogManager, Logger, LogLevel };\n","import Utils from \"./utils\";\nimport { LogManager, LogLevel, Logger } from \"./log\";\nimport {\n MIN_WEBSOCKET_LIFETIME_MS,\n GET_WEBSOCKET_CONNECTION_INTERVAL_MS,\n WEBSOCKET_URL_VALID_TIME_MS,\n HEARTBEAT_INTERVAL_MS,\n ROUTE_KEY,\n CONN_STATE,\n MAX_CONSECUTIVE_FAILED_SUB_ATTEMPTS,\n TOPIC_SUBSCRIPTION_RETRY_INTERVAL_MS,\n MAX_WAIT_TIME_SUB_REQUEST_WITH_NO_RESPONSE_MS,\n MAX_CONSECUTIVE_SUB_REQUEST_WITH_NO_RESPONSE,\n NETWORK_CONN_CHECK_INTERVAL_MS,\n WEBSOCKET_REINIT_JITTER,\n WEBSOCKET_CONN_CONFIG_JITTER\n} from \"./constants\";\n\n\nconst WebSocketManager = function() {\n\n const logger = LogManager.getLogger({});\n\n let online = Utils.isNetworkOnline();\n\n let webSocket = {\n primary: null,\n secondary: null\n };\n\n let reconnectConfig = {\n reconnectWebSocket: true,\n websocketInitFailed: false,\n exponentialBackOffTime: 1000,\n exponentialTimeoutHandle: null,\n lifeTimeTimeoutHandle: null,\n webSocketInitCheckerTimeoutId: null,\n connState: null\n };\n\n let heartbeatConfig = {\n pendingResponse: false,\n intervalHandle: null\n };\n\n let callbacks = {\n initFailure: new Set(),\n getWebSocketTransport: null,\n subscriptionUpdate: new Set(),\n subscriptionFailure: new Set(),\n topic: new Map(),\n allMessage: new Set(),\n connectionGain: new Set(),\n connectionLost: new Set()\n };\n\n let webSocketConfig = {\n connConfig: null,\n promiseHandle: null,\n promiseCompleted: true\n };\n\n let topicSubscription = {\n subscribed: new Set(),\n pending: new Set(),\n subscriptionHistory: new Set()\n };\n\n let topicSubscriptionConfig = {\n responseCheckIntervalId: null,\n requestCompleted: true,\n reSubscribeIntervalId: null,\n consecutiveFailedSubscribeAttempts: 0,\n consecutiveNoResponseRequest: 0\n };\n\n const invalidSendMessageRouteKeys = new Set([ROUTE_KEY.SUBSCRIBE, ROUTE_KEY.UNSUBSCRIBE, ROUTE_KEY.HEARTBEAT]);\n\n const networkConnectivityChecker = setInterval(function () {\n if (online !== Utils.isNetworkOnline()) {\n online = Utils.isNetworkOnline();\n if (!online) {\n logger.info(\"Network offline\");\n return;\n }\n const ws = getDefaultWebSocket();\n if (online && (!ws || isWebSocketState(ws, WebSocket.CLOSING) || isWebSocketState(ws, WebSocket.CLOSED))) {\n logger.info(\"Network online, connecting to WebSocket server\");\n getWebSocketConnConfig();\n }\n }\n }, NETWORK_CONN_CHECK_INTERVAL_MS);\n\n const invokeCallbacks = function(callbacks, response) {\n callbacks.forEach(function (callback) {\n try {\n callback(response);\n } catch (error) {\n logger.error(\"Error executing callback\", error);\n }\n });\n };\n\n const getWebSocketStates = function(ws) {\n if (ws === null) return \"NULL\";\n switch (ws.readyState) {\n case WebSocket.CONNECTING:\n return \"CONNECTING\";\n case WebSocket.OPEN:\n return \"OPEN\";\n case WebSocket.CLOSING:\n return \"CLOSING\";\n case WebSocket.CLOSED:\n return \"CLOSED\";\n default:\n return \"UNDEFINED\";\n }\n };\n\n const printWebSocketState = function (event = \"\") {\n logger.debug(\"[\" + event + \"] Primary WebSocket: \" + getWebSocketStates(webSocket.primary)\n + \" | \" + \"Secondary WebSocket: \" + getWebSocketStates(webSocket.secondary) );\n };\n\n const isWebSocketState = function(ws, webSocketStateCode) {\n return ws && ws.readyState === webSocketStateCode;\n };\n\n const isWebSocketOpen = function(ws) {\n return isWebSocketState(ws, WebSocket.OPEN);\n };\n\n const isWebSocketClosed = function(ws) {\n // undefined check is to address the limitation of testing framework\n return ws === null || ws.readyState === undefined || isWebSocketState(ws, WebSocket.CLOSED);\n };\n\n /**\n * This function is meant to handle the scenario when we have two web-sockets open\n * in such a scenario we always select secondary web-socket since all future operations\n * are supposed to be done by this secondary web-socket\n */\n const getDefaultWebSocket = function() {\n if (webSocket.secondary !== null) {\n return webSocket.secondary;\n }\n return webSocket.primary;\n };\n\n const isDefaultWebSocketOpen = function() {\n return isWebSocketOpen(getDefaultWebSocket());\n };\n\n const sendHeartBeat = function() {\n if (heartbeatConfig.pendingResponse) {\n logger.warn(\"Heartbeat response not received\");\n clearInterval(heartbeatConfig.intervalHandle);\n heartbeatConfig.pendingResponse = false;\n getWebSocketConnConfig();\n return;\n }\n if (isDefaultWebSocketOpen()) {\n logger.debug(\"Sending heartbeat\");\n getDefaultWebSocket().send(createWebSocketPayload(ROUTE_KEY.HEARTBEAT));\n heartbeatConfig.pendingResponse = true;\n } else {\n logger.warn(\"Failed to send heartbeat since WebSocket is not open\");\n printWebSocketState(\"sendHeartBeat\");\n getWebSocketConnConfig();\n }\n };\n\n const resetWebSocketState = function() {\n reconnectConfig.exponentialBackOffTime = 1000;\n heartbeatConfig.pendingResponse = false;\n reconnectConfig.reconnectWebSocket = true;\n\n clearTimeout(reconnectConfig.lifeTimeTimeoutHandle);\n clearInterval(heartbeatConfig.intervalHandle);\n clearTimeout(reconnectConfig.exponentialTimeoutHandle);\n clearTimeout(reconnectConfig.webSocketInitCheckerTimeoutId);\n };\n\n const resetSubscriptions = function() {\n topicSubscriptionConfig.consecutiveFailedSubscribeAttempts = 0;\n topicSubscriptionConfig.consecutiveNoResponseRequest = 0;\n clearInterval(topicSubscriptionConfig.responseCheckIntervalId);\n clearInterval(topicSubscriptionConfig.reSubscribeIntervalId);\n };\n\n const webSocketOnOpen = function() {\n try {\n logger.info(\"WebSocket connection established!\");\n printWebSocketState(\"webSocketOnOpen\");\n reconnectConfig.connState = CONN_STATE.CONNECTED;\n\n if (webSocket.secondary === null) {\n invokeCallbacks(callbacks.connectionGain);\n }\n\n resetWebSocketState();\n\n // early closure of primary web socket\n if (topicSubscription.subscribed.size === 0 && isWebSocketOpen(webSocket.secondary)) {\n closeSpecificWebSocket(webSocket.primary, \"[Primary WebSocket] Closing WebSocket\");\n }\n if (topicSubscription.subscribed.size > 0 || topicSubscription.pending.size > 0) {\n if (isWebSocketOpen(webSocket.secondary)) {\n logger.info(\"Subscribing secondary websocket to topics of primary websocket\");\n }\n topicSubscription.subscribed.forEach(topic => {\n topicSubscription.subscriptionHistory.add(topic);\n topicSubscription.pending.add(topic);\n });\n topicSubscription.subscribed.clear();\n subscribePendingTopics();\n }\n\n sendHeartBeat();\n heartbeatConfig.intervalHandle = setInterval(sendHeartBeat, HEARTBEAT_INTERVAL_MS);\n\n reconnectConfig.lifeTimeTimeoutHandle = setTimeout(function() {\n logger.debug(\"Starting scheduled WebSocket manager reconnect\");\n getWebSocketConnConfig();\n }, (Date.parse(webSocketConfig.connConfig.webSocketTransport.expiry) - Date.now()));\n } catch (error) {\n logger.error(\"Error after establishing WebSocket connection\", error);\n }\n };\n\n const webSocketOnClose = function(event) {\n logger.info(\"Socket connection is closed\", event);\n printWebSocketState(\"webSocketOnClose before-cleanup\");\n if (isWebSocketClosed(webSocket.primary)) {\n webSocket.primary = null;\n }\n if (isWebSocketClosed(webSocket.secondary)) {\n webSocket.secondary = null;\n }\n if (!reconnectConfig.reconnectWebSocket) {\n return;\n }\n if (!isWebSocketOpen(webSocket.primary) && !isWebSocketOpen(webSocket.secondary)) {\n logger.warn(\"Neither primary websocket and nor secondary websocket have open connections, attempting to re-establish connection\");\n if (reconnectConfig.connState !== CONN_STATE.DISCONNECTED) {\n /**\n * This check is required in the scenario where WS Server shuts-down and closes all active\n * WS Client connections and WS Server takes about a minute to become active gain, in this\n * scenario WS Client's onClose is triggered and then WSM start reconnect logic immediately but all\n * connect request to WS Server would fail and WS Client's onError callback would be triggered\n * followed WS Client's onClose callback and hence \"connectionLost\" callback would be invoked several\n * times and this behavior is redundant\n */\n invokeCallbacks(callbacks.connectionLost);\n } else {\n logger.info(\"Ignoring connectionLost callback invocation\");\n }\n reconnectConfig.connState = CONN_STATE.DISCONNECTED;\n getWebSocketConnConfig();\n } else if (isWebSocketClosed(webSocket.primary) && isWebSocketOpen(webSocket.secondary)) {\n logger.info(\"[Primary] WebSocket Cleanly Closed\");\n webSocket.primary = webSocket.secondary;\n webSocket.secondary = null;\n }\n printWebSocketState(\"webSocketOnClose after-cleanup\");\n };\n\n const webSocketOnError = function(event) {\n printWebSocketState(\"webSocketOnError\");\n logger.error(\"WebSocketManager Error, error_event: \", event);\n getWebSocketConnConfig();\n };\n\n const webSocketOnMessage = function(event) {\n const response = JSON.parse(event.data);\n\n switch (response.topic) {\n\n case ROUTE_KEY.SUBSCRIBE:\n logger.debug(\"Subscription Message received from webSocket server\", event.data);\n topicSubscriptionConfig.requestCompleted = true;\n topicSubscriptionConfig.consecutiveNoResponseRequest = 0;\n\n if (response.content.status === \"success\") {\n topicSubscriptionConfig.consecutiveFailedSubscribeAttempts = 0;\n response.content.topics.forEach( topicName => {\n topicSubscription.subscriptionHistory.delete(topicName);\n topicSubscription.pending.delete(topicName);\n topicSubscription.subscribed.add(topicName);\n });\n if (topicSubscription.subscriptionHistory.size === 0) {\n if (isWebSocketOpen(webSocket.secondary)) {\n logger.info(\"Successfully subscribed secondary websocket to all topics of primary websocket\");\n closeSpecificWebSocket(webSocket.primary, \"[Primary WebSocket] Closing WebSocket\");\n }\n } else {\n subscribePendingTopics();\n }\n invokeCallbacks(callbacks.subscriptionUpdate, response);\n\n } else {\n clearInterval(topicSubscriptionConfig.reSubscribeIntervalId);\n ++topicSubscriptionConfig.consecutiveFailedSubscribeAttempts;\n if (topicSubscriptionConfig.consecutiveFailedSubscribeAttempts === MAX_CONSECUTIVE_FAILED_SUB_ATTEMPTS) {\n invokeCallbacks(callbacks.subscriptionFailure, response);\n topicSubscriptionConfig.consecutiveFailedSubscribeAttempts = 0;\n return;\n }\n topicSubscriptionConfig.reSubscribeIntervalId = setInterval(function () {\n subscribePendingTopics();\n }, TOPIC_SUBSCRIPTION_RETRY_INTERVAL_MS);\n }\n break;\n\n case ROUTE_KEY.HEARTBEAT:\n logger.debug(\"Heartbeat response received\");\n heartbeatConfig.pendingResponse = false;\n break;\n\n default:\n if (response.topic) {\n logger.debug(\"Message received for topic \" + response.topic);\n if (isWebSocketOpen(webSocket.primary) && isWebSocketOpen(webSocket.secondary)\n && topicSubscription.subscriptionHistory.size === 0 && this === webSocket.primary) {\n /**\n * This block is to handle scenario when both primary and secondary socket have subscribed to\n * a common topic but we are facing difficulty in closing the primary socket, then in this\n * situation messages will be received by both primary and secondary web socket\n */\n logger.warn(\"Ignoring Message for Topic \" + response.topic + \", to avoid duplicates\");\n return;\n }\n\n if (callbacks.allMessage.size === 0 && callbacks.topic.size === 0) {\n logger.warn('No registered callback listener for Topic', response.topic);\n return;\n }\n invokeCallbacks(callbacks.allMessage, response);\n if (callbacks.topic.has(response.topic)) {\n invokeCallbacks(callbacks.topic.get(response.topic), response);\n }\n\n } else if (response.message) {\n logger.warn(\"WebSocketManager Message Error\", response);\n } else {\n logger.warn(\"Invalid incoming message\", response);\n }\n }\n };\n\n const subscribePendingTopics = function() {\n if (topicSubscriptionConfig.consecutiveNoResponseRequest > MAX_CONSECUTIVE_SUB_REQUEST_WITH_NO_RESPONSE) {\n logger.warn(\"Ignoring subscribePendingTopics since we have exhausted max subscription retries with no response\");\n invokeCallbacks(callbacks.subscriptionFailure, Utils.getSubscriptionResponse(ROUTE_KEY.SUBSCRIBE, false, Array.from(topicSubscription.pending)));\n return;\n }\n if (!isDefaultWebSocketOpen()) {\n logger.warn(\"Ignoring subscribePendingTopics call since Default WebSocket is not open\");\n return;\n }\n\n clearInterval(topicSubscriptionConfig.responseCheckIntervalId);\n\n getDefaultWebSocket().send(createWebSocketPayload(ROUTE_KEY.SUBSCRIBE, {\n \"topics\": Array.from(topicSubscription.pending)\n }));\n topicSubscriptionConfig.requestCompleted = false;\n\n // This callback ensure that some response was received for subscription request\n topicSubscriptionConfig.responseCheckIntervalId = setInterval(function () {\n if (!topicSubscriptionConfig.requestCompleted) {\n ++topicSubscriptionConfig.consecutiveNoResponseRequest;\n subscribePendingTopics();\n }\n }, MAX_WAIT_TIME_SUB_REQUEST_WITH_NO_RESPONSE_MS);\n };\n\n const closeSpecificWebSocket = function(ws, reason) {\n if (isWebSocketState(ws, WebSocket.CONNECTING) || isWebSocketState(ws, WebSocket.OPEN)) {\n ws.close(1000, reason);\n } else {\n logger.warn(\"Ignoring WebSocket Close request, WebSocket State: \" + getWebSocketStates(ws));\n }\n };\n\n const closeWebSocket = function(reason) {\n closeSpecificWebSocket(webSocket.primary, \"[Primary] WebSocket \" + reason);\n closeSpecificWebSocket(webSocket.secondary, \"[Secondary] WebSocket \" + reason);\n };\n\n const retryWebSocketInitialization = function () {\n const waitTime = Utils.addJitter(reconnectConfig.exponentialBackOffTime, WEBSOCKET_REINIT_JITTER);\n if (Date.now() + waitTime <= webSocketConfig.connConfig.urlConnValidTime) {\n logger.debug(\"Scheduling WebSocket reinitialization, after delay \" + waitTime + \" ms\");\n reconnectConfig.exponentialTimeoutHandle = setTimeout(() => initWebSocket(), waitTime);\n reconnectConfig.exponentialBackOffTime *= 2;\n } else {\n logger.warn(\"WebSocket URL is cannot be used to establish connection\");\n getWebSocketConnConfig();\n }\n };\n\n const terminateWebSocketManager = function () {\n resetWebSocketState();\n resetSubscriptions();\n logger.error(\"WebSocket Initialization failed\");\n reconnectConfig.websocketInitFailed = true;\n closeWebSocket(\"Terminating WebSocket Manager\");\n clearInterval(networkConnectivityChecker);\n invokeCallbacks(callbacks.initFailure);\n };\n\n const createWebSocketPayload = function (key, content) {\n return JSON.stringify({\n \"topic\": key,\n \"content\": content\n });\n };\n\n const sendMessage = function(payload) {\n Utils.assertIsObject(payload, \"payload\");\n if (payload.topic === undefined || invalidSendMessageRouteKeys.has(payload.topic)) {\n logger.warn(\"Cannot send message, Invalid topic\", payload);\n return;\n }\n try {\n payload = JSON.stringify(payload);\n } catch (error) {\n logger.warn(\"Error stringify message\", payload);\n return;\n }\n if (isDefaultWebSocketOpen()) {\n getDefaultWebSocket().send(payload);\n } else {\n logger.warn(\"Cannot send message, web socket connection is not open\");\n }\n };\n\n const subscribeTopics = function(topics) {\n Utils.assertNotNull(topics, 'topics');\n Utils.assertIsList(topics);\n\n topics.forEach(topic => {\n if (!topicSubscription.subscribed.has(topic)) {\n topicSubscription.pending.add(topic);\n }\n });\n // This ensure all participant-request to subscribe to topic chat are served at least once\n topicSubscriptionConfig.consecutiveNoResponseRequest = 0;\n subscribePendingTopics();\n };\n\n const validWebSocketConnConfig = function (connConfig) {\n if (Utils.isObject(connConfig) && Utils.isObject(connConfig.webSocketTransport)\n && Utils.isNonEmptyString(connConfig.webSocketTransport.url)\n && Utils.validWSUrl(connConfig.webSocketTransport.url)\n && Utils.isNonEmptyString(connConfig.webSocketTransport.expiry) &&\n (Date.parse(connConfig.webSocketTransport.expiry) - Date.now()) >= MIN_WEBSOCKET_LIFETIME_MS) {\n return true;\n }\n logger.error(\"Invalid WebSocket Connection Configuration\", connConfig);\n return false;\n };\n\n const getWebSocketConnConfig = function () {\n if (!Utils.isNetworkOnline()) {\n logger.info(\"Network offline, ignoring this getWebSocketConnConfig request\");\n return;\n }\n if (reconnectConfig.websocketInitFailed) {\n logger.debug(\"WebSocket Init had failed, ignoring this getWebSocketConnConfig request\");\n return;\n }\n if (!webSocketConfig.promiseCompleted) {\n logger.debug(\"There is an ongoing getWebSocketConnConfig request, this request will be ignored\");\n return;\n }\n resetWebSocketState();\n logger.info(\"Fetching new WebSocket connection configuration\");\n webSocketConfig.promiseCompleted = false;\n webSocketConfig.promiseHandle = callbacks.getWebSocketTransport();\n return webSocketConfig.promiseHandle\n .then(function(response) {\n webSocketConfig.promiseCompleted = true;\n logger.debug(\"Successfully fetched webSocket connection configuration\", response);\n if (!validWebSocketConnConfig(response)) {\n terminateWebSocketManager();\n return;\n }\n webSocketConfig.connConfig = response;\n // Ideally this URL validity time should be provided by server\n webSocketConfig.connConfig.urlConnValidTime = Date.now() + WEBSOCKET_URL_VALID_TIME_MS;\n initWebSocket();\n },\n function(reason) {\n webSocketConfig.promiseCompleted = true;\n logger.error(\"Failed to fetch webSocket connection configuration\", reason);\n setTimeout(() => getWebSocketConnConfig(), Utils.addJitter(GET_WEBSOCKET_CONNECTION_INTERVAL_MS, WEBSOCKET_CONN_CONFIG_JITTER));\n });\n };\n\n const initWebSocket = function() {\n if (reconnectConfig.websocketInitFailed) {\n logger.info(\"web-socket initializing had failed, aborting re-init\");\n return;\n }\n if (!Utils.isNetworkOnline()) {\n logger.warn(\"System is offline aborting web-socket init\");\n return;\n }\n logger.info(\"Initializing Websocket Manager\");\n printWebSocketState(\"initWebSocket\");\n try {\n if (validWebSocketConnConfig(webSocketConfig.connConfig)) {\n let ws = null;\n if (isWebSocketOpen(webSocket.primary)) {\n logger.debug(\"Primary Socket connection is already open\");\n if (!isWebSocketState(webSocket.secondary, WebSocket.CONNECTING)) {\n logger.debug(\"Establishing a secondary web-socket connection\");\n webSocket.secondary = getNewWebSocket();\n }\n ws = webSocket.secondary;\n } else {\n if (!isWebSocketState(webSocket.primary, WebSocket.CONNECTING)) {\n logger.debug(\"Establishing a primary web-socket connection\");\n webSocket.primary = getNewWebSocket();\n }\n ws = webSocket.primary;\n }\n\n // WebSocket creation is async task hence we Wait for 1sec before any potential retry\n reconnectConfig.webSocketInitCheckerTimeoutId = setTimeout(function() {\n if (!isWebSocketOpen(ws)) {\n retryWebSocketInitialization();\n }\n }, 1000);\n }\n } catch (error) {\n logger.error(\"Error Initializing web-socket-manager\", error);\n terminateWebSocketManager();\n }\n };\n\n const getNewWebSocket = function() {\n let ws = new WebSocket(webSocketConfig.connConfig.webSocketTransport.url);\n ws.addEventListener(\"open\", webSocketOnOpen);\n ws.addEventListener(\"message\", webSocketOnMessage);\n ws.addEventListener(\"error\", webSocketOnError);\n ws.addEventListener(\"close\", webSocketOnClose);\n return ws;\n };\n\n const onConnectionGain = function(cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.connectionGain.add(cb);\n if (isDefaultWebSocketOpen()) {\n cb();\n }\n return () => callbacks.connectionGain.delete(cb);\n };\n\n const onConnectionLost = function(cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.connectionLost.add(cb);\n if (reconnectConfig.connState === CONN_STATE.DISCONNECTED) {\n cb();\n }\n return () => callbacks.connectionLost.delete(cb);\n };\n\n const onInitFailure = function(cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.initFailure.add(cb);\n if (reconnectConfig.websocketInitFailed) {\n cb();\n }\n return () => callbacks.initFailure.delete(cb);\n };\n\n const init = function(transportHandle) {\n Utils.assertTrue(Utils.isFunction(transportHandle), 'transportHandle must be a function');\n if (callbacks.getWebSocketTransport !== null) {\n logger.warn(\"Web Socket Manager was already initialized\");\n return;\n }\n callbacks.getWebSocketTransport = transportHandle;\n\n return getWebSocketConnConfig();\n };\n\n const onSubscriptionUpdate = function(cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.subscriptionUpdate.add(cb);\n return () => callbacks.subscriptionUpdate.delete(cb);\n };\n\n const onSubscriptionFailure = function(cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.subscriptionFailure.add(cb);\n return () => callbacks.subscriptionFailure.delete(cb);\n };\n\n const onMessage = function(topicName, cb) {\n Utils.assertNotNull(topicName, 'topicName');\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n if (callbacks.topic.has(topicName)) {\n callbacks.topic.get(topicName).add(cb);\n } else {\n callbacks.topic.set(topicName, new Set([cb]));\n }\n return () => callbacks.topic.get(topicName).delete(cb);\n };\n\n const onAllMessage = function (cb) {\n Utils.assertTrue(Utils.isFunction(cb), 'cb must be a function');\n callbacks.allMessage.add(cb);\n return () => callbacks.allMessage.delete(cb);\n };\n\n this.init = init;\n this.onInitFailure = onInitFailure;\n this.onConnectionGain = onConnectionGain;\n this.onConnectionLost = onConnectionLost;\n this.onSubscriptionUpdate = onSubscriptionUpdate;\n this.onSubscriptionFailure = onSubscriptionFailure;\n this.onMessage = onMessage;\n this.onAllMessage = onAllMessage;\n this.subscribeTopics = subscribeTopics;\n this.sendMessage = sendMessage;\n\n this.closeWebSocket = function() {\n resetWebSocketState();\n resetSubscriptions();\n reconnectConfig.reconnectWebSocket = false;\n clearInterval(networkConnectivityChecker);\n closeWebSocket(\"User request to close WebSocket\");\n };\n};\n\nconst WebSocketManagerConstructor = () => {\n return new WebSocketManager();\n};\n\nconst setGlobalConfig = config => {\n const loggerConfig = config.loggerConfig;\n LogManager.updateLoggerConfig(loggerConfig);\n};\n\nconst WebSocketManagerObject = {\n create: WebSocketManagerConstructor,\n setGlobalConfig: setGlobalConfig,\n LogLevel: LogLevel,\n Logger: Logger\n};\n\nexport { WebSocketManagerObject };","/* global window, exports, define */\n\n!function() {\n 'use strict'\n\n var re = {\n not_string: /[^s]/,\n not_bool: /[^t]/,\n not_type: /[^T]/,\n not_primitive: /[^v]/,\n number: /[diefg]/,\n numeric_arg: /[bcdiefguxX]/,\n json: /[j]/,\n not_json: /[^j]/,\n text: /^[^\\x25]+/,\n modulo: /^\\x25{2}/,\n placeholder: /^\\x25(?:([1-9]\\d*)\\$|\\(([^)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-gijostTuvxX])/,\n key: /^([a-z_][a-z_\\d]*)/i,\n key_access: /^\\.([a-z_][a-z_\\d]*)/i,\n index_access: /^\\[(\\d+)\\]/,\n sign: /^[+-]/\n }\n\n function sprintf(key) {\n // `arguments` is not an array, but should be fine for this call\n return sprintf_format(sprintf_parse(key), arguments)\n }\n\n function vsprintf(fmt, argv) {\n return sprintf.apply(null, [fmt].concat(argv || []))\n }\n\n function sprintf_format(parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign\n for (i = 0; i < tree_length; i++) {\n if (typeof parse_tree[i] === 'string') {\n output += parse_tree[i]\n }\n else if (typeof parse_tree[i] === 'object') {\n ph = parse_tree[i] // convenience purposes only\n if (ph.keys) { // keyword argument\n arg = argv[cursor]\n for (k = 0; k < ph.keys.length; k++) {\n if (arg == undefined) {\n throw new Error(sprintf('[sprintf] Cannot access property \"%s\" of undefined value \"%s\"', ph.keys[k], ph.keys[k-1]))\n }\n arg = arg[ph.keys[k]]\n }\n }\n else if (ph.param_no) { // positional argument (explicit)\n arg = argv[ph.param_no]\n }\n else { // positional argument (implicit)\n arg = argv[cursor++]\n }\n\n if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {\n arg = arg()\n }\n\n if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) {\n throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))\n }\n\n if (re.number.test(ph.type)) {\n is_positive = arg >= 0\n }\n\n switch (ph.type) {\n case 'b':\n arg = parseInt(arg, 10).toString(2)\n break\n case 'c':\n arg = String.fromCharCode(parseInt(arg, 10))\n break\n case 'd':\n case 'i':\n arg = parseInt(arg, 10)\n break\n case 'j':\n arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)\n break\n case 'e':\n arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()\n break\n case 'f':\n arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)\n break\n case 'g':\n arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)\n break\n case 'o':\n arg = (parseInt(arg, 10) >>> 0).toString(8)\n break\n case 's':\n arg = String(arg)\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\n break\n case 't':\n arg = String(!!arg)\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\n break\n case 'T':\n arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\n break\n case 'u':\n arg = parseInt(arg, 10) >>> 0\n break\n case 'v':\n arg = arg.valueOf()\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\n break\n case 'x':\n arg = (parseInt(arg, 10) >>> 0).toString(16)\n break\n case 'X':\n arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()\n break\n }\n if (re.json.test(ph.type)) {\n output += arg\n }\n else {\n if (re.number.test(ph.type) && (!is_positive || ph.sign)) {\n sign = is_positive ? '+' : '-'\n arg = arg.toString().replace(re.sign, '')\n }\n else {\n sign = ''\n }\n pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '\n pad_length = ph.width - (sign + arg).length\n pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''\n output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)\n }\n }\n }\n return output\n }\n\n var sprintf_cache = Object.create(null)\n\n function sprintf_parse(fmt) {\n if (sprintf_cache[fmt]) {\n return sprintf_cache[fmt]\n }\n\n var _fmt = fmt, match, parse_tree = [], arg_names = 0\n while (_fmt) {\n if ((match = re.text.exec(_fmt)) !== null) {\n parse_tree.push(match[0])\n }\n else if ((match = re.modulo.exec(_fmt)) !== null) {\n parse_tree.push('%')\n }\n else if ((match = re.placeholder.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1\n var field_list = [], replacement_field = match[2], field_match = []\n if ((field_match = re.key.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n if ((field_match = re.key_access.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else if ((field_match = re.index_access.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else {\n throw new SyntaxError('[sprintf] failed to parse named argument key')\n }\n }\n }\n else {\n throw new SyntaxError('[sprintf] failed to parse named argument key')\n }\n match[2] = field_list\n }\n else {\n arg_names |= 2\n }\n if (arg_names === 3) {\n throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')\n }\n\n parse_tree.push(\n {\n placeholder: match[0],\n param_no: match[1],\n keys: match[2],\n sign: match[3],\n pad_char: match[4],\n align: match[5],\n width: match[6],\n precision: match[7],\n type: match[8]\n }\n )\n }\n else {\n throw new SyntaxError('[sprintf] unexpected placeholder')\n }\n _fmt = _fmt.substring(match[0].length)\n }\n return sprintf_cache[fmt] = parse_tree\n }\n\n /**\n * export to either browser or node.js\n */\n /* eslint-disable quote-props */\n if (typeof exports !== 'undefined') {\n exports['sprintf'] = sprintf\n exports['vsprintf'] = vsprintf\n }\n if (typeof window !== 'undefined') {\n window['sprintf'] = sprintf\n window['vsprintf'] = vsprintf\n\n if (typeof define === 'function' && define['amd']) {\n define(function() {\n return {\n 'sprintf': sprintf,\n 'vsprintf': vsprintf\n }\n })\n }\n }\n /* eslint-enable quote-props */\n}(); // eslint-disable-line\n","/*eslint no-unused-vars: \"off\"*/\nimport { WebSocketManagerObject } from \"./webSocketManager\";\n\nglobal.connect = global.connect || {};\nconnect.WebSocketManager = WebSocketManagerObject;\n\nexport const WebSocketManager = WebSocketManagerObject;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/worker.js b/src/worker.js index e2ccfc06..2a71cea3 100644 --- a/src/worker.js +++ b/src/worker.js @@ -135,28 +135,6 @@ self.initData = data; connect.core.init(data); - // Start polling for agent data. - if (!self.agentPolling) { - connect.getLog().info("Kicking off agent polling"); - self.agentPolling = true; - self.pollForAgent(); - } else { - connect.getLog().info("Not kicking off new agent polling, since there's already polling going on"); - } - if (!self.configPolling) { - connect.getLog().info("Kicking off config polling"); - self.configPolling = true; - self.pollForAgentConfiguration({ repeatForever: true }); - } else { - connect.getLog().info("Not kicking off new config polling, since there's already polling going on"); - } - if (!global.checkAuthTokenInterval) { - connect.getLog().info("Kicking off auth token polling"); - global.checkAuthTokenInterval = global.setInterval(connect.hitch(self, self.checkAuthToken), CHECK_AUTH_TOKEN_INTERVAL_MS); - } else { - connect.getLog().info("Not kicking off auth token polling, since there's already polling going on"); - } - // init only once. if (!webSocketManager) { @@ -200,7 +178,17 @@ webSocketManager.subscribeTopics(topics); }); - webSocketManager.init(connect.hitch(self, self.getWebSocketUrl)); + webSocketManager.init(connect.hitch(self, self.getWebSocketUrl)).then(function() { + // Start polling for agent data. + connect.getLog().info("Kicking off agent polling"); + self.pollForAgent(); + + connect.getLog().info("Kicking off config polling"); + self.pollForAgentConfiguration({ repeatForever: true }); + + connect.getLog().info("Kicking off auth token polling"); + global.setInterval(connect.hitch(self, self.checkAuthToken), CHECK_AUTH_TOKEN_INTERVAL_MS); + }); } else { connect.getLog().info("Not Creating a Websocket instance, since there's already one exist"); } @@ -289,7 +277,6 @@ } }, authFailure: function () { - self.agentPolling = false; onAuthFail(); }, accessDenied: connect.hitch(self, self.handleAccessDenied) @@ -330,7 +317,6 @@ } }, authFailure: function () { - self.configPolling = false; onAuthFail(); }, accessDenied: connect.hitch(self, self.handleAccessDenied)