@decaf-ts/for-pouch 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-pouch.cjs +4 -2
- package/dist/for-pouch.esm.cjs +4 -2
- package/lib/adapter.cjs +3 -1
- package/lib/esm/adapter.js +3 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/for-pouch.cjs
CHANGED
|
@@ -623,6 +623,7 @@
|
|
|
623
623
|
* PouchAdapter->>Decoration: apply()
|
|
624
624
|
*/
|
|
625
625
|
static decoration() {
|
|
626
|
+
super.decoration();
|
|
626
627
|
const createdByKey = core.Repository.key(core.PersistenceKeys.CREATED_BY);
|
|
627
628
|
const updatedByKey = core.Repository.key(core.PersistenceKeys.UPDATED_BY);
|
|
628
629
|
decoratorValidation.Decoration.flavouredAs(PouchFlavour)
|
|
@@ -635,6 +636,7 @@
|
|
|
635
636
|
.apply();
|
|
636
637
|
}
|
|
637
638
|
}
|
|
639
|
+
PouchAdapter.setCurrent(PouchFlavour);
|
|
638
640
|
|
|
639
641
|
PouchAdapter.decoration();
|
|
640
642
|
/**
|
|
@@ -648,7 +650,7 @@
|
|
|
648
650
|
* @const VERSION
|
|
649
651
|
* @memberOf module:for-pouch
|
|
650
652
|
*/
|
|
651
|
-
const VERSION = "0.2.
|
|
653
|
+
const VERSION = "0.2.7";
|
|
652
654
|
|
|
653
655
|
exports.PouchAdapter = PouchAdapter;
|
|
654
656
|
exports.PouchFlavour = PouchFlavour;
|
|
@@ -656,4 +658,4 @@
|
|
|
656
658
|
exports.createdByOnPouchCreateUpdate = createdByOnPouchCreateUpdate;
|
|
657
659
|
|
|
658
660
|
}));
|
|
659
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXBvdWNoLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIFBvdWNoREIgZmxhdm9yIGluIHRoZSBkZWNvcmF0b3Igc3lzdGVtXG4gKiBAc3VtbWFyeSBBIHN0cmluZyBjb25zdGFudCB0aGF0IGlkZW50aWZpZXMgdGhlIFBvdWNoREIgaW1wbGVtZW50YXRpb24gaW4gdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBUaGlzIGlzIHVzZWQgdG8gdGFyZ2V0IGRlY29yYXRvcnMgc3BlY2lmaWNhbGx5IGZvciBQb3VjaERCIGFkYXB0ZXJzLlxuICogQGNvbnN0IFBvdWNoRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGNvbnN0IFBvdWNoRmxhdm91ciA9IFwicG91Y2hcIjtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIEluZGV4RXJyb3IsXG4gIE1hbmdvUXVlcnksXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBEYXRhYmFzZSA9IFBvdWNoREIuRGF0YWJhc2U7XG5pbXBvcnQgUmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuUmVzcG9uc2U7XG5pbXBvcnQgRXJyID0gUG91Y2hEQi5Db3JlLkVycm9yO1xuaW1wb3J0IElkTWV0YSA9IFBvdWNoREIuQ29yZS5JZE1ldGE7XG5pbXBvcnQgR2V0TWV0YSA9IFBvdWNoREIuQ29yZS5HZXRNZXRhO1xuaW1wb3J0IENyZWF0ZUluZGV4UmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuQ3JlYXRlSW5kZXhSZXNwb25zZTtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgQnVsa0dldFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLkJ1bGtHZXRSZXNwb25zZTtcbmltcG9ydCBGaW5kUmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuRmluZFJlc3BvbnNlO1xuaW1wb3J0IHsgUG91Y2hGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQb3VjaEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBvdWNoUmVwb3NpdG9yeSB9IGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIElEIG9uIGEgbW9kZWwgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBkZWNvcmF0b3IgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRvciBJRCBmaWVsZCBvbiBhIG1vZGVsXG4gKiB3aGVuIGl0J3MgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLiBJdCBleHRyYWN0cyB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSB0aGF0IGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8UG91Y2hGbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyBmbGFnc1xuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBtb2RpZnlcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3VjaERCIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlclxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlciBmb3IgUG91Y2hEQi5cbiAqIEl0IGhhbmRsZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgbGlrZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlIChDUlVEKSBmb3IgYm90aFxuICogc2luZ2xlIGRvY3VtZW50cyBhbmQgYnVsayBvcGVyYXRpb25zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBpbmRleGluZy5cbiAqIEB0ZW1wbGF0ZSBEYXRhYmFzZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBQb3VjaEZsYWdzIC0gVGhlIGZsYWdzIHNwZWNpZmljIHRvIFBvdWNoREIgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8UG91Y2hGbGFncz4gLSBUaGUgY29udGV4dCB0eXBlIHdpdGggUG91Y2hEQiBmbGFnc1xuICogQHBhcmFtIHtEYXRhYmFzZX0gc2NvcGUgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGRhdGFiYXNlXG4gKiBAY2xhc3MgUG91Y2hBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG4gKiBpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLXBvdWNoJztcbiAqXG4gKiAvLyBDcmVhdGUgYSBuZXcgUG91Y2hEQiBpbnN0YW5jZVxuICogY29uc3QgZGIgPSBuZXcgUG91Y2hEQignbXktZGF0YWJhc2UnKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBQb3VjaEFkYXB0ZXIgd2l0aCB0aGUgZGF0YWJhc2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG91Y2hBZGFwdGVyKGRiKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlci0xMjMnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBuZXcgUG91Y2hBZGFwdGVyKGRiKVxuICogICBQb3VjaEFkYXB0ZXItPj5Db3VjaERCQWRhcHRlcjogc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIFBVVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZVxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGUsIGlkKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoaWQpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIEdFVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IERvY3VtZW50XG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgUG91Y2hEQiBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBVVUlEIGZvciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgZGF0YWJhc2UgVVJMIG9yIGdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxQb3VjaEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIG1lcmdlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvdWNoRmxhZ3M+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFBvdWNoRmxhZ3M+XG4gICk6IFByb21pc2U8UG91Y2hGbGFncz4ge1xuICAgIGxldCBpZDogc3RyaW5nID0gXCJcIjtcbiAgICBjb25zdCB1cmwgPSAodGhpcy5uYXRpdmUgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IC9odHRwcz86XFwvXFwvKC4rPyk6Lis/QC9nO1xuICAgICAgY29uc3QgbSA9IHJlZ2V4cC5leGVjKHVybCk7XG4gICAgICBpZiAobSkgaWQgPSBtWzFdO1xuICAgIH1cbiAgICBpZiAoIWlkKSB7XG4gICAgICBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiBpZCxcbiAgICB9KSBhcyBQb3VjaEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9ycy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2VuZXJhdGVJbmRleGVzIHV0aWxpdHkgdG8gY3JlYXRlIGluZGV4IGRlZmluaXRpb25zIGFuZCB0aGVuIGNyZWF0ZXMgdGhlbSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IGRvY3VtZW50IGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSAgbW9kZWxzIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgZ2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudCBJRCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSUQsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrR2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGRvY3VtZW50IElEcyBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSURzLCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWRBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnJvcilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICgoZCBhcyBhbnkpLmVycm9yIHx8ICEoZCBhcyBhbnkpLm9rKVxuICAgICAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKFxuICAgICAgICAgICAgKChkIGFzIHsgZXJyb3I6IEVyciB9KS5lcnJvciBhcyBFcnJvcikgfHxcbiAgICAgICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIHZhbGlkIHJlc3BvbnNlXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IChSZXNwb25zZSB8IEVycilbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICEociBhcyBhbnkpLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmICgoZWwgYXMgYW55KS5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7KGVsIGFzIGFueSkuZXJyb3J9JHsoZWwgYXMgYW55KS5yZWFzb24gPyBgIC0gJHsoZWwgYXMgYW55KS5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSByZW1vdmUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHRvIGdldCBpdHMgcmV2aXNpb24sIHRoZW4gZGVsZXRlcyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudCB3aXRoIF9yZXZcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiByZW1vdmUoX2lkLCByZWNvcmQuX3JldilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLnJlbW92ZShfaWQsIHJlY29yZC5fcmV2KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgYWxsIGRvY3VtZW50cyB0byBnZXQgdGhlaXIgcmV2aXNpb25zLCB0aGVuIG1hcmtzIHRoZW0gYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZSB3aXRoIGRvY3VtZW50c1xuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFyayBkb2N1bWVudHMgYXMgZGVsZXRlZFxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1hcmtlZCBkb2N1bWVudHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBkaXJlY3QgZmluZCBvcGVyYXRpb24gdXNpbmcgYSBNYW5nbyBxdWVyeSBvYmplY3QuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgY29tcGxleCBxdWVyaWVzIGJleW9uZCB0aGUgc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbcHJvY2Vzcz10cnVlXSAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgKHRydWUgcmV0dXJucyBqdXN0IGRvY3MsIGZhbHNlIHJldHVybnMgZnVsbCByZXNwb25zZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmF3PFY+KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGZpbmQocmF3SW5wdXQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBGaW5kUmVzcG9uc2VcbiAgICogICAgIGFsdCBwcm9jZXNzPXRydWVcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UuZG9jcyBhcyBWXG4gICAqICAgICBlbHNlIHByb2Nlc3M9ZmFsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UgYXMgVlxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzID0gdHJ1ZSk6IFByb21pc2U8Vj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogRmluZFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKFxuICAgICAgICByYXdJbnB1dCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkuXG4gICAqIFRoaXMgaW5zdGFuY2UgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgc3RhdGljIHBhcnNlRXJyb3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeSBiYXNlZCBvbiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFuYWx5emVzIHRoZSBlcnJvciB0eXBlLCBzdGF0dXMgY29kZSwgb3IgbWVzc2FnZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVyciwgcmVhc29uKVxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBSZXR1cm4gZXJyIGFzIGlzXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBhbHQgY29udGFpbnMgXCJhbHJlYWR5IGV4aXN0XCIgb3IgXCJ1cGRhdGUgY29uZmxpY3RcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvbnRhaW5zIFwibWlzc2luZ1wiIG9yIFwiZGVsZXRlZFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBzdGF0dXNcbiAgICogICAgIGFsdCBzdGF0dXMgaXMgNDAxLCA0MTIsIDQwOVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDRcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDAwXG4gICAqICAgICAgIGFsdCBtZXNzYWdlIGNvbnRhaW5zIFwiTm8gaW5kZXggZXhpc3RzXCJcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgICAgIGVsc2VcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBtZXNzYWdlIGNvbnRhaW5zIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICAvLyByZXR1cm4gc3VwZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5zdGF0dXMpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgUG91Y2hEQi1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIG1vZGVscy5cbiAgICogVGhpcyBtZXRob2QgZGVmaW5lcyBob3cgdGhlc2UgZmllbGRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogZGVjb3JhdGlvbigpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIGRlY29yYXRpb24oKSB7XG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cblBvdWNoQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUG91Y2hSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuLy8gbGVmdCB0byB0aGUgZW5kIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBUeXBlU2NyaXB0IGFkYXB0ZXIgZm9yIFBvdWNoREIgaW50ZWdyYXRpb25cbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgcmVwb3NpdG9yeSBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBQb3VjaERCLCBhbGxvd2luZyBmb3IgZWFzeSBkYXRhYmFzZSBvcGVyYXRpb25zIHdpdGggVHlwZVNjcmlwdCB0eXBlIHNhZmV0eS4gSXQgZXhwb3J0cyBjb25zdGFudHMsIHJlcG9zaXRvcnkgY2xhc3NlcywgdHlwZXMsIGFuZCBhZGFwdGVycyBmb3Igd29ya2luZyB3aXRoIFBvdWNoREIuXG4gKiBAbW9kdWxlIGZvci1wb3VjaFxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhY2thZ2UgdmVyc2lvbiBpZGVudGlmaWVyXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZm9yLXBvdWNoIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1wb3VjaFxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJVbnN1cHBvcnRlZEVycm9yIiwiQ291Y2hEQkFkYXB0ZXIiLCJnZW5lcmF0ZUluZGV4ZXMiLCJDb25mbGljdEVycm9yIiwiSW50ZXJuYWxFcnJvciIsIkNvdWNoREJLZXlzIiwiQmFzZUVycm9yIiwiTm90Rm91bmRFcnJvciIsIkluZGV4RXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJSZXBvc2l0b3J5IiwiUGVyc2lzdGVuY2VLZXlzIiwiRGVjb3JhdGlvbiIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBQTs7Ozs7O0lBTUc7QUFDSSxVQUFNLFlBQVksR0FBRzs7SUNvQzVCOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztJQUNJLGVBQWUsNEJBQTRCLENBTWhELE9BQTRCLEVBQzVCLElBQU8sRUFDUCxHQUFZLEVBQ1osS0FBUSxFQUFBO0lBRVIsSUFBQSxJQUFJO1lBQ0YsTUFBTSxJQUFJLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEMsUUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBa0I7OztRQUUvQixPQUFPLENBQVUsRUFBRTtJQUNuQixRQUFBLE1BQU0sSUFBSUEscUJBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRTs7SUFFTDtJQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnREc7SUFDRyxNQUFPLFlBQWEsU0FBUUMseUJBSWpDLENBQUE7UUFDQyxXQUFZLENBQUEsS0FBZSxFQUFFLEtBQWMsRUFBQTtJQUN6QyxRQUFBLEtBQUssQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQzs7SUFHbkM7Ozs7Ozs7OztJQVNHO0lBQ2dCLElBQUEsTUFBTSxLQUFLLENBQzVCLFNBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLEtB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
|
|
661
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXBvdWNoLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIFBvdWNoREIgZmxhdm9yIGluIHRoZSBkZWNvcmF0b3Igc3lzdGVtXG4gKiBAc3VtbWFyeSBBIHN0cmluZyBjb25zdGFudCB0aGF0IGlkZW50aWZpZXMgdGhlIFBvdWNoREIgaW1wbGVtZW50YXRpb24gaW4gdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBUaGlzIGlzIHVzZWQgdG8gdGFyZ2V0IGRlY29yYXRvcnMgc3BlY2lmaWNhbGx5IGZvciBQb3VjaERCIGFkYXB0ZXJzLlxuICogQGNvbnN0IFBvdWNoRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGNvbnN0IFBvdWNoRmxhdm91ciA9IFwicG91Y2hcIjtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIEluZGV4RXJyb3IsXG4gIE1hbmdvUXVlcnksXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBEYXRhYmFzZSA9IFBvdWNoREIuRGF0YWJhc2U7XG5pbXBvcnQgUmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuUmVzcG9uc2U7XG5pbXBvcnQgRXJyID0gUG91Y2hEQi5Db3JlLkVycm9yO1xuaW1wb3J0IElkTWV0YSA9IFBvdWNoREIuQ29yZS5JZE1ldGE7XG5pbXBvcnQgR2V0TWV0YSA9IFBvdWNoREIuQ29yZS5HZXRNZXRhO1xuaW1wb3J0IENyZWF0ZUluZGV4UmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuQ3JlYXRlSW5kZXhSZXNwb25zZTtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgQnVsa0dldFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLkJ1bGtHZXRSZXNwb25zZTtcbmltcG9ydCBGaW5kUmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuRmluZFJlc3BvbnNlO1xuaW1wb3J0IHsgUG91Y2hGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQb3VjaEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBvdWNoUmVwb3NpdG9yeSB9IGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIElEIG9uIGEgbW9kZWwgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBkZWNvcmF0b3IgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRvciBJRCBmaWVsZCBvbiBhIG1vZGVsXG4gKiB3aGVuIGl0J3MgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLiBJdCBleHRyYWN0cyB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSB0aGF0IGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8UG91Y2hGbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyBmbGFnc1xuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBtb2RpZnlcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3VjaERCIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlclxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlciBmb3IgUG91Y2hEQi5cbiAqIEl0IGhhbmRsZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgbGlrZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlIChDUlVEKSBmb3IgYm90aFxuICogc2luZ2xlIGRvY3VtZW50cyBhbmQgYnVsayBvcGVyYXRpb25zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBpbmRleGluZy5cbiAqIEB0ZW1wbGF0ZSBEYXRhYmFzZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBQb3VjaEZsYWdzIC0gVGhlIGZsYWdzIHNwZWNpZmljIHRvIFBvdWNoREIgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8UG91Y2hGbGFncz4gLSBUaGUgY29udGV4dCB0eXBlIHdpdGggUG91Y2hEQiBmbGFnc1xuICogQHBhcmFtIHtEYXRhYmFzZX0gc2NvcGUgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGRhdGFiYXNlXG4gKiBAY2xhc3MgUG91Y2hBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG4gKiBpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLXBvdWNoJztcbiAqXG4gKiAvLyBDcmVhdGUgYSBuZXcgUG91Y2hEQiBpbnN0YW5jZVxuICogY29uc3QgZGIgPSBuZXcgUG91Y2hEQignbXktZGF0YWJhc2UnKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBQb3VjaEFkYXB0ZXIgd2l0aCB0aGUgZGF0YWJhc2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG91Y2hBZGFwdGVyKGRiKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlci0xMjMnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBuZXcgUG91Y2hBZGFwdGVyKGRiKVxuICogICBQb3VjaEFkYXB0ZXItPj5Db3VjaERCQWRhcHRlcjogc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIFBVVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZVxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGUsIGlkKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoaWQpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIEdFVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IERvY3VtZW50XG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgUG91Y2hEQiBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBVVUlEIGZvciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgZGF0YWJhc2UgVVJMIG9yIGdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxQb3VjaEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIG1lcmdlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvdWNoRmxhZ3M+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFBvdWNoRmxhZ3M+XG4gICk6IFByb21pc2U8UG91Y2hGbGFncz4ge1xuICAgIGxldCBpZDogc3RyaW5nID0gXCJcIjtcbiAgICBjb25zdCB1cmwgPSAodGhpcy5uYXRpdmUgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IC9odHRwcz86XFwvXFwvKC4rPyk6Lis/QC9nO1xuICAgICAgY29uc3QgbSA9IHJlZ2V4cC5leGVjKHVybCk7XG4gICAgICBpZiAobSkgaWQgPSBtWzFdO1xuICAgIH1cbiAgICBpZiAoIWlkKSB7XG4gICAgICBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiBpZCxcbiAgICB9KSBhcyBQb3VjaEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9ycy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2VuZXJhdGVJbmRleGVzIHV0aWxpdHkgdG8gY3JlYXRlIGluZGV4IGRlZmluaXRpb25zIGFuZCB0aGVuIGNyZWF0ZXMgdGhlbSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IGRvY3VtZW50IGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSAgbW9kZWxzIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgZ2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudCBJRCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSUQsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrR2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGRvY3VtZW50IElEcyBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSURzLCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWRBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnJvcilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICgoZCBhcyBhbnkpLmVycm9yIHx8ICEoZCBhcyBhbnkpLm9rKVxuICAgICAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKFxuICAgICAgICAgICAgKChkIGFzIHsgZXJyb3I6IEVyciB9KS5lcnJvciBhcyBFcnJvcikgfHxcbiAgICAgICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIHZhbGlkIHJlc3BvbnNlXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IChSZXNwb25zZSB8IEVycilbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICEociBhcyBhbnkpLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmICgoZWwgYXMgYW55KS5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7KGVsIGFzIGFueSkuZXJyb3J9JHsoZWwgYXMgYW55KS5yZWFzb24gPyBgIC0gJHsoZWwgYXMgYW55KS5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSByZW1vdmUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHRvIGdldCBpdHMgcmV2aXNpb24sIHRoZW4gZGVsZXRlcyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudCB3aXRoIF9yZXZcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiByZW1vdmUoX2lkLCByZWNvcmQuX3JldilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLnJlbW92ZShfaWQsIHJlY29yZC5fcmV2KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgYWxsIGRvY3VtZW50cyB0byBnZXQgdGhlaXIgcmV2aXNpb25zLCB0aGVuIG1hcmtzIHRoZW0gYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZSB3aXRoIGRvY3VtZW50c1xuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFyayBkb2N1bWVudHMgYXMgZGVsZXRlZFxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1hcmtlZCBkb2N1bWVudHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBkaXJlY3QgZmluZCBvcGVyYXRpb24gdXNpbmcgYSBNYW5nbyBxdWVyeSBvYmplY3QuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgY29tcGxleCBxdWVyaWVzIGJleW9uZCB0aGUgc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbcHJvY2Vzcz10cnVlXSAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgKHRydWUgcmV0dXJucyBqdXN0IGRvY3MsIGZhbHNlIHJldHVybnMgZnVsbCByZXNwb25zZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmF3PFY+KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGZpbmQocmF3SW5wdXQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBGaW5kUmVzcG9uc2VcbiAgICogICAgIGFsdCBwcm9jZXNzPXRydWVcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UuZG9jcyBhcyBWXG4gICAqICAgICBlbHNlIHByb2Nlc3M9ZmFsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UgYXMgVlxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzID0gdHJ1ZSk6IFByb21pc2U8Vj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogRmluZFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKFxuICAgICAgICByYXdJbnB1dCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkuXG4gICAqIFRoaXMgaW5zdGFuY2UgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgc3RhdGljIHBhcnNlRXJyb3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeSBiYXNlZCBvbiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFuYWx5emVzIHRoZSBlcnJvciB0eXBlLCBzdGF0dXMgY29kZSwgb3IgbWVzc2FnZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVyciwgcmVhc29uKVxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBSZXR1cm4gZXJyIGFzIGlzXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBhbHQgY29udGFpbnMgXCJhbHJlYWR5IGV4aXN0XCIgb3IgXCJ1cGRhdGUgY29uZmxpY3RcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvbnRhaW5zIFwibWlzc2luZ1wiIG9yIFwiZGVsZXRlZFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBzdGF0dXNcbiAgICogICAgIGFsdCBzdGF0dXMgaXMgNDAxLCA0MTIsIDQwOVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDRcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDAwXG4gICAqICAgICAgIGFsdCBtZXNzYWdlIGNvbnRhaW5zIFwiTm8gaW5kZXggZXhpc3RzXCJcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgICAgIGVsc2VcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBtZXNzYWdlIGNvbnRhaW5zIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICAvLyByZXR1cm4gc3VwZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5zdGF0dXMpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgUG91Y2hEQi1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIG1vZGVscy5cbiAgICogVGhpcyBtZXRob2QgZGVmaW5lcyBob3cgdGhlc2UgZmllbGRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogZGVjb3JhdGlvbigpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5Qb3VjaEFkYXB0ZXIuc2V0Q3VycmVudChQb3VjaEZsYXZvdXIpO1xuIiwiaW1wb3J0IHsgUG91Y2hBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5Qb3VjaEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbi8vIGxlZnQgdG8gdGhlIGVuZCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgVHlwZVNjcmlwdCBhZGFwdGVyIGZvciBQb3VjaERCIGludGVncmF0aW9uXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHJlcG9zaXRvcnkgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBmb3IgUG91Y2hEQiwgYWxsb3dpbmcgZm9yIGVhc3kgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkuIEl0IGV4cG9ydHMgY29uc3RhbnRzLCByZXBvc2l0b3J5IGNsYXNzZXMsIHR5cGVzLCBhbmQgYWRhcHRlcnMgZm9yIHdvcmtpbmcgd2l0aCBQb3VjaERCLlxuICogQG1vZHVsZSBmb3ItcG91Y2hcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWNrYWdlIHZlcnNpb24gaWRlbnRpZmllclxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGZvci1wb3VjaCBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiVW5zdXBwb3J0ZWRFcnJvciIsIkNvdWNoREJBZGFwdGVyIiwiZ2VuZXJhdGVJbmRleGVzIiwiQ29uZmxpY3RFcnJvciIsIkludGVybmFsRXJyb3IiLCJDb3VjaERCS2V5cyIsIkJhc2VFcnJvciIsIk5vdEZvdW5kRXJyb3IiLCJJbmRleEVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiUmVwb3NpdG9yeSIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb24iLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7OztJQU1HO0FBQ0ksVUFBTSxZQUFZLEdBQUc7O0lDb0M1Qjs7Ozs7Ozs7Ozs7Ozs7O0lBZUc7SUFDSSxlQUFlLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtJQUVSLElBQUEsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ3hDLFFBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQWtCOzs7UUFFL0IsT0FBTyxDQUFVLEVBQUU7SUFDbkIsUUFBQSxNQUFNLElBQUlBLHFCQUFnQixDQUN4QixnRUFBZ0UsQ0FDakU7O0lBRUw7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZ0RHO0lBQ0csTUFBTyxZQUFhLFNBQVFDLHlCQUlqQyxDQUFBO1FBQ0MsV0FBWSxDQUFBLEtBQWUsRUFBRSxLQUFjLEVBQUE7SUFDekMsUUFBQSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENB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
|
package/dist/for-pouch.esm.cjs
CHANGED
|
@@ -623,6 +623,7 @@ class PouchAdapter extends CouchDBAdapter {
|
|
|
623
623
|
* PouchAdapter->>Decoration: apply()
|
|
624
624
|
*/
|
|
625
625
|
static decoration() {
|
|
626
|
+
super.decoration();
|
|
626
627
|
const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
|
|
627
628
|
const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
|
|
628
629
|
Decoration.flavouredAs(PouchFlavour)
|
|
@@ -635,6 +636,7 @@ class PouchAdapter extends CouchDBAdapter {
|
|
|
635
636
|
.apply();
|
|
636
637
|
}
|
|
637
638
|
}
|
|
639
|
+
PouchAdapter.setCurrent(PouchFlavour);
|
|
638
640
|
|
|
639
641
|
PouchAdapter.decoration();
|
|
640
642
|
/**
|
|
@@ -648,7 +650,7 @@ PouchAdapter.decoration();
|
|
|
648
650
|
* @const VERSION
|
|
649
651
|
* @memberOf module:for-pouch
|
|
650
652
|
*/
|
|
651
|
-
const VERSION = "0.2.
|
|
653
|
+
const VERSION = "0.2.7";
|
|
652
654
|
|
|
653
655
|
export { PouchAdapter, PouchFlavour, VERSION, createdByOnPouchCreateUpdate };
|
|
654
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXBvdWNoLmVzbS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGlmaWVyIGZvciBQb3VjaERCIGZsYXZvciBpbiB0aGUgZGVjb3JhdG9yIHN5c3RlbVxuICogQHN1bW1hcnkgQSBzdHJpbmcgY29uc3RhbnQgdGhhdCBpZGVudGlmaWVzIHRoZSBQb3VjaERCIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3Igc3lzdGVtLlxuICogVGhpcyBpcyB1c2VkIHRvIHRhcmdldCBkZWNvcmF0b3JzIHNwZWNpZmljYWxseSBmb3IgUG91Y2hEQiBhZGFwdGVycy5cbiAqIEBjb25zdCBQb3VjaEZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBjb25zdCBQb3VjaEZsYXZvdXIgPSBcInBvdWNoXCI7XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBJbmRleEVycm9yLFxuICBNYW5nb1F1ZXJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25FcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgRGF0YWJhc2UgPSBQb3VjaERCLkRhdGFiYXNlO1xuaW1wb3J0IFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLlJlc3BvbnNlO1xuaW1wb3J0IEVyciA9IFBvdWNoREIuQ29yZS5FcnJvcjtcbmltcG9ydCBJZE1ldGEgPSBQb3VjaERCLkNvcmUuSWRNZXRhO1xuaW1wb3J0IEdldE1ldGEgPSBQb3VjaERCLkNvcmUuR2V0TWV0YTtcbmltcG9ydCBDcmVhdGVJbmRleFJlc3BvbnNlID0gUG91Y2hEQi5GaW5kLkNyZWF0ZUluZGV4UmVzcG9uc2U7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IEJ1bGtHZXRSZXNwb25zZSA9IFBvdWNoREIuQ29yZS5CdWxrR2V0UmVzcG9uc2U7XG5pbXBvcnQgRmluZFJlc3BvbnNlID0gUG91Y2hEQi5GaW5kLkZpbmRSZXNwb25zZTtcbmltcG9ydCB7IFBvdWNoRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUG91Y2hGbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQb3VjaFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9Qb3VjaFJlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBJRCBvbiBhIG1vZGVsIGR1cmluZyBjcmVhdGlvbiBvciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZGVjb3JhdG9yIGhhbmRsZXIgdG8gYXV0b21hdGljYWxseSBzZXQgdGhlIGNyZWF0b3IgSUQgZmllbGQgb24gYSBtb2RlbFxuICogd2hlbiBpdCdzIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZC4gSXQgZXh0cmFjdHMgdGhlIFVVSUQgZnJvbSB0aGUgY29udGV4dCBhbmQgYXNzaWducyBpdCB0byB0aGUgc3BlY2lmaWVkIGtleS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFBvdWNoUmVwb3NpdG9yeTxNPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgdGhhdCBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PFBvdWNoRmxhZ3M+fSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgZmxhZ3NcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCBvbiB0aGUgbW9kZWxcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gbW9kaWZ5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1wb3VjaFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFBvdWNoRmxhZ3M+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gICAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUG91Y2hEQiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ291Y2hEQkFkYXB0ZXJcbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ291Y2hEQkFkYXB0ZXIgZm9yIFBvdWNoREIuXG4gKiBJdCBoYW5kbGVzIGFsbCBkYXRhYmFzZSBvcGVyYXRpb25zIGxpa2UgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSAoQ1JVRCkgZm9yIGJvdGhcbiAqIHNpbmdsZSBkb2N1bWVudHMgYW5kIGJ1bGsgb3BlcmF0aW9ucy4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgaW5kZXhpbmcuXG4gKiBAdGVtcGxhdGUgRGF0YWJhc2UgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSB0eXBlXG4gKiBAdGVtcGxhdGUgUG91Y2hGbGFncyAtIFRoZSBmbGFncyBzcGVjaWZpYyB0byBQb3VjaERCIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PFBvdWNoRmxhZ3M+IC0gVGhlIGNvbnRleHQgdHlwZSB3aXRoIFBvdWNoREIgZmxhZ3NcbiAqIEBwYXJhbSB7RGF0YWJhc2V9IHNjb3BlIC0gVGhlIFBvdWNoREIgZGF0YWJhc2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBkYXRhYmFzZVxuICogQGNsYXNzIFBvdWNoQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xuICogaW1wb3J0IHsgUG91Y2hBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1wb3VjaCc7XG4gKlxuICogLy8gQ3JlYXRlIGEgbmV3IFBvdWNoREIgaW5zdGFuY2VcbiAqIGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ215LWRhdGFiYXNlJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgUG91Y2hBZGFwdGVyIHdpdGggdGhlIGRhdGFiYXNlXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFBvdWNoQWRhcHRlcihkYik7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXItMTIzJyk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gKiAgIHBhcnRpY2lwYW50IENvdWNoREJcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogbmV3IFBvdWNoQWRhcHRlcihkYilcbiAqICAgUG91Y2hBZGFwdGVyLT4+Q291Y2hEQkFkYXB0ZXI6IHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKVxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbClcbiAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICogICBQb3VjaERCLT4+Q291Y2hEQjogSFRUUCBQVVRcbiAqICAgQ291Y2hEQi0tPj5Qb3VjaERCOiBSZXNwb25zZVxuICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2VcbiAqICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkKHRhYmxlLCBpZClcbiAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KGlkKVxuICogICBQb3VjaERCLT4+Q291Y2hEQjogSFRUUCBHRVRcbiAqICAgQ291Y2hEQi0tPj5Qb3VjaERCOiBEb2N1bWVudFxuICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAqICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBvdWNoQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBEYXRhYmFzZSxcbiAgUG91Y2hGbGFncyxcbiAgQ29udGV4dDxQb3VjaEZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBEYXRhYmFzZSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgUG91Y2hGbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBvcGVyYXRpb24gZmxhZ3MgZm9yIFBvdWNoREIgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgc2V0IG9mIGZsYWdzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGEgVVVJRCBmb3IgaWRlbnRpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSB1c2VyIElEIGZyb20gdGhlIGRhdGFiYXNlIFVSTCBvciBnZW5lcmF0ZXMgYSByYW5kb20gVVVJRCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8UG91Y2hGbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBtZXJnZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3VjaEZsYWdzPn0gVGhlIGNvbXBsZXRlIHNldCBvZiBmbGFncyBmb3IgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxQb3VjaEZsYWdzPlxuICApOiBQcm9taXNlPFBvdWNoRmxhZ3M+IHtcbiAgICBsZXQgaWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgY29uc3QgdXJsID0gKHRoaXMubmF0aXZlIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBjb25zdCByZWdleHAgPSAvaHR0cHM/OlxcL1xcLyguKz8pOi4rP0AvZztcbiAgICAgIGNvbnN0IG0gPSByZWdleHAuZXhlYyh1cmwpO1xuICAgICAgaWYgKG0pIGlkID0gbVsxXTtcbiAgICB9XG4gICAgaWYgKCFpZCkge1xuICAgICAgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgVVVJRDogaWQsXG4gICAgfSkgYXMgUG91Y2hGbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgY3JlYXRlcyBpbmRleGVzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvcnMuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGdlbmVyYXRlSW5kZXhlcyB1dGlsaXR5IHRvIGNyZWF0ZSBpbmRleCBkZWZpbml0aW9ucyBhbmQgdGhlbiBjcmVhdGVzIHRoZW0gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBjcmVhdGUgaW5kZXhlcyBmb3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgaW5kZXhlcyBhcmUgY3JlYXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IENyZWF0ZUluZGV4UmVxdWVzdFtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBjb25zdCByZXM6IENyZWF0ZUluZGV4UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmNyZWF0ZUluZGV4KFxuICAgICAgICBpbmRleCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHJlc3VsdCB9ID0gcmVzO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gXCJleGlzdGluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihgSW5kZXggJHtpbmRleC5uYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIG5ldyBkb2N1bWVudCBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBwdXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBkb2N1bWVudCBkYXRhIHRvIGluc2VydFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGluc2VydCBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBtdWx0aXBsZSBkb2N1bWVudHMgaW50byB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0RvY3Mgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgYWxsIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcGFyYW0gIG1vZGVscyAtIFRoZSBkb2N1bWVudCBkYXRhIHRvIGluc2VydFxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZUFsbCh0YWJsZU5hbWUsIGlkcywgbW9kZWxzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1vZGVscylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IG9mIHJlc3BvbnNlcyB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTXVsdGlwbGVNZXRhZGF0YShtb2RlbHMsIHJldnMpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVscyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IHdpdGggZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZVtdIHwgRXJyW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MobW9kZWxzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyOiBSZXNwb25zZSB8IEVycikgPT4gKHIgYXMgUmVzcG9uc2UpLm9rKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIGRvY3VtZW50IGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGdldCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgZG9jdW1lbnQgSUQgYmFzZWQgb24gdGhlIHRhYmxlIG5hbWUgYW5kIElELCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KF9pZClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50XG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBieSB0aGVpciBJRHNcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0dldCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBkb2N1bWVudCBJRHMgYmFzZWQgb24gdGhlIHRhYmxlIG5hbWUgYW5kIElEcywgdGhlbiByZXRyaWV2ZXMgdGhlIGRvY3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBCdWxrR2V0UmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhIGZvciBlYWNoIGRvY1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZXJyb3IpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0czogQnVsa0dldFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrR2V0KHtcbiAgICAgIGRvY3M6IGlkcy5tYXAoKGlkKSA9PiAoeyBpZDogdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSB9KSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBpZiAoKGQgYXMgYW55KS5lcnJvciB8fCAhKGQgYXMgYW55KS5vaylcbiAgICAgICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihcbiAgICAgICAgICAgICgoZCBhcyB7IGVycm9yOiBFcnIgfSkuZXJyb3IgYXMgRXJyb3IpIHx8XG4gICAgICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyB2YWxpZCByZXNwb25zZVwiKVxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIChkIGFzIHsgb2s6IGFueSB9KS5vayk7XG4gICAgICAgIGFjY3VtLnB1c2godGhpcy5hc3NpZ25NZXRhZGF0YShyZXN1bHQsIChkIGFzIGFueSkub2tbQ291Y2hEQktleXMuUkVWXSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIGRvY3VtZW50IGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBwdXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiB1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLnB1dChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0RvY3Mgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgYWxsIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZUFsbCh0YWJsZU5hbWUsIGlkcywgbW9kZWxzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1vZGVscylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IG9mIHJlc3BvbnNlcyB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTXVsdGlwbGVNZXRhZGF0YShtb2RlbHMsIHJldnMpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVscyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IHdpdGggZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiAoUmVzcG9uc2UgfCBFcnIpW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MobW9kZWxzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyKSA9PiAhKHIgYXMgYW55KS5lcnJvcikpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoKGVsIGFzIGFueSkuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAkeyhlbCBhcyBhbnkpLmVycm9yfSR7KGVsIGFzIGFueSkucmVhc29uID8gYCAtICR7KGVsIGFzIGFueSkucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcmVtb3ZlIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZmlyc3QgcmV0cmlldmVzIHRoZSBkb2N1bWVudCB0byBnZXQgaXRzIHJldmlzaW9uLCB0aGVuIGRlbGV0ZXMgaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KF9pZClcbiAgICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnQgd2l0aCBfcmV2XG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcmVtb3ZlKF9pZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogSWRNZXRhICYgR2V0TWV0YTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5yZW1vdmUoX2lkLCByZWNvcmQuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZmlyc3QgcmV0cmlldmVzIGFsbCBkb2N1bWVudHMgdG8gZ2V0IHRoZWlyIHJldmlzaW9ucywgdGhlbiBtYXJrcyB0aGVtIGFzIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXJ8YmlnaW50Pn0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGRlbGV0ZUFsbCh0YWJsZU5hbWUsIGlkcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcCBpZHMgdG8gZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtHZXQoe2RvY3N9KVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBCdWxrR2V0UmVzcG9uc2Ugd2l0aCBkb2N1bWVudHNcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcmsgZG9jdW1lbnRzIGFzIGRlbGV0ZWRcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtYXJrZWQgZG9jdW1lbnRzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogU3VjY2VzcyByZXNwb25zZXNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhIGZvciBlYWNoIGRvY1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRGVsZXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbGV0aW9uOiAoUmVzcG9uc2UgfCBFcnIpW10gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhcbiAgICAgIHJlc3VsdHMucmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5ERUxFVEVEXSA9IHRydWU7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJycyA9IGRlbGV0aW9uLmZpbHRlcigoZCkgPT4gKGQgYXMgYW55KS5lcnJvcik7XG4gICAgaWYgKGVycnMubGVuZ3RoKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJzLmpvaW4oXCJcXG5cIikpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cy5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgcikgPT4ge1xuICAgICAgci5kb2NzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgZGlyZWN0IGZpbmQgb3BlcmF0aW9uIHVzaW5nIGEgTWFuZ28gcXVlcnkgb2JqZWN0LlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgZm9yIGNvbXBsZXggcXVlcmllcyBiZXlvbmQgdGhlIHN0YW5kYXJkIENSVUQgb3BlcmF0aW9ucy5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBxdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb2Nlc3M9dHJ1ZV0gLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3BvbnNlICh0cnVlIHJldHVybnMganVzdCBkb2NzLCBmYWxzZSByZXR1cm5zIGZ1bGwgcmVzcG9uc2UpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJhdzxWPihyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBmaW5kKHJhd0lucHV0KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRmluZFJlc3BvbnNlXG4gICAqICAgICBhbHQgcHJvY2Vzcz10cnVlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IHJlc3BvbnNlLmRvY3MgYXMgVlxuICAgKiAgICAgZWxzZSBwcm9jZXNzPWZhbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IHJlc3BvbnNlIGFzIFZcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJhdzxWPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgcHJvY2VzcyA9IHRydWUpOiBQcm9taXNlPFY+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IEZpbmRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuZmluZChcbiAgICAgICAgcmF3SW5wdXQgYXMgYW55XG4gICAgICApO1xuICAgICAgaWYgKHJlc3BvbnNlLndhcm5pbmcpIGNvbnNvbGUud2FybihyZXNwb25zZS53YXJuaW5nKTtcbiAgICAgIGlmIChwcm9jZXNzKSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFY7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgY29udmVydHMgZXJyb3JzIGZyb20gUG91Y2hEQiB0byBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvcnNcbiAgICogQHN1bW1hcnkgQ29udmVydHMgUG91Y2hEQiBlcnJvcnMgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZXJyb3IgaGllcmFyY2h5LlxuICAgKiBUaGlzIGluc3RhbmNlIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIHN0YXRpYyBwYXJzZUVycm9yIG1ldGhvZC5cbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciBvYmplY3Qgb3IgbWVzc2FnZSB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBjb252ZXJ0ZWQgZXJyb3Igb2JqZWN0XG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCB0byBwYXJzZSBhbmQgY29udmVydCBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkgYmFzZWQgb24gZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzLlxuICAgKiBUaGlzIG1ldGhvZCBhbmFseXplcyB0aGUgZXJyb3IgdHlwZSwgc3RhdHVzIGNvZGUsIG9yIG1lc3NhZ2UgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjbGFzcy5cbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciBvYmplY3Qgb3IgbWVzc2FnZSB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBjb252ZXJ0ZWQgZXJyb3Igb2JqZWN0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnIsIHJlYXNvbilcbiAgICogICBhbHQgZXJyIGlzIEJhc2VFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogUmV0dXJuIGVyciBhcyBpc1xuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvbnRhaW5zIFwiYWxyZWFkeSBleGlzdFwiIG9yIFwidXBkYXRlIGNvbmZsaWN0XCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBjb250YWlucyBcIm1pc3NpbmdcIiBvciBcImRlbGV0ZWRcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgc3RhdHVzXG4gICAqICAgICBhbHQgc3RhdHVzIGlzIDQwMSwgNDEyLCA0MDlcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDA0XG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVsc2Ugc3RhdHVzIGlzIDQwMFxuICAgKiAgICAgICBhbHQgbWVzc2FnZSBjb250YWlucyBcIk5vIGluZGV4IGV4aXN0c1wiXG4gICAqICAgICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW5kZXhFcnJvclxuICAgKiAgICAgICBlbHNlXG4gICAqICAgICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgbWVzc2FnZSBjb250YWlucyBcIkVDT05OUkVGVVNFRFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgICAgZWxzZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgLy8gcmV0dXJuIHN1cGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuc3RhdHVzKSB7XG4gICAgICBjb2RlID0gKGVyciBhcyBhbnkpLnN0YXR1cztcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgZGVjb3JhdGlvbnMgZm9yIFBvdWNoREItc3BlY2lmaWMgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRvcnMgZm9yIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGZpZWxkcyBpbiBtb2RlbHMuXG4gICAqIFRoaXMgbWV0aG9kIGRlZmluZXMgaG93IHRoZXNlIGZpZWxkcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBwb3B1bGF0ZWQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERlY29yYXRpb25cbiAgICpcbiAgICogICBDYWxsZXItPj5Qb3VjaEFkYXB0ZXI6IGRlY29yYXRpb24oKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlBvdWNoQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiB1cGRhdGVkQnlLZXlcbiAgICpcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5Qb3VjaEFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICpcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5Qb3VjaEFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICovXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCkge1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUG91Y2hBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5Qb3VjaEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbi8vIGxlZnQgdG8gdGhlIGVuZCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgVHlwZVNjcmlwdCBhZGFwdGVyIGZvciBQb3VjaERCIGludGVncmF0aW9uXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHJlcG9zaXRvcnkgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBmb3IgUG91Y2hEQiwgYWxsb3dpbmcgZm9yIGVhc3kgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkuIEl0IGV4cG9ydHMgY29uc3RhbnRzLCByZXBvc2l0b3J5IGNsYXNzZXMsIHR5cGVzLCBhbmQgYWRhcHRlcnMgZm9yIHdvcmtpbmcgd2l0aCBQb3VjaERCLlxuICogQG1vZHVsZSBmb3ItcG91Y2hcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWNrYWdlIHZlcnNpb24gaWRlbnRpZmllclxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGZvci1wb3VjaCBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7OztBQU1HO0FBQ0ksTUFBTSxZQUFZLEdBQUc7O0FDb0M1Qjs7Ozs7Ozs7Ozs7Ozs7O0FBZUc7QUFDSSxlQUFlLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVEsRUFBQTtBQUVSLElBQUEsSUFBSTtRQUNGLE1BQU0sSUFBSSxHQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQ3hDLFFBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQWtCOzs7SUFFL0IsT0FBTyxDQUFVLEVBQUU7QUFDbkIsUUFBQSxNQUFNLElBQUksZ0JBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRTs7QUFFTDtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREc7QUFDRyxNQUFPLFlBQWEsU0FBUSxjQUlqQyxDQUFBO0lBQ0MsV0FBWSxDQUFBLEtBQWUsRUFBRSxLQUFjLEVBQUE7QUFDekMsUUFBQSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7O0FBR25DOzs7Ozs7Ozs7QUFTRztBQUNnQixJQUFBLE1BQU0sS0FBSyxDQUM1QixTQUF3QixFQUN4QixLQUFxQixFQUNyQixLQUEwQixFQUFBO1FBRTFCLElBQUksRUFBRSxHQUFXLEVBQUU7QUFDbkIsUUFBQSxNQUFNLEdBQUcsR0FBSSxJQUFJLENBQUMsTUFBc0MsQ0FBQyxJQUFJO1FBQzdELElBQUksR0FBRyxFQUFFO1lBQ1AsTUFBTSxNQUFNLEdBQUcsd0JBQXdCO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzFCLFlBQUEsSUFBSSxDQUFDO0FBQUUsZ0JBQUEsRUFBRSxHQUFH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
|
|
656
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXBvdWNoLmVzbS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGlmaWVyIGZvciBQb3VjaERCIGZsYXZvciBpbiB0aGUgZGVjb3JhdG9yIHN5c3RlbVxuICogQHN1bW1hcnkgQSBzdHJpbmcgY29uc3RhbnQgdGhhdCBpZGVudGlmaWVzIHRoZSBQb3VjaERCIGltcGxlbWVudGF0aW9uIGluIHRoZSBkZWNvcmF0b3Igc3lzdGVtLlxuICogVGhpcyBpcyB1c2VkIHRvIHRhcmdldCBkZWNvcmF0b3JzIHNwZWNpZmljYWxseSBmb3IgUG91Y2hEQiBhZGFwdGVycy5cbiAqIEBjb25zdCBQb3VjaEZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBjb25zdCBQb3VjaEZsYXZvdXIgPSBcInBvdWNoXCI7XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBJbmRleEVycm9yLFxuICBNYW5nb1F1ZXJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25FcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgUmVwb3NpdG9yeSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgRGF0YWJhc2UgPSBQb3VjaERCLkRhdGFiYXNlO1xuaW1wb3J0IFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLlJlc3BvbnNlO1xuaW1wb3J0IEVyciA9IFBvdWNoREIuQ29yZS5FcnJvcjtcbmltcG9ydCBJZE1ldGEgPSBQb3VjaERCLkNvcmUuSWRNZXRhO1xuaW1wb3J0IEdldE1ldGEgPSBQb3VjaERCLkNvcmUuR2V0TWV0YTtcbmltcG9ydCBDcmVhdGVJbmRleFJlc3BvbnNlID0gUG91Y2hEQi5GaW5kLkNyZWF0ZUluZGV4UmVzcG9uc2U7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IEJ1bGtHZXRSZXNwb25zZSA9IFBvdWNoREIuQ29yZS5CdWxrR2V0UmVzcG9uc2U7XG5pbXBvcnQgRmluZFJlc3BvbnNlID0gUG91Y2hEQi5GaW5kLkZpbmRSZXNwb25zZTtcbmltcG9ydCB7IFBvdWNoRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUG91Y2hGbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQb3VjaFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9Qb3VjaFJlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBJRCBvbiBhIG1vZGVsIGR1cmluZyBjcmVhdGlvbiBvciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZGVjb3JhdG9yIGhhbmRsZXIgdG8gYXV0b21hdGljYWxseSBzZXQgdGhlIGNyZWF0b3IgSUQgZmllbGQgb24gYSBtb2RlbFxuICogd2hlbiBpdCdzIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZC4gSXQgZXh0cmFjdHMgdGhlIFVVSUQgZnJvbSB0aGUgY29udGV4dCBhbmQgYXNzaWducyBpdCB0byB0aGUgc3BlY2lmaWVkIGtleS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFBvdWNoUmVwb3NpdG9yeTxNPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgdGhhdCBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PFBvdWNoRmxhZ3M+fSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgZmxhZ3NcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCBvbiB0aGUgbW9kZWxcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gbW9kaWZ5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1wb3VjaFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFBvdWNoRmxhZ3M+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gICAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUG91Y2hEQiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ291Y2hEQkFkYXB0ZXJcbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ291Y2hEQkFkYXB0ZXIgZm9yIFBvdWNoREIuXG4gKiBJdCBoYW5kbGVzIGFsbCBkYXRhYmFzZSBvcGVyYXRpb25zIGxpa2UgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSAoQ1JVRCkgZm9yIGJvdGhcbiAqIHNpbmdsZSBkb2N1bWVudHMgYW5kIGJ1bGsgb3BlcmF0aW9ucy4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgaW5kZXhpbmcuXG4gKiBAdGVtcGxhdGUgRGF0YWJhc2UgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSB0eXBlXG4gKiBAdGVtcGxhdGUgUG91Y2hGbGFncyAtIFRoZSBmbGFncyBzcGVjaWZpYyB0byBQb3VjaERCIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PFBvdWNoRmxhZ3M+IC0gVGhlIGNvbnRleHQgdHlwZSB3aXRoIFBvdWNoREIgZmxhZ3NcbiAqIEBwYXJhbSB7RGF0YWJhc2V9IHNjb3BlIC0gVGhlIFBvdWNoREIgZGF0YWJhc2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBkYXRhYmFzZVxuICogQGNsYXNzIFBvdWNoQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xuICogaW1wb3J0IHsgUG91Y2hBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1wb3VjaCc7XG4gKlxuICogLy8gQ3JlYXRlIGEgbmV3IFBvdWNoREIgaW5zdGFuY2VcbiAqIGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ215LWRhdGFiYXNlJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgUG91Y2hBZGFwdGVyIHdpdGggdGhlIGRhdGFiYXNlXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFBvdWNoQWRhcHRlcihkYik7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXItMTIzJyk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gKiAgIHBhcnRpY2lwYW50IENvdWNoREJcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogbmV3IFBvdWNoQWRhcHRlcihkYilcbiAqICAgUG91Y2hBZGFwdGVyLT4+Q291Y2hEQkFkYXB0ZXI6IHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKVxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbClcbiAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICogICBQb3VjaERCLT4+Q291Y2hEQjogSFRUUCBQVVRcbiAqICAgQ291Y2hEQi0tPj5Qb3VjaERCOiBSZXNwb25zZVxuICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2VcbiAqICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkKHRhYmxlLCBpZClcbiAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KGlkKVxuICogICBQb3VjaERCLT4+Q291Y2hEQjogSFRUUCBHRVRcbiAqICAgQ291Y2hEQi0tPj5Qb3VjaERCOiBEb2N1bWVudFxuICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAqICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBvdWNoQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBEYXRhYmFzZSxcbiAgUG91Y2hGbGFncyxcbiAgQ29udGV4dDxQb3VjaEZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBEYXRhYmFzZSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgUG91Y2hGbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBvcGVyYXRpb24gZmxhZ3MgZm9yIFBvdWNoREIgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgc2V0IG9mIGZsYWdzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGEgVVVJRCBmb3IgaWRlbnRpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSB1c2VyIElEIGZyb20gdGhlIGRhdGFiYXNlIFVSTCBvciBnZW5lcmF0ZXMgYSByYW5kb20gVVVJRCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8UG91Y2hGbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBtZXJnZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3VjaEZsYWdzPn0gVGhlIGNvbXBsZXRlIHNldCBvZiBmbGFncyBmb3IgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxQb3VjaEZsYWdzPlxuICApOiBQcm9taXNlPFBvdWNoRmxhZ3M+IHtcbiAgICBsZXQgaWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgY29uc3QgdXJsID0gKHRoaXMubmF0aXZlIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBjb25zdCByZWdleHAgPSAvaHR0cHM/OlxcL1xcLyguKz8pOi4rP0AvZztcbiAgICAgIGNvbnN0IG0gPSByZWdleHAuZXhlYyh1cmwpO1xuICAgICAgaWYgKG0pIGlkID0gbVsxXTtcbiAgICB9XG4gICAgaWYgKCFpZCkge1xuICAgICAgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgVVVJRDogaWQsXG4gICAgfSkgYXMgUG91Y2hGbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgY3JlYXRlcyBpbmRleGVzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvcnMuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGdlbmVyYXRlSW5kZXhlcyB1dGlsaXR5IHRvIGNyZWF0ZSBpbmRleCBkZWZpbml0aW9ucyBhbmQgdGhlbiBjcmVhdGVzIHRoZW0gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBjcmVhdGUgaW5kZXhlcyBmb3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgaW5kZXhlcyBhcmUgY3JlYXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IENyZWF0ZUluZGV4UmVxdWVzdFtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBjb25zdCByZXM6IENyZWF0ZUluZGV4UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmNyZWF0ZUluZGV4KFxuICAgICAgICBpbmRleCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHJlc3VsdCB9ID0gcmVzO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gXCJleGlzdGluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihgSW5kZXggJHtpbmRleC5uYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIG5ldyBkb2N1bWVudCBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBwdXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBkb2N1bWVudCBkYXRhIHRvIGluc2VydFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGluc2VydCBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBtdWx0aXBsZSBkb2N1bWVudHMgaW50byB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0RvY3Mgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgYWxsIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcGFyYW0gIG1vZGVscyAtIFRoZSBkb2N1bWVudCBkYXRhIHRvIGluc2VydFxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZUFsbCh0YWJsZU5hbWUsIGlkcywgbW9kZWxzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1vZGVscylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IG9mIHJlc3BvbnNlcyB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTXVsdGlwbGVNZXRhZGF0YShtb2RlbHMsIHJldnMpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVscyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IHdpdGggZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZVtdIHwgRXJyW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MobW9kZWxzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyOiBSZXNwb25zZSB8IEVycikgPT4gKHIgYXMgUmVzcG9uc2UpLm9rKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIGRvY3VtZW50IGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGdldCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgZG9jdW1lbnQgSUQgYmFzZWQgb24gdGhlIHRhYmxlIG5hbWUgYW5kIElELCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KF9pZClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50XG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBieSB0aGVpciBJRHNcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0dldCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBkb2N1bWVudCBJRHMgYmFzZWQgb24gdGhlIHRhYmxlIG5hbWUgYW5kIElEcywgdGhlbiByZXRyaWV2ZXMgdGhlIGRvY3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByZWFkQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBCdWxrR2V0UmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhIGZvciBlYWNoIGRvY1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZXJyb3IpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0czogQnVsa0dldFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrR2V0KHtcbiAgICAgIGRvY3M6IGlkcy5tYXAoKGlkKSA9PiAoeyBpZDogdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSB9KSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBpZiAoKGQgYXMgYW55KS5lcnJvciB8fCAhKGQgYXMgYW55KS5vaylcbiAgICAgICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihcbiAgICAgICAgICAgICgoZCBhcyB7IGVycm9yOiBFcnIgfSkuZXJyb3IgYXMgRXJyb3IpIHx8XG4gICAgICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyB2YWxpZCByZXNwb25zZVwiKVxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIChkIGFzIHsgb2s6IGFueSB9KS5vayk7XG4gICAgICAgIGFjY3VtLnB1c2godGhpcy5hc3NpZ25NZXRhZGF0YShyZXN1bHQsIChkIGFzIGFueSkub2tbQ291Y2hEQktleXMuUkVWXSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIGRvY3VtZW50IGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBwdXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiB1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLnB1dChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgYnVsa0RvY3Mgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGVycm9yIHBhcnNpbmcgYW5kIGVuc3VyZXMgYWxsIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZUFsbCh0YWJsZU5hbWUsIGlkcywgbW9kZWxzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1vZGVscylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IG9mIHJlc3BvbnNlcyB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTXVsdGlwbGVNZXRhZGF0YShtb2RlbHMsIHJldnMpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVscyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEFycmF5IHdpdGggZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiAoUmVzcG9uc2UgfCBFcnIpW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MobW9kZWxzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyKSA9PiAhKHIgYXMgYW55KS5lcnJvcikpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoKGVsIGFzIGFueSkuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAkeyhlbCBhcyBhbnkpLmVycm9yfSR7KGVsIGFzIGFueSkucmVhc29uID8gYCAtICR7KGVsIGFzIGFueSkucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcmVtb3ZlIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZmlyc3QgcmV0cmlldmVzIHRoZSBkb2N1bWVudCB0byBnZXQgaXRzIHJldmlzaW9uLCB0aGVuIGRlbGV0ZXMgaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZ2V0KF9pZClcbiAgICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnQgd2l0aCBfcmV2XG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcmVtb3ZlKF9pZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogSWRNZXRhICYgR2V0TWV0YTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5yZW1vdmUoX2lkLCByZWNvcmQuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZmlyc3QgcmV0cmlldmVzIGFsbCBkb2N1bWVudHMgdG8gZ2V0IHRoZWlyIHJldmlzaW9ucywgdGhlbiBtYXJrcyB0aGVtIGFzIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXJ8YmlnaW50Pn0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGRlbGV0ZUFsbCh0YWJsZU5hbWUsIGlkcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcCBpZHMgdG8gZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtHZXQoe2RvY3N9KVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBCdWxrR2V0UmVzcG9uc2Ugd2l0aCBkb2N1bWVudHNcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcmsgZG9jdW1lbnRzIGFzIGRlbGV0ZWRcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtYXJrZWQgZG9jdW1lbnRzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogU3VjY2VzcyByZXNwb25zZXNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhIGZvciBlYWNoIGRvY1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRGVsZXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbGV0aW9uOiAoUmVzcG9uc2UgfCBFcnIpW10gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhcbiAgICAgIHJlc3VsdHMucmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5ERUxFVEVEXSA9IHRydWU7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJycyA9IGRlbGV0aW9uLmZpbHRlcigoZCkgPT4gKGQgYXMgYW55KS5lcnJvcik7XG4gICAgaWYgKGVycnMubGVuZ3RoKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJzLmpvaW4oXCJcXG5cIikpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cy5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgcikgPT4ge1xuICAgICAgci5kb2NzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgZGlyZWN0IGZpbmQgb3BlcmF0aW9uIHVzaW5nIGEgTWFuZ28gcXVlcnkgb2JqZWN0LlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgZm9yIGNvbXBsZXggcXVlcmllcyBiZXlvbmQgdGhlIHN0YW5kYXJkIENSVUQgb3BlcmF0aW9ucy5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBxdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb2Nlc3M9dHJ1ZV0gLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3BvbnNlICh0cnVlIHJldHVybnMganVzdCBkb2NzLCBmYWxzZSByZXR1cm5zIGZ1bGwgcmVzcG9uc2UpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJhdzxWPihyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBmaW5kKHJhd0lucHV0KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRmluZFJlc3BvbnNlXG4gICAqICAgICBhbHQgcHJvY2Vzcz10cnVlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IHJlc3BvbnNlLmRvY3MgYXMgVlxuICAgKiAgICAgZWxzZSBwcm9jZXNzPWZhbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IHJlc3BvbnNlIGFzIFZcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJhdzxWPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgcHJvY2VzcyA9IHRydWUpOiBQcm9taXNlPFY+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IEZpbmRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuZmluZChcbiAgICAgICAgcmF3SW5wdXQgYXMgYW55XG4gICAgICApO1xuICAgICAgaWYgKHJlc3BvbnNlLndhcm5pbmcpIGNvbnNvbGUud2FybihyZXNwb25zZS53YXJuaW5nKTtcbiAgICAgIGlmIChwcm9jZXNzKSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFY7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgY29udmVydHMgZXJyb3JzIGZyb20gUG91Y2hEQiB0byBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvcnNcbiAgICogQHN1bW1hcnkgQ29udmVydHMgUG91Y2hEQiBlcnJvcnMgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZXJyb3IgaGllcmFyY2h5LlxuICAgKiBUaGlzIGluc3RhbmNlIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIHN0YXRpYyBwYXJzZUVycm9yIG1ldGhvZC5cbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciBvYmplY3Qgb3IgbWVzc2FnZSB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBjb252ZXJ0ZWQgZXJyb3Igb2JqZWN0XG4gICAqL1xuICBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCB0byBwYXJzZSBhbmQgY29udmVydCBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkgYmFzZWQgb24gZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzLlxuICAgKiBUaGlzIG1ldGhvZCBhbmFseXplcyB0aGUgZXJyb3IgdHlwZSwgc3RhdHVzIGNvZGUsIG9yIG1lc3NhZ2UgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjbGFzcy5cbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciBvYmplY3Qgb3IgbWVzc2FnZSB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBjb252ZXJ0ZWQgZXJyb3Igb2JqZWN0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnIsIHJlYXNvbilcbiAgICogICBhbHQgZXJyIGlzIEJhc2VFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogUmV0dXJuIGVyciBhcyBpc1xuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvbnRhaW5zIFwiYWxyZWFkeSBleGlzdFwiIG9yIFwidXBkYXRlIGNvbmZsaWN0XCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBjb250YWlucyBcIm1pc3NpbmdcIiBvciBcImRlbGV0ZWRcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgc3RhdHVzXG4gICAqICAgICBhbHQgc3RhdHVzIGlzIDQwMSwgNDEyLCA0MDlcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDA0XG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVsc2Ugc3RhdHVzIGlzIDQwMFxuICAgKiAgICAgICBhbHQgbWVzc2FnZSBjb250YWlucyBcIk5vIGluZGV4IGV4aXN0c1wiXG4gICAqICAgICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW5kZXhFcnJvclxuICAgKiAgICAgICBlbHNlXG4gICAqICAgICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgbWVzc2FnZSBjb250YWlucyBcIkVDT05OUkVGVVNFRFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgICAgZWxzZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgLy8gcmV0dXJuIHN1cGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuc3RhdHVzKSB7XG4gICAgICBjb2RlID0gKGVyciBhcyBhbnkpLnN0YXR1cztcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgZGVjb3JhdGlvbnMgZm9yIFBvdWNoREItc3BlY2lmaWMgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRvcnMgZm9yIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGZpZWxkcyBpbiBtb2RlbHMuXG4gICAqIFRoaXMgbWV0aG9kIGRlZmluZXMgaG93IHRoZXNlIGZpZWxkcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBwb3B1bGF0ZWQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERlY29yYXRpb25cbiAgICpcbiAgICogICBDYWxsZXItPj5Qb3VjaEFkYXB0ZXI6IGRlY29yYXRpb24oKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlBvdWNoQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiB1cGRhdGVkQnlLZXlcbiAgICpcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5Qb3VjaEFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICpcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5Qb3VjaEFkYXB0ZXI6IERlY29yYXRvckJ1aWxkZXJcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGFwcGx5KClcbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuUG91Y2hBZGFwdGVyLnNldEN1cnJlbnQoUG91Y2hGbGF2b3VyKTtcbiIsImltcG9ydCB7IFBvdWNoQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuUG91Y2hBZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Qb3VjaFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4vLyBsZWZ0IHRvIHRoZSBlbmQgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIFR5cGVTY3JpcHQgYWRhcHRlciBmb3IgUG91Y2hEQiBpbnRlZ3JhdGlvblxuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSByZXBvc2l0b3J5IHBhdHRlcm4gaW1wbGVtZW50YXRpb24gZm9yIFBvdWNoREIsIGFsbG93aW5nIGZvciBlYXN5IGRhdGFiYXNlIG9wZXJhdGlvbnMgd2l0aCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5LiBJdCBleHBvcnRzIGNvbnN0YW50cywgcmVwb3NpdG9yeSBjbGFzc2VzLCB0eXBlcywgYW5kIGFkYXB0ZXJzIGZvciB3b3JraW5nIHdpdGggUG91Y2hEQi5cbiAqIEBtb2R1bGUgZm9yLXBvdWNoXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFja2FnZSB2ZXJzaW9uIGlkZW50aWZpZXJcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmb3ItcG91Y2ggcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7Ozs7QUFNRztBQUNJLE1BQU0sWUFBWSxHQUFHOztBQ29DNUI7Ozs7Ozs7Ozs7Ozs7OztBQWVHO0FBQ0ksZUFBZSw0QkFBNEIsQ0FNaEQsT0FBNEIsRUFDNUIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRLEVBQUE7QUFFUixJQUFBLElBQUk7UUFDRixNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN4QyxRQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQjs7O0lBRS9CLE9BQU8sQ0FBVSxFQUFFO0FBQ25CLFFBQUEsTUFBTSxJQUFJLGdCQUFnQixDQUN4QixnRUFBZ0UsQ0FDakU7O0FBRUw7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RHO0FBQ0csTUFBTyxZQUFhLFNBQVEsY0FJakMsQ0FBQTtJQUNDLFdBQVksQ0FBQSxLQUFlLEVBQUUsS0FBYyxFQUFBO0FBQ3pDLFFBQUEsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDOztBQUduQzs7Ozs7Ozs7O0FBU0c7QUFDZ0IsSUFBQSxNQUFNLEtBQUssQ0FDNUIsU0FBd0IsRUFDeEIsS0FBcUIsRUFDckIsS0FBMEIsRUFBQTtRQUUxQixJQUFJLEVBQUUsR0FBVyxFQUFFO0FBQ25CLFFBQUEsTUFBTSxHQUFHLEdBQUksSUFBSSxDQUFDLE1BQXNDLENBQUMsSUFBSTtRQUM3RCxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sTUFBTSxHQUFHLHdCQUF3QjtZQUN2QyxNQUFNLENBQUMs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
|
package/lib/adapter.cjs
CHANGED
|
@@ -618,6 +618,7 @@ class PouchAdapter extends for_couchdb_1.CouchDBAdapter {
|
|
|
618
618
|
* PouchAdapter->>Decoration: apply()
|
|
619
619
|
*/
|
|
620
620
|
static decoration() {
|
|
621
|
+
super.decoration();
|
|
621
622
|
const createdByKey = core_1.Repository.key(core_1.PersistenceKeys.CREATED_BY);
|
|
622
623
|
const updatedByKey = core_1.Repository.key(core_1.PersistenceKeys.UPDATED_BY);
|
|
623
624
|
decorator_validation_1.Decoration.flavouredAs(constants_1.PouchFlavour)
|
|
@@ -631,4 +632,5 @@ class PouchAdapter extends for_couchdb_1.CouchDBAdapter {
|
|
|
631
632
|
}
|
|
632
633
|
}
|
|
633
634
|
exports.PouchAdapter = PouchAdapter;
|
|
634
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJEQSxvRUFvQkM7QUEvRUQsNEJBQTBCO0FBQzFCLHVEQU8rQjtBQUMvQiwyREFRaUM7QUFDakMseUNBTXdCO0FBT3hCLHlFQUt3QztBQUl4QywrQ0FBMkM7QUFHM0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0ksS0FBSyxVQUFVLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQixDQUFDO1FBQ2hDLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksdUJBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsNEJBSWpDO0lBQ0MsWUFBWSxLQUFlLEVBQUUsS0FBYztRQUN6QyxLQUFLLENBQUMsS0FBSyxFQUFFLHdCQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNnQixLQUFLLENBQUMsS0FBSyxDQUM1QixTQUF3QixFQUN4QixLQUFxQixFQUNyQixLQUEwQjtRQUUxQixJQUFJLEVBQUUsR0FBVyxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLEdBQUksSUFBSSxDQUFDLE1BQXNDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQztZQUN4QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFlLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxLQUFLLENBQUMsS0FBSyxDQUNuQixHQUFHLE1BQXdCO1FBRTNCLE1BQU0sT0FBTyxHQUF5QixJQUFBLDZCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBNkIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDakUsS0FBWSxDQUNiLENBQUM7WUFDRixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLElBQUksTUFBTSxLQUFLLFVBQVU7Z0JBQ3ZCLE1BQU0sSUFBSSw2QkFBYSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FDVixTQUFpQixFQUNqQixFQUFtQixFQUNuQixLQUEwQjtRQUUxQixJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksNkJBQWEsQ0FDckIsNEJBQTRCLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FDdkQsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQXdCLEVBQ3hCLE1BQTZCO1FBRTdCLElBQUksUUFBNEIsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBaUIsRUFBRSxFQUFFLENBQUUsQ0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hELElBQUksRUFBRSxDQUFDLEtBQUs7b0JBQ1YsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDNUQsQ0FBQztnQkFDSixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLE1BQU0sSUFBSSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQ2hDLE1BQU0sRUFDTixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBYSxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLFNBQWlCLEVBQ2pCLEVBQW1CO1FBRW5CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBd0IsQ0FBQztRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQ3BCLFNBQWlCLEVBQ2pCLEdBQWlDO1FBRWpDLE1BQU0sT0FBTyxHQUF5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzlELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNuQixJQUFLLENBQVMsQ0FBQyxLQUFLLElBQUksQ0FBRSxDQUFTLENBQUMsRUFBRTtvQkFDcEMsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUN6QixDQUFvQixDQUFDLEtBQWU7d0JBQ3BDLElBQUksNkJBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUM5QyxDQUFDO2dCQUNKLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFHLENBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUcsQ0FBUyxDQUFDLEVBQUUsQ0FBQyx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDTSxLQUFLLENBQUMsTUFBTSxDQUNuQixTQUFpQixFQUNqQixFQUFtQixFQUNuQixLQUEwQjtRQUUxQixJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksNkJBQWEsQ0FDckIsNEJBQTRCLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FDdkQsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQXdCLEVBQ3hCLE1BQTZCO1FBRTdCLElBQUksUUFBNEIsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLENBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFlLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4RCxJQUFLLEVBQVUsQ0FBQyxLQUFLO29CQUNuQixLQUFLLENBQUMsSUFBSSxDQUNSLE1BQU0sQ0FBQyxLQUFNLEVBQVUsQ0FBQyxLQUFLLEdBQUksRUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTyxFQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN2RixDQUFDO2dCQUNKLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1AsTUFBTSxJQUFJLDZCQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FDaEMsTUFBTSxFQUNOLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFhLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMkJHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FDbkIsU0FBaUIsRUFDakIsRUFBbUI7UUFFbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxNQUF3QixDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQWlDO1FBRWpDLE1BQU0sT0FBTyxHQUF5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzlELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBdUIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDN0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixDQUFTLENBQUMseUJBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDdkMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksNkJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRyxDQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFHLENBQVMsQ0FBQyxFQUFFLENBQUMseUJBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUksUUFBb0IsRUFBRSxPQUFPLEdBQUcsSUFBSTtRQUMvQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBc0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDeEQsUUFBZSxDQUNoQixDQUFDO1lBQ0YsSUFBSSxRQUFRLENBQUMsT0FBTztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU87Z0JBQUUsT0FBTyxRQUFRLENBQUMsSUFBUyxDQUFDO1lBQ3ZDLE9BQU8sUUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTSxVQUFVLENBQUMsR0FBbUIsRUFBRSxNQUFlO1FBQ3RELE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNDRztJQUNILE1BQU0sQ0FBVSxVQUFVLENBQUMsR0FBbUIsRUFBRSxNQUFlO1FBQzdELHdDQUF3QztRQUN4QyxJQUFJLEdBQUcsWUFBWSx5QkFBUztZQUFFLE9BQU8sR0FBVSxDQUFDO1FBQ2hELElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksR0FBRyxHQUFHLENBQUM7WUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFBRSxPQUFPLElBQUksNkJBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSyxHQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxHQUFJLEdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDM0IsTUFBTSxHQUFHLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQztRQUVELFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDeEIsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksNkJBQWEsQ0FBQyxNQUFnQixDQUFDLENBQUM7WUFDN0MsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSw2QkFBYSxDQUFDLE1BQWdCLENBQUMsQ0FBQztZQUM3QyxLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO29CQUM3QyxPQUFPLElBQUksd0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLDZCQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztvQkFDeEMsT0FBTyxJQUFJLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNILE1BQU0sQ0FBQyxVQUFVO1FBQ2YsTUFBTSxZQUFZLEdBQUcsaUJBQVUsQ0FBQyxHQUFHLENBQUMsc0JBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxpQkFBVSxDQUFDLEdBQUcsQ0FBQyxzQkFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLGlDQUFVLENBQUMsV0FBVyxDQUFDLHdCQUFZLENBQUM7YUFDakMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixNQUFNLENBQ0wsSUFBQSx3QkFBUSxFQUFDLDRCQUE0QixDQUFDLEVBQ3RDLElBQUEsbUNBQVksRUFBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQy9CO2FBQ0EsS0FBSyxFQUFFLENBQUM7UUFDWCxpQ0FBVSxDQUFDLFdBQVcsQ0FBQyx3QkFBWSxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLElBQUEsd0JBQVEsRUFBQyw0QkFBNEIsQ0FBQyxFQUN0QyxJQUFBLG1DQUFZLEVBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBN21CRCxvQ0E2bUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJLZXlzLFxuICBDcmVhdGVJbmRleFJlcXVlc3QsXG4gIGdlbmVyYXRlSW5kZXhlcyxcbiAgSW5kZXhFcnJvcixcbiAgTWFuZ29RdWVyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBDb250ZXh0LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IERhdGFiYXNlID0gUG91Y2hEQi5EYXRhYmFzZTtcbmltcG9ydCBSZXNwb25zZSA9IFBvdWNoREIuQ29yZS5SZXNwb25zZTtcbmltcG9ydCBFcnIgPSBQb3VjaERCLkNvcmUuRXJyb3I7XG5pbXBvcnQgSWRNZXRhID0gUG91Y2hEQi5Db3JlLklkTWV0YTtcbmltcG9ydCBHZXRNZXRhID0gUG91Y2hEQi5Db3JlLkdldE1ldGE7XG5pbXBvcnQgQ3JlYXRlSW5kZXhSZXNwb25zZSA9IFBvdWNoREIuRmluZC5DcmVhdGVJbmRleFJlc3BvbnNlO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCBCdWxrR2V0UmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuQnVsa0dldFJlc3BvbnNlO1xuaW1wb3J0IEZpbmRSZXNwb25zZSA9IFBvdWNoREIuRmluZC5GaW5kUmVzcG9uc2U7XG5pbXBvcnQgeyBQb3VjaEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBvdWNoRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUG91Y2hSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUG91Y2hSZXBvc2l0b3J5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0b3IgSUQgb24gYSBtb2RlbCBkdXJpbmcgY3JlYXRpb24gb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGRlY29yYXRvciBoYW5kbGVyIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBjcmVhdG9yIElEIGZpZWxkIG9uIGEgbW9kZWxcbiAqIHdoZW4gaXQncyBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWQuIEl0IGV4dHJhY3RzIHRoZSBVVUlEIGZyb20gdGhlIGNvbnRleHQgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIHNwZWNpZmllZCBrZXkuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIHRoYXQgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIHRoYXQgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxQb3VjaEZsYWdzPn0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIGZsYWdzXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIG1vZGlmeVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItcG91Y2hcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFBvdWNoUmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxQb3VjaEZsYWdzPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXVpZDogc3RyaW5nID0gY29udGV4dC5nZXQoXCJVVUlEXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1dWlkIGFzIE1ba2V5b2YgTV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIk5vIFVzZXIgZm91bmQgaW4gY29udGV4dC4gUGxlYXNlIHByb3ZpZGUgYSB1c2VyIGluIHRoZSBjb250ZXh0XCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvdWNoREIgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvdWNoREJBZGFwdGVyXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvdWNoREJBZGFwdGVyIGZvciBQb3VjaERCLlxuICogSXQgaGFuZGxlcyBhbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBsaWtlIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUgKENSVUQpIGZvciBib3RoXG4gKiBzaW5nbGUgZG9jdW1lbnRzIGFuZCBidWxrIG9wZXJhdGlvbnMuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIGluZGV4aW5nLlxuICogQHRlbXBsYXRlIERhdGFiYXNlIC0gVGhlIFBvdWNoREIgZGF0YWJhc2UgdHlwZVxuICogQHRlbXBsYXRlIFBvdWNoRmxhZ3MgLSBUaGUgZmxhZ3Mgc3BlY2lmaWMgdG8gUG91Y2hEQiBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dDxQb3VjaEZsYWdzPiAtIFRoZSBjb250ZXh0IHR5cGUgd2l0aCBQb3VjaERCIGZsYWdzXG4gKiBAcGFyYW0ge0RhdGFiYXNlfSBzY29wZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgZGF0YWJhc2VcbiAqIEBjbGFzcyBQb3VjaEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbiAqIGltcG9ydCB7IFBvdWNoQWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9mb3ItcG91Y2gnO1xuICpcbiAqIC8vIENyZWF0ZSBhIG5ldyBQb3VjaERCIGluc3RhbmNlXG4gKiBjb25zdCBkYiA9IG5ldyBQb3VjaERCKCdteS1kYXRhYmFzZScpO1xuICpcbiAqIC8vIENyZWF0ZSBhIFBvdWNoQWRhcHRlciB3aXRoIHRoZSBkYXRhYmFzZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3VjaEFkYXB0ZXIoZGIpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYWRhcHRlci5yZWFkKCd1c2VycycsICd1c2VyLTEyMycpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICogICBwYXJ0aWNpcGFudCBDb3VjaERCXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IG5ldyBQb3VjaEFkYXB0ZXIoZGIpXG4gKiAgIFBvdWNoQWRhcHRlci0+PkNvdWNoREJBZGFwdGVyOiBzdXBlcihzY29wZSwgUG91Y2hGbGF2b3VyLCBhbGlhcylcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwpXG4gKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAqICAgUG91Y2hEQi0+PkNvdWNoREI6IEhUVFAgUFVUXG4gKiAgIENvdWNoREItLT4+UG91Y2hEQjogUmVzcG9uc2VcbiAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxcbiAqXG4gKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZCh0YWJsZSwgaWQpXG4gKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChpZClcbiAqICAgUG91Y2hEQi0+PkNvdWNoREI6IEhUVFAgR0VUXG4gKiAgIENvdWNoREItLT4+UG91Y2hEQjogRG9jdW1lbnRcbiAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50XG4gKiAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3VjaEFkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlcjxcbiAgRGF0YWJhc2UsXG4gIFBvdWNoRmxhZ3MsXG4gIENvbnRleHQ8UG91Y2hGbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogRGF0YWJhc2UsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgb3BlcmF0aW9uIGZsYWdzIGZvciBQb3VjaERCIG9wZXJhdGlvbnNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBmbGFncyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24sIGluY2x1ZGluZyBhIFVVSUQgZm9yIGlkZW50aWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgdXNlciBJRCBmcm9tIHRoZSBkYXRhYmFzZSBVUkwgb3IgZ2VuZXJhdGVzIGEgcmFuZG9tIFVVSUQgaWYgbm90IGF2YWlsYWJsZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPFBvdWNoRmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gYmUgbWVyZ2VkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UG91Y2hGbGFncz59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3MgZm9yIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UG91Y2hGbGFncz5cbiAgKTogUHJvbWlzZTxQb3VjaEZsYWdzPiB7XG4gICAgbGV0IGlkOiBzdHJpbmcgPSBcIlwiO1xuICAgIGNvbnN0IHVybCA9ICh0aGlzLm5hdGl2ZSBhcyB1bmtub3duIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgcmVnZXhwID0gL2h0dHBzPzpcXC9cXC8oLis/KTouKz9AL2c7XG4gICAgICBjb25zdCBtID0gcmVnZXhwLmV4ZWModXJsKTtcbiAgICAgIGlmIChtKSBpZCA9IG1bMV07XG4gICAgfVxuICAgIGlmICghaWQpIHtcbiAgICAgIGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IGlkLFxuICAgIH0pIGFzIFBvdWNoRmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgZGF0YWJhc2UgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYW5kIGNyZWF0ZXMgaW5kZXhlcyBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwgY29uc3RydWN0b3JzLlxuICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBnZW5lcmF0ZUluZGV4ZXMgdXRpbGl0eSB0byBjcmVhdGUgaW5kZXggZGVmaW5pdGlvbnMgYW5kIHRoZW4gY3JlYXRlcyB0aGVtIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBDcmVhdGVJbmRleFJlcXVlc3RbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgY29uc3QgcmVzOiBDcmVhdGVJbmRleFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5jcmVhdGVJbmRleChcbiAgICAgICAgaW5kZXggYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyByZXN1bHQgfSA9IHJlcztcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiZXhpc3RpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYEluZGV4ICR7aW5kZXgubmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgYSBuZXcgZG9jdW1lbnQgaW50byB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcHV0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgZG9jdW1lbnQgZGF0YSB0byBpbnNlcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogcHV0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogUmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLnB1dChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbnNlcnQgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgZG9jdW1lbnRzIGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtEb2NzIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIGFsbCBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHBhcmFtICBtb2RlbHMgLSBUaGUgZG9jdW1lbnQgZGF0YSB0byBpbnNlcnRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVBbGwodGFibGVOYW1lLCBpZHMsIG1vZGVscylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtb2RlbHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSBvZiByZXNwb25zZXMgd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk11bHRpcGxlTWV0YWRhdGEobW9kZWxzLCByZXZzKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSB3aXRoIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2VbXSB8IEVycltdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKG1vZGVscyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocjogUmVzcG9uc2UgfCBFcnIpID0+IChyIGFzIFJlc3BvbnNlKS5vaykpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoZWwuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAke2VsLmVycm9yfSR7ZWwucmVhc29uID8gYCAtICR7ZWwucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBnZXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGRvY3VtZW50IElEIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lIGFuZCBJRCwgdGhlbiByZXRyaWV2ZXMgdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChfaWQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogSWRNZXRhICYgR2V0TWV0YTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtHZXQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgZG9jdW1lbnQgSURzIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lIGFuZCBJRHMsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXJ8YmlnaW50Pn0gaWRzIC0gVGhlIGRvY3VtZW50IElEc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmVhZEFsbCh0YWJsZU5hbWUsIGlkcylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IE1hcCBpZHMgdG8gZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtHZXQoe2RvY3N9KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQnVsa0dldFJlc3BvbnNlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YSBmb3IgZWFjaCBkb2NcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVycm9yKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IHJlc3VsdHMucmVzdWx0cy5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgcikgPT4ge1xuICAgICAgci5kb2NzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgaWYgKChkIGFzIGFueSkuZXJyb3IgfHwgIShkIGFzIGFueSkub2spXG4gICAgICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoXG4gICAgICAgICAgICAoKGQgYXMgeyBlcnJvcjogRXJyIH0pLmVycm9yIGFzIEVycm9yKSB8fFxuICAgICAgICAgICAgICBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgdmFsaWQgcmVzcG9uc2VcIilcbiAgICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSBkb2N1bWVudCBpbiB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgcHV0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IElEXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bGtEb2NzIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBlcnJvciBwYXJzaW5nIGFuZCBlbnN1cmVzIGFsbCBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHBhcmFtIG1vZGVscyAtIFRoZSB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiB1cGRhdGVBbGwodGFibGVOYW1lLCBpZHMsIG1vZGVscylcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrRG9jcyhtb2RlbHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSBvZiByZXNwb25zZXMgd2l0aCBvaz10cnVlXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGFzc2lnbk11bHRpcGxlTWV0YWRhdGEobW9kZWxzLCByZXZzKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBBcnJheSB3aXRoIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogKFJlc3BvbnNlIHwgRXJyKVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKG1vZGVscyk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIShyIGFzIGFueSkuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKChlbCBhcyBhbnkpLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHsoZWwgYXMgYW55KS5lcnJvcn0keyhlbCBhcyBhbnkpLnJlYXNvbiA/IGAgLSAkeyhlbCBhcyBhbnkpLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIGRvY3VtZW50IGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHJlbW92ZSBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGZpcnN0IHJldHJpZXZlcyB0aGUgZG9jdW1lbnQgdG8gZ2V0IGl0cyByZXZpc2lvbiwgdGhlbiBkZWxldGVzIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGdldChfaWQpXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IERvY3VtZW50IHdpdGggX3JldlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHJlbW92ZShfaWQsIHJlY29yZC5fcmV2KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogU3VjY2VzcyByZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogRGVsZXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgICAgYXdhaXQgdGhpcy5uYXRpdmUucmVtb3ZlKF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBieSB0aGVpciBJRHNcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSBpbiBhIHNpbmdsZSBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGZpcnN0IHJldHJpZXZlcyBhbGwgZG9jdW1lbnRzIHRvIGdldCB0aGVpciByZXZpc2lvbnMsIHRoZW4gbWFya3MgdGhlbSBhcyBkZWxldGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGVBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQnVsa0dldFJlc3BvbnNlIHdpdGggZG9jdW1lbnRzXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXJrIGRvY3VtZW50cyBhcyBkZWxldGVkXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobWFya2VkIGRvY3VtZW50cylcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YSBmb3IgZWFjaCBkb2NcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IENoZWNrIGZvciBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0czogQnVsa0dldFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrR2V0KHtcbiAgICAgIGRvY3M6IGlkcy5tYXAoKGlkKSA9PiAoeyBpZDogdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSB9KSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWxldGlvbjogKFJlc3BvbnNlIHwgRXJyKVtdID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0RvY3MoXG4gICAgICByZXN1bHRzLnJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgIChyIGFzIGFueSlbQ291Y2hEQktleXMuREVMRVRFRF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGVycnMgPSBkZWxldGlvbi5maWx0ZXIoKGQpID0+IChkIGFzIGFueSkuZXJyb3IpO1xuICAgIGlmIChlcnJzLmxlbmd0aCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJycy5qb2luKFwiXFxuXCIpKTtcblxuICAgIHJldHVybiByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIChkIGFzIHsgb2s6IGFueSB9KS5vayk7XG4gICAgICAgIGFjY3VtLnB1c2godGhpcy5hc3NpZ25NZXRhZGF0YShyZXN1bHQsIChkIGFzIGFueSkub2tbQ291Y2hEQktleXMuUkVWXSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIGRpcmVjdCBmaW5kIG9wZXJhdGlvbiB1c2luZyBhIE1hbmdvIHF1ZXJ5IG9iamVjdC5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBjb21wbGV4IHF1ZXJpZXMgYmV5b25kIHRoZSBzdGFuZGFyZCBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9jZXNzPXRydWVdIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXNwb25zZSAodHJ1ZSByZXR1cm5zIGp1c3QgZG9jcywgZmFsc2UgcmV0dXJucyBmdWxsIHJlc3BvbnNlKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiByYXc8Vj4ocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogZmluZChyYXdJbnB1dClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEZpbmRSZXNwb25zZVxuICAgKiAgICAgYWx0IHByb2Nlc3M9dHJ1ZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiByZXNwb25zZS5kb2NzIGFzIFZcbiAgICogICAgIGVsc2UgcHJvY2Vzcz1mYWxzZVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiByZXNwb25zZSBhcyBWXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByYXc8Vj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIHByb2Nlc3MgPSB0cnVlKTogUHJvbWlzZTxWPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBGaW5kUmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmZpbmQoXG4gICAgICAgIHJhd0lucHV0IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGlmIChyZXNwb25zZS53YXJuaW5nKSBjb25zb2xlLndhcm4ocmVzcG9uc2Uud2FybmluZyk7XG4gICAgICBpZiAocHJvY2VzcykgcmV0dXJuIHJlc3BvbnNlLmRvY3MgYXMgVjtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBWO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeS5cbiAgICogVGhpcyBpbnN0YW5jZSBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBzdGF0aWMgcGFyc2VFcnJvciBtZXRob2QuXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3Igb2JqZWN0IG9yIG1lc3NhZ2UgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgY29udmVydGVkIGVycm9yIG9iamVjdFxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBQb3VjaEFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW5kIGNvbnZlcnQgZXJyb3JzIGZyb20gUG91Y2hEQiB0byBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvcnNcbiAgICogQHN1bW1hcnkgQ29udmVydHMgUG91Y2hEQiBlcnJvcnMgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZXJyb3IgaGllcmFyY2h5IGJhc2VkIG9uIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cbiAgICogVGhpcyBtZXRob2QgYW5hbHl6ZXMgdGhlIGVycm9yIHR5cGUsIHN0YXR1cyBjb2RlLCBvciBtZXNzYWdlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY2xhc3MuXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3Igb2JqZWN0IG9yIG1lc3NhZ2UgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgY29udmVydGVkIGVycm9yIG9iamVjdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICpcbiAgICogICBDYWxsZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZXJyLCByZWFzb24pXG4gICAqICAgYWx0IGVyciBpcyBCYXNlRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IFJldHVybiBlcnIgYXMgaXNcbiAgICogICBlbHNlIGVyciBpcyBzdHJpbmdcbiAgICogICAgIGFsdCBjb250YWlucyBcImFscmVhZHkgZXhpc3RcIiBvciBcInVwZGF0ZSBjb25mbGljdFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29udGFpbnMgXCJtaXNzaW5nXCIgb3IgXCJkZWxldGVkXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBlcnIgaGFzIHN0YXR1c1xuICAgKiAgICAgYWx0IHN0YXR1cyBpcyA0MDEsIDQxMiwgNDA5XG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2Ugc3RhdHVzIGlzIDQwNFxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDBcbiAgICogICAgICAgYWx0IG1lc3NhZ2UgY29udGFpbnMgXCJObyBpbmRleCBleGlzdHNcIlxuICAgKiAgICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEluZGV4RXJyb3JcbiAgICogICAgICAgZWxzZVxuICAgKiAgICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG1lc3NhZ2UgY29udGFpbnMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25uZWN0aW9uRXJyb3JcbiAgICogICAgIGVsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIC8vIHJldHVybiBzdXBlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIGFueTtcbiAgICBsZXQgY29kZTogc3RyaW5nID0gXCJcIjtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29kZSA9IGVycjtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9hbHJlYWR5IGV4aXN0fHVwZGF0ZSBjb25mbGljdC9nKSlcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGNvZGUpO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL21pc3Npbmd8ZGVsZXRlZC9nKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpO1xuICAgIH0gZWxzZSBpZiAoKGVyciBhcyBhbnkpLnN0YXR1cykge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5zdGF0dXM7XG4gICAgICByZWFzb24gPSByZWFzb24gfHwgZXJyLm1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSBlcnIubWVzc2FnZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgY2FzZSBcIjQwMVwiOlxuICAgICAgY2FzZSBcIjQxMlwiOlxuICAgICAgY2FzZSBcIjQwOVwiOlxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDA0XCI6XG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDBcIjpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvTm9cXHNpbmRleFxcc2V4aXN0cy9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9FQ09OTlJFRlVTRUQvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIGRlY29yYXRpb25zIGZvciBQb3VjaERCLXNwZWNpZmljIG1vZGVsIHByb3BlcnRpZXNcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBkZWNvcmF0b3JzIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gbW9kZWxzLlxuICAgKiBUaGlzIG1ldGhvZCBkZWZpbmVzIGhvdyB0aGVzZSBmaWVsZHMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEZWNvcmF0aW9uXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBkZWNvcmF0aW9uKClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZWRCeUtleVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlBvdWNoQWRhcHRlcjogdXBkYXRlZEJ5S2V5XG4gICAqXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UG91Y2hBZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKGNyZWF0ZWRCeUtleSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UG91Y2hBZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZm9yKHVwZGF0ZWRCeUtleSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqL1xuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cbiJdfQ==
|
|
635
|
+
PouchAdapter.setCurrent(constants_1.PouchFlavour);
|
|
636
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJEQSxvRUFvQkM7QUEvRUQsNEJBQTBCO0FBQzFCLHVEQU8rQjtBQUMvQiwyREFRaUM7QUFDakMseUNBTXdCO0FBT3hCLHlFQUt3QztBQUl4QywrQ0FBMkM7QUFHM0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0ksS0FBSyxVQUFVLDRCQUE0QixDQU1oRCxPQUE0QixFQUM1QixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQixDQUFDO1FBQ2hDLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksdUJBQWdCLENBQ3hCLGdFQUFnRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsNEJBSWpDO0lBQ0MsWUFBWSxLQUFlLEVBQUUsS0FBYztRQUN6QyxLQUFLLENBQUMsS0FBSyxFQUFFLHdCQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNnQixLQUFLLENBQUMsS0FBSyxDQUM1QixTQUF3QixFQUN4QixLQUFxQixFQUNyQixLQUEwQjtRQUUxQixJQUFJLEVBQUUsR0FBVyxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLEdBQUksSUFBSSxDQUFDLE1BQXNDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQztZQUN4QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFlLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxLQUFLLENBQUMsS0FBSyxDQUNuQixHQUFHLE1BQXdCO1FBRTNCLE1BQU0sT0FBTyxHQUF5QixJQUFBLDZCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBNkIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDakUsS0FBWSxDQUNiLENBQUM7WUFDRixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLElBQUksTUFBTSxLQUFLLFVBQVU7Z0JBQ3ZCLE1BQU0sSUFBSSw2QkFBYSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FDVixTQUFpQixFQUNqQixFQUFtQixFQUNuQixLQUEwQjtRQUUxQixJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksNkJBQWEsQ0FDckIsNEJBQTRCLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FDdkQsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQXdCLEVBQ3hCLE1BQTZCO1FBRTdCLElBQUksUUFBNEIsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBaUIsRUFBRSxFQUFFLENBQUUsQ0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hELElBQUksRUFBRSxDQUFDLEtBQUs7b0JBQ1YsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDNUQsQ0FBQztnQkFDSixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLE1BQU0sSUFBSSw2QkFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQ2hDLE1BQU0sRUFDTixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBYSxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLFNBQWlCLEVBQ2pCLEVBQW1CO1FBRW5CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBd0IsQ0FBQztRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQ3BCLFNBQWlCLEVBQ2pCLEdBQWlDO1FBRWpDLE1BQU0sT0FBTyxHQUF5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzlELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNuQixJQUFLLENBQVMsQ0FBQyxLQUFLLElBQUksQ0FBRSxDQUFTLENBQUMsRUFBRTtvQkFDcEMsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUN6QixDQUFvQixDQUFDLEtBQWU7d0JBQ3BDLElBQUksNkJBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUM5QyxDQUFDO2dCQUNKLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFHLENBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUcsQ0FBUyxDQUFDLEVBQUUsQ0FBQyx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDTSxLQUFLLENBQUMsTUFBTSxDQUNuQixTQUFpQixFQUNqQixFQUFtQixFQUNuQixLQUEwQjtRQUUxQixJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksNkJBQWEsQ0FDckIsNEJBQTRCLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FDdkQsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQXdCLEVBQ3hCLE1BQTZCO1FBRTdCLElBQUksUUFBNEIsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLENBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFlLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4RCxJQUFLLEVBQVUsQ0FBQyxLQUFLO29CQUNuQixLQUFLLENBQUMsSUFBSSxDQUNSLE1BQU0sQ0FBQyxLQUFNLEVBQVUsQ0FBQyxLQUFLLEdBQUksRUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTyxFQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN2RixDQUFDO2dCQUNKLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1AsTUFBTSxJQUFJLDZCQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FDaEMsTUFBTSxFQUNOLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFhLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMkJHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FDbkIsU0FBaUIsRUFDakIsRUFBbUI7UUFFbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxNQUF3QixDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQWlDO1FBRWpDLE1BQU0sT0FBTyxHQUF5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzlELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBdUIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDN0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixDQUFTLENBQUMseUJBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDdkMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksNkJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRyxDQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFHLENBQVMsQ0FBQyxFQUFFLENBQUMseUJBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUksUUFBb0IsRUFBRSxPQUFPLEdBQUcsSUFBSTtRQUMvQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBc0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDeEQsUUFBZSxDQUNoQixDQUFDO1lBQ0YsSUFBSSxRQUFRLENBQUMsT0FBTztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU87Z0JBQUUsT0FBTyxRQUFRLENBQUMsSUFBUyxDQUFDO1lBQ3ZDLE9BQU8sUUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTSxVQUFVLENBQUMsR0FBbUIsRUFBRSxNQUFlO1FBQ3RELE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNDRztJQUNILE1BQU0sQ0FBVSxVQUFVLENBQUMsR0FBbUIsRUFBRSxNQUFlO1FBQzdELHdDQUF3QztRQUN4QyxJQUFJLEdBQUcsWUFBWSx5QkFBUztZQUFFLE9BQU8sR0FBVSxDQUFDO1FBQ2hELElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksR0FBRyxHQUFHLENBQUM7WUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFBRSxPQUFPLElBQUksNkJBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSyxHQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxHQUFJLEdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDM0IsTUFBTSxHQUFHLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQztRQUVELFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDeEIsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksNkJBQWEsQ0FBQyxNQUFnQixDQUFDLENBQUM7WUFDN0MsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSw2QkFBYSxDQUFDLE1BQWdCLENBQUMsQ0FBQztZQUM3QyxLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO29CQUM3QyxPQUFPLElBQUksd0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLDZCQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztvQkFDeEMsT0FBTyxJQUFJLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNILE1BQU0sQ0FBVSxVQUFVO1FBQ3hCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixNQUFNLFlBQVksR0FBRyxpQkFBVSxDQUFDLEdBQUcsQ0FBQyxzQkFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sWUFBWSxHQUFHLGlCQUFVLENBQUMsR0FBRyxDQUFDLHNCQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsaUNBQVUsQ0FBQyxXQUFXLENBQUMsd0JBQVksQ0FBQzthQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxJQUFBLHdCQUFRLEVBQUMsNEJBQTRCLENBQUMsRUFDdEMsSUFBQSxtQ0FBWSxFQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztRQUNYLGlDQUFVLENBQUMsV0FBVyxDQUFDLHdCQUFZLENBQUM7YUFDakMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixNQUFNLENBQ0wsSUFBQSx3QkFBUSxFQUFDLDRCQUE0QixDQUFDLEVBQ3RDLElBQUEsbUNBQVksRUFBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQy9CO2FBQ0EsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUE5bUJELG9DQThtQkM7QUFFRCxZQUFZLENBQUMsVUFBVSxDQUFDLHdCQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIEluZGV4RXJyb3IsXG4gIE1hbmdvUXVlcnksXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBEYXRhYmFzZSA9IFBvdWNoREIuRGF0YWJhc2U7XG5pbXBvcnQgUmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuUmVzcG9uc2U7XG5pbXBvcnQgRXJyID0gUG91Y2hEQi5Db3JlLkVycm9yO1xuaW1wb3J0IElkTWV0YSA9IFBvdWNoREIuQ29yZS5JZE1ldGE7XG5pbXBvcnQgR2V0TWV0YSA9IFBvdWNoREIuQ29yZS5HZXRNZXRhO1xuaW1wb3J0IENyZWF0ZUluZGV4UmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuQ3JlYXRlSW5kZXhSZXNwb25zZTtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgQnVsa0dldFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLkJ1bGtHZXRSZXNwb25zZTtcbmltcG9ydCBGaW5kUmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuRmluZFJlc3BvbnNlO1xuaW1wb3J0IHsgUG91Y2hGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQb3VjaEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBvdWNoUmVwb3NpdG9yeSB9IGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIElEIG9uIGEgbW9kZWwgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBkZWNvcmF0b3IgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRvciBJRCBmaWVsZCBvbiBhIG1vZGVsXG4gKiB3aGVuIGl0J3MgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLiBJdCBleHRyYWN0cyB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSB0aGF0IGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8UG91Y2hGbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyBmbGFnc1xuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBtb2RpZnlcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3VjaERCIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlclxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlciBmb3IgUG91Y2hEQi5cbiAqIEl0IGhhbmRsZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgbGlrZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlIChDUlVEKSBmb3IgYm90aFxuICogc2luZ2xlIGRvY3VtZW50cyBhbmQgYnVsayBvcGVyYXRpb25zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBpbmRleGluZy5cbiAqIEB0ZW1wbGF0ZSBEYXRhYmFzZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBQb3VjaEZsYWdzIC0gVGhlIGZsYWdzIHNwZWNpZmljIHRvIFBvdWNoREIgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8UG91Y2hGbGFncz4gLSBUaGUgY29udGV4dCB0eXBlIHdpdGggUG91Y2hEQiBmbGFnc1xuICogQHBhcmFtIHtEYXRhYmFzZX0gc2NvcGUgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGRhdGFiYXNlXG4gKiBAY2xhc3MgUG91Y2hBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG4gKiBpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLXBvdWNoJztcbiAqXG4gKiAvLyBDcmVhdGUgYSBuZXcgUG91Y2hEQiBpbnN0YW5jZVxuICogY29uc3QgZGIgPSBuZXcgUG91Y2hEQignbXktZGF0YWJhc2UnKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBQb3VjaEFkYXB0ZXIgd2l0aCB0aGUgZGF0YWJhc2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG91Y2hBZGFwdGVyKGRiKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlci0xMjMnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBuZXcgUG91Y2hBZGFwdGVyKGRiKVxuICogICBQb3VjaEFkYXB0ZXItPj5Db3VjaERCQWRhcHRlcjogc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIFBVVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZVxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGUsIGlkKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoaWQpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIEdFVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IERvY3VtZW50XG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgUG91Y2hEQiBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBVVUlEIGZvciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgZGF0YWJhc2UgVVJMIG9yIGdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxQb3VjaEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIG1lcmdlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvdWNoRmxhZ3M+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFBvdWNoRmxhZ3M+XG4gICk6IFByb21pc2U8UG91Y2hGbGFncz4ge1xuICAgIGxldCBpZDogc3RyaW5nID0gXCJcIjtcbiAgICBjb25zdCB1cmwgPSAodGhpcy5uYXRpdmUgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IC9odHRwcz86XFwvXFwvKC4rPyk6Lis/QC9nO1xuICAgICAgY29uc3QgbSA9IHJlZ2V4cC5leGVjKHVybCk7XG4gICAgICBpZiAobSkgaWQgPSBtWzFdO1xuICAgIH1cbiAgICBpZiAoIWlkKSB7XG4gICAgICBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiBpZCxcbiAgICB9KSBhcyBQb3VjaEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9ycy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2VuZXJhdGVJbmRleGVzIHV0aWxpdHkgdG8gY3JlYXRlIGluZGV4IGRlZmluaXRpb25zIGFuZCB0aGVuIGNyZWF0ZXMgdGhlbSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IGRvY3VtZW50IGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSAgbW9kZWxzIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgZ2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudCBJRCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSUQsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrR2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGRvY3VtZW50IElEcyBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSURzLCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWRBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnJvcilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICgoZCBhcyBhbnkpLmVycm9yIHx8ICEoZCBhcyBhbnkpLm9rKVxuICAgICAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKFxuICAgICAgICAgICAgKChkIGFzIHsgZXJyb3I6IEVyciB9KS5lcnJvciBhcyBFcnJvcikgfHxcbiAgICAgICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIHZhbGlkIHJlc3BvbnNlXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IChSZXNwb25zZSB8IEVycilbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICEociBhcyBhbnkpLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmICgoZWwgYXMgYW55KS5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7KGVsIGFzIGFueSkuZXJyb3J9JHsoZWwgYXMgYW55KS5yZWFzb24gPyBgIC0gJHsoZWwgYXMgYW55KS5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSByZW1vdmUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHRvIGdldCBpdHMgcmV2aXNpb24sIHRoZW4gZGVsZXRlcyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudCB3aXRoIF9yZXZcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiByZW1vdmUoX2lkLCByZWNvcmQuX3JldilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLnJlbW92ZShfaWQsIHJlY29yZC5fcmV2KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgYWxsIGRvY3VtZW50cyB0byBnZXQgdGhlaXIgcmV2aXNpb25zLCB0aGVuIG1hcmtzIHRoZW0gYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZSB3aXRoIGRvY3VtZW50c1xuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFyayBkb2N1bWVudHMgYXMgZGVsZXRlZFxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1hcmtlZCBkb2N1bWVudHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBkaXJlY3QgZmluZCBvcGVyYXRpb24gdXNpbmcgYSBNYW5nbyBxdWVyeSBvYmplY3QuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgY29tcGxleCBxdWVyaWVzIGJleW9uZCB0aGUgc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbcHJvY2Vzcz10cnVlXSAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgKHRydWUgcmV0dXJucyBqdXN0IGRvY3MsIGZhbHNlIHJldHVybnMgZnVsbCByZXNwb25zZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmF3PFY+KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGZpbmQocmF3SW5wdXQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBGaW5kUmVzcG9uc2VcbiAgICogICAgIGFsdCBwcm9jZXNzPXRydWVcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UuZG9jcyBhcyBWXG4gICAqICAgICBlbHNlIHByb2Nlc3M9ZmFsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UgYXMgVlxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzID0gdHJ1ZSk6IFByb21pc2U8Vj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogRmluZFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKFxuICAgICAgICByYXdJbnB1dCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkuXG4gICAqIFRoaXMgaW5zdGFuY2UgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgc3RhdGljIHBhcnNlRXJyb3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeSBiYXNlZCBvbiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFuYWx5emVzIHRoZSBlcnJvciB0eXBlLCBzdGF0dXMgY29kZSwgb3IgbWVzc2FnZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVyciwgcmVhc29uKVxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBSZXR1cm4gZXJyIGFzIGlzXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBhbHQgY29udGFpbnMgXCJhbHJlYWR5IGV4aXN0XCIgb3IgXCJ1cGRhdGUgY29uZmxpY3RcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvbnRhaW5zIFwibWlzc2luZ1wiIG9yIFwiZGVsZXRlZFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBzdGF0dXNcbiAgICogICAgIGFsdCBzdGF0dXMgaXMgNDAxLCA0MTIsIDQwOVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDRcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDAwXG4gICAqICAgICAgIGFsdCBtZXNzYWdlIGNvbnRhaW5zIFwiTm8gaW5kZXggZXhpc3RzXCJcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgICAgIGVsc2VcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBtZXNzYWdlIGNvbnRhaW5zIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICAvLyByZXR1cm4gc3VwZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5zdGF0dXMpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgUG91Y2hEQi1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIG1vZGVscy5cbiAgICogVGhpcyBtZXRob2QgZGVmaW5lcyBob3cgdGhlc2UgZmllbGRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogZGVjb3JhdGlvbigpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5Qb3VjaEFkYXB0ZXIuc2V0Q3VycmVudChQb3VjaEZsYXZvdXIpO1xuIl19
|
package/lib/esm/adapter.js
CHANGED
|
@@ -614,6 +614,7 @@ export class PouchAdapter extends CouchDBAdapter {
|
|
|
614
614
|
* PouchAdapter->>Decoration: apply()
|
|
615
615
|
*/
|
|
616
616
|
static decoration() {
|
|
617
|
+
super.decoration();
|
|
617
618
|
const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
|
|
618
619
|
const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
|
|
619
620
|
Decoration.flavouredAs(PouchFlavour)
|
|
@@ -626,4 +627,5 @@ export class PouchAdapter extends CouchDBAdapter {
|
|
|
626
627
|
.apply();
|
|
627
628
|
}
|
|
628
629
|
}
|
|
629
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEVBRVgsZUFBZSxFQUNmLFVBQVUsR0FFWCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUViLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxHQUVULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBRWYsVUFBVSxFQUNWLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFFTCxVQUFVLEVBRVYsWUFBWSxHQUNiLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBb0I7QUFHM0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEIsQ0FNaEQsT0FBNEIsRUFDNUIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRO0lBRVIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBa0IsQ0FBQztRQUNoQyw2REFBNkQ7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLGdCQUFnQixDQUN4QixnRUFBZ0UsQ0FDakUsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsY0FJakM7SUFDQyxZQUFZLEtBQWUsRUFBRSxLQUFjO1FBQ3pDLEtBQUss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LElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNILE1BQU0sQ0FBQyxVQUFVO1FBQ2YsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDakMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixNQUFNLENBQ0wsUUFBUSxDQUFDLDRCQUE0QixDQUFDLEVBQ3RDLFlBQVksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQy9CO2FBQ0EsS0FBSyxFQUFFLENBQUM7UUFDWCxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFDdEMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIEluZGV4RXJyb3IsXG4gIE1hbmdvUXVlcnksXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBEYXRhYmFzZSA9IFBvdWNoREIuRGF0YWJhc2U7XG5pbXBvcnQgUmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuUmVzcG9uc2U7XG5pbXBvcnQgRXJyID0gUG91Y2hEQi5Db3JlLkVycm9yO1xuaW1wb3J0IElkTWV0YSA9IFBvdWNoREIuQ29yZS5JZE1ldGE7XG5pbXBvcnQgR2V0TWV0YSA9IFBvdWNoREIuQ29yZS5HZXRNZXRhO1xuaW1wb3J0IENyZWF0ZUluZGV4UmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuQ3JlYXRlSW5kZXhSZXNwb25zZTtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgQnVsa0dldFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLkJ1bGtHZXRSZXNwb25zZTtcbmltcG9ydCBGaW5kUmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuRmluZFJlc3BvbnNlO1xuaW1wb3J0IHsgUG91Y2hGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQb3VjaEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBvdWNoUmVwb3NpdG9yeSB9IGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIElEIG9uIGEgbW9kZWwgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBkZWNvcmF0b3IgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRvciBJRCBmaWVsZCBvbiBhIG1vZGVsXG4gKiB3aGVuIGl0J3MgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLiBJdCBleHRyYWN0cyB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSB0aGF0IGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8UG91Y2hGbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyBmbGFnc1xuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBtb2RpZnlcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3VjaERCIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlclxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlciBmb3IgUG91Y2hEQi5cbiAqIEl0IGhhbmRsZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgbGlrZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlIChDUlVEKSBmb3IgYm90aFxuICogc2luZ2xlIGRvY3VtZW50cyBhbmQgYnVsayBvcGVyYXRpb25zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBpbmRleGluZy5cbiAqIEB0ZW1wbGF0ZSBEYXRhYmFzZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBQb3VjaEZsYWdzIC0gVGhlIGZsYWdzIHNwZWNpZmljIHRvIFBvdWNoREIgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8UG91Y2hGbGFncz4gLSBUaGUgY29udGV4dCB0eXBlIHdpdGggUG91Y2hEQiBmbGFnc1xuICogQHBhcmFtIHtEYXRhYmFzZX0gc2NvcGUgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGRhdGFiYXNlXG4gKiBAY2xhc3MgUG91Y2hBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG4gKiBpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLXBvdWNoJztcbiAqXG4gKiAvLyBDcmVhdGUgYSBuZXcgUG91Y2hEQiBpbnN0YW5jZVxuICogY29uc3QgZGIgPSBuZXcgUG91Y2hEQignbXktZGF0YWJhc2UnKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBQb3VjaEFkYXB0ZXIgd2l0aCB0aGUgZGF0YWJhc2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG91Y2hBZGFwdGVyKGRiKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlci0xMjMnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBuZXcgUG91Y2hBZGFwdGVyKGRiKVxuICogICBQb3VjaEFkYXB0ZXItPj5Db3VjaERCQWRhcHRlcjogc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIFBVVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZVxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGUsIGlkKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoaWQpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIEdFVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IERvY3VtZW50XG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgUG91Y2hEQiBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBVVUlEIGZvciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgZGF0YWJhc2UgVVJMIG9yIGdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxQb3VjaEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIG1lcmdlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvdWNoRmxhZ3M+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFBvdWNoRmxhZ3M+XG4gICk6IFByb21pc2U8UG91Y2hGbGFncz4ge1xuICAgIGxldCBpZDogc3RyaW5nID0gXCJcIjtcbiAgICBjb25zdCB1cmwgPSAodGhpcy5uYXRpdmUgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IC9odHRwcz86XFwvXFwvKC4rPyk6Lis/QC9nO1xuICAgICAgY29uc3QgbSA9IHJlZ2V4cC5leGVjKHVybCk7XG4gICAgICBpZiAobSkgaWQgPSBtWzFdO1xuICAgIH1cbiAgICBpZiAoIWlkKSB7XG4gICAgICBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiBpZCxcbiAgICB9KSBhcyBQb3VjaEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9ycy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2VuZXJhdGVJbmRleGVzIHV0aWxpdHkgdG8gY3JlYXRlIGluZGV4IGRlZmluaXRpb25zIGFuZCB0aGVuIGNyZWF0ZXMgdGhlbSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IGRvY3VtZW50IGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSAgbW9kZWxzIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgZ2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudCBJRCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSUQsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrR2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGRvY3VtZW50IElEcyBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSURzLCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWRBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnJvcilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICgoZCBhcyBhbnkpLmVycm9yIHx8ICEoZCBhcyBhbnkpLm9rKVxuICAgICAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKFxuICAgICAgICAgICAgKChkIGFzIHsgZXJyb3I6IEVyciB9KS5lcnJvciBhcyBFcnJvcikgfHxcbiAgICAgICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIHZhbGlkIHJlc3BvbnNlXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IChSZXNwb25zZSB8IEVycilbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICEociBhcyBhbnkpLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmICgoZWwgYXMgYW55KS5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7KGVsIGFzIGFueSkuZXJyb3J9JHsoZWwgYXMgYW55KS5yZWFzb24gPyBgIC0gJHsoZWwgYXMgYW55KS5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSByZW1vdmUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHRvIGdldCBpdHMgcmV2aXNpb24sIHRoZW4gZGVsZXRlcyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudCB3aXRoIF9yZXZcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiByZW1vdmUoX2lkLCByZWNvcmQuX3JldilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLnJlbW92ZShfaWQsIHJlY29yZC5fcmV2KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgYWxsIGRvY3VtZW50cyB0byBnZXQgdGhlaXIgcmV2aXNpb25zLCB0aGVuIG1hcmtzIHRoZW0gYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZSB3aXRoIGRvY3VtZW50c1xuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFyayBkb2N1bWVudHMgYXMgZGVsZXRlZFxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1hcmtlZCBkb2N1bWVudHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBkaXJlY3QgZmluZCBvcGVyYXRpb24gdXNpbmcgYSBNYW5nbyBxdWVyeSBvYmplY3QuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgY29tcGxleCBxdWVyaWVzIGJleW9uZCB0aGUgc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbcHJvY2Vzcz10cnVlXSAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgKHRydWUgcmV0dXJucyBqdXN0IGRvY3MsIGZhbHNlIHJldHVybnMgZnVsbCByZXNwb25zZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmF3PFY+KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGZpbmQocmF3SW5wdXQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBGaW5kUmVzcG9uc2VcbiAgICogICAgIGFsdCBwcm9jZXNzPXRydWVcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UuZG9jcyBhcyBWXG4gICAqICAgICBlbHNlIHByb2Nlc3M9ZmFsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UgYXMgVlxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzID0gdHJ1ZSk6IFByb21pc2U8Vj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogRmluZFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKFxuICAgICAgICByYXdJbnB1dCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkuXG4gICAqIFRoaXMgaW5zdGFuY2UgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgc3RhdGljIHBhcnNlRXJyb3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeSBiYXNlZCBvbiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFuYWx5emVzIHRoZSBlcnJvciB0eXBlLCBzdGF0dXMgY29kZSwgb3IgbWVzc2FnZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVyciwgcmVhc29uKVxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBSZXR1cm4gZXJyIGFzIGlzXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBhbHQgY29udGFpbnMgXCJhbHJlYWR5IGV4aXN0XCIgb3IgXCJ1cGRhdGUgY29uZmxpY3RcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvbnRhaW5zIFwibWlzc2luZ1wiIG9yIFwiZGVsZXRlZFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBzdGF0dXNcbiAgICogICAgIGFsdCBzdGF0dXMgaXMgNDAxLCA0MTIsIDQwOVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDRcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDAwXG4gICAqICAgICAgIGFsdCBtZXNzYWdlIGNvbnRhaW5zIFwiTm8gaW5kZXggZXhpc3RzXCJcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgICAgIGVsc2VcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBtZXNzYWdlIGNvbnRhaW5zIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICAvLyByZXR1cm4gc3VwZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5zdGF0dXMpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgUG91Y2hEQi1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIG1vZGVscy5cbiAgICogVGhpcyBtZXRob2QgZGVmaW5lcyBob3cgdGhlc2UgZmllbGRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogZGVjb3JhdGlvbigpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIGRlY29yYXRpb24oKSB7XG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25Qb3VjaENyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG4iXX0=
|
|
630
|
+
PouchAdapter.setCurrent(PouchFlavour);
|
|
631
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEVBRVgsZUFBZSxFQUNmLFVBQVUsR0FFWCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUViLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxHQUVULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBRWYsVUFBVSxFQUNWLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFFTCxVQUFVLEVBRVYsWUFBWSxHQUNiLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBb0I7QUFHM0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEIsQ0FNaEQsT0FBNEIsRUFDNUIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRO0lBRVIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBa0IsQ0FBQztRQUNoQyw2REFBNkQ7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLGdCQUFnQixDQUN4QixnRUFBZ0UsQ0FDakUsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsY0FJakM7SUFDQyxZQUFZLEtBQWUsRUFBRSxLQUFjO1FBQ3pDLEtBQUss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LElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNILE1BQU0sQ0FBVSxVQUFVO1FBQ3hCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFDdEMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztRQUNYLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUN0QyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBRUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIEluZGV4RXJyb3IsXG4gIE1hbmdvUXVlcnksXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCBEYXRhYmFzZSA9IFBvdWNoREIuRGF0YWJhc2U7XG5pbXBvcnQgUmVzcG9uc2UgPSBQb3VjaERCLkNvcmUuUmVzcG9uc2U7XG5pbXBvcnQgRXJyID0gUG91Y2hEQi5Db3JlLkVycm9yO1xuaW1wb3J0IElkTWV0YSA9IFBvdWNoREIuQ29yZS5JZE1ldGE7XG5pbXBvcnQgR2V0TWV0YSA9IFBvdWNoREIuQ29yZS5HZXRNZXRhO1xuaW1wb3J0IENyZWF0ZUluZGV4UmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuQ3JlYXRlSW5kZXhSZXNwb25zZTtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgQnVsa0dldFJlc3BvbnNlID0gUG91Y2hEQi5Db3JlLkJ1bGtHZXRSZXNwb25zZTtcbmltcG9ydCBGaW5kUmVzcG9uc2UgPSBQb3VjaERCLkZpbmQuRmluZFJlc3BvbnNlO1xuaW1wb3J0IHsgUG91Y2hGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQb3VjaEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBvdWNoUmVwb3NpdG9yeSB9IGZyb20gXCIuL1BvdWNoUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIElEIG9uIGEgbW9kZWwgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBkZWNvcmF0b3IgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRvciBJRCBmaWVsZCBvbiBhIG1vZGVsXG4gKiB3aGVuIGl0J3MgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLiBJdCBleHRyYWN0cyB0aGUgVVVJRCBmcm9tIHRoZSBjb250ZXh0IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUG91Y2hSZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSB0aGF0IGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8UG91Y2hGbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyBmbGFnc1xuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBtb2RpZnlcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBQb3VjaFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8UG91Y2hGbGFncz4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQb3VjaERCIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlclxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb3VjaERCQWRhcHRlciBmb3IgUG91Y2hEQi5cbiAqIEl0IGhhbmRsZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgbGlrZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlIChDUlVEKSBmb3IgYm90aFxuICogc2luZ2xlIGRvY3VtZW50cyBhbmQgYnVsayBvcGVyYXRpb25zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBpbmRleGluZy5cbiAqIEB0ZW1wbGF0ZSBEYXRhYmFzZSAtIFRoZSBQb3VjaERCIGRhdGFiYXNlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBQb3VjaEZsYWdzIC0gVGhlIGZsYWdzIHNwZWNpZmljIHRvIFBvdWNoREIgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8UG91Y2hGbGFncz4gLSBUaGUgY29udGV4dCB0eXBlIHdpdGggUG91Y2hEQiBmbGFnc1xuICogQHBhcmFtIHtEYXRhYmFzZX0gc2NvcGUgLSBUaGUgUG91Y2hEQiBkYXRhYmFzZSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGRhdGFiYXNlXG4gKiBAY2xhc3MgUG91Y2hBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG4gKiBpbXBvcnQgeyBQb3VjaEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLXBvdWNoJztcbiAqXG4gKiAvLyBDcmVhdGUgYSBuZXcgUG91Y2hEQiBpbnN0YW5jZVxuICogY29uc3QgZGIgPSBuZXcgUG91Y2hEQignbXktZGF0YWJhc2UnKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBQb3VjaEFkYXB0ZXIgd2l0aCB0aGUgZGF0YWJhc2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG91Y2hBZGFwdGVyKGRiKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlci0xMjMnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICpcbiAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBuZXcgUG91Y2hBZGFwdGVyKGRiKVxuICogICBQb3VjaEFkYXB0ZXItPj5Db3VjaERCQWRhcHRlcjogc3VwZXIoc2NvcGUsIFBvdWNoRmxhdm91ciwgYWxpYXMpXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIFBVVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IFJlc3BvbnNlXG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZVxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBVcGRhdGVkIG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGUsIGlkKVxuICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoaWQpXG4gKiAgIFBvdWNoREItPj5Db3VjaERCOiBIVFRQIEdFVFxuICogICBDb3VjaERCLS0+PlBvdWNoREI6IERvY3VtZW50XG4gKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudFxuICogICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUG91Y2hBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIERhdGFiYXNlLFxuICBQb3VjaEZsYWdzLFxuICBDb250ZXh0PFBvdWNoRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERhdGFiYXNlLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBQb3VjaEZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgUG91Y2hEQiBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBVVUlEIGZvciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgZGF0YWJhc2UgVVJMIG9yIGdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxQb3VjaEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIG1lcmdlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvdWNoRmxhZ3M+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFBvdWNoRmxhZ3M+XG4gICk6IFByb21pc2U8UG91Y2hGbGFncz4ge1xuICAgIGxldCBpZDogc3RyaW5nID0gXCJcIjtcbiAgICBjb25zdCB1cmwgPSAodGhpcy5uYXRpdmUgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHJlZ2V4cCA9IC9odHRwcz86XFwvXFwvKC4rPyk6Lis/QC9nO1xuICAgICAgY29uc3QgbSA9IHJlZ2V4cC5leGVjKHVybCk7XG4gICAgICBpZiAobSkgaWQgPSBtWzFdO1xuICAgIH1cbiAgICBpZiAoIWlkKSB7XG4gICAgICBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpLCB7XG4gICAgICBVVUlEOiBpZCxcbiAgICB9KSBhcyBQb3VjaEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9ycy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgZ2VuZXJhdGVJbmRleGVzIHV0aWxpdHkgdG8gY3JlYXRlIGluZGV4IGRlZmluaXRpb25zIGFuZCB0aGVuIGNyZWF0ZXMgdGhlbSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlczogQ3JlYXRlSW5kZXhSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoXG4gICAgICAgIGluZGV4IGFzIGFueVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCAke2luZGV4Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IGRvY3VtZW50IGludG8gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IHB1dChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVXBkYXRlZCBtb2RlbCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5wdXQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSAgbW9kZWxzIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlW10gfCBFcnJbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHI6IFJlc3BvbnNlIHwgRXJyKSA9PiAociBhcyBSZXNwb25zZSkub2spKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFzc2lnbk11bHRpcGxlTWV0YWRhdGEoXG4gICAgICBtb2RlbHMsXG4gICAgICByZXNwb25zZS5tYXAoKHIpID0+IHIucmV2IGFzIHN0cmluZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgUG91Y2hEQiBkYXRhYmFzZSB1c2luZyB0aGUgZ2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudCBJRCBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSUQsIHRoZW4gcmV0cmlldmVzIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRG9jdW1lbnRcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlKVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgX2lkID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIGxldCByZWNvcmQ6IElkTWV0YSAmIEdldE1ldGE7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMubmF0aXZlLmdldChfaWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IHRoZWlyIElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIGRvY3VtZW50cyBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrR2V0IG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGRvY3VtZW50IElEcyBiYXNlZCBvbiB0aGUgdGFibGUgbmFtZSBhbmQgSURzLCB0aGVuIHJldHJpZXZlcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyfGJpZ2ludD59IGlkcyAtIFRoZSBkb2N1bWVudCBJRHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHJlYWRBbGwodGFibGVOYW1lLCBpZHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBidWxrR2V0KHtkb2NzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogcGFyc2VFcnJvcihlcnJvcilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBCdWxrR2V0UmVzcG9uc2U8YW55PiA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtHZXQoe1xuICAgICAgZG9jczogaWRzLm1hcCgoaWQpID0+ICh7IGlkOiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpIH0pKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSByZXN1bHRzLnJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHIpID0+IHtcbiAgICAgIHIuZG9jcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIGlmICgoZCBhcyBhbnkpLmVycm9yIHx8ICEoZCBhcyBhbnkpLm9rKVxuICAgICAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKFxuICAgICAgICAgICAgKChkIGFzIHsgZXJyb3I6IEVyciB9KS5lcnJvciBhcyBFcnJvcikgfHxcbiAgICAgICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIHZhbGlkIHJlc3BvbnNlXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgKGQgYXMgeyBvazogYW55IH0pLm9rKTtcbiAgICAgICAgYWNjdW0ucHVzaCh0aGlzLmFzc2lnbk1ldGFkYXRhKHJlc3VsdCwgKGQgYXMgYW55KS5va1tDb3VjaERCS2V5cy5SRVZdKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIFBvdWNoREIgZGF0YWJhc2UgdXNpbmcgdGhlIHB1dCBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBJRFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFBvdWNoREJcbiAgICpcbiAgICogICBDbGllbnQtPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBwdXQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBSZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWwgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUucHV0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSBidWxrRG9jcyBvcGVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZXJyb3IgcGFyc2luZyBhbmQgZW5zdXJlcyBhbGwgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgdXBkYXRlZCBkb2N1bWVudCBkYXRhXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogdXBkYXRlQWxsKHRhYmxlTmFtZSwgaWRzLCBtb2RlbHMpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0RvY3MobW9kZWxzKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgb2YgcmVzcG9uc2VzIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFVwZGF0ZWQgbW9kZWxzIHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBQb3VjaERCLS0+PlBvdWNoQWRhcHRlcjogQXJyYXkgd2l0aCBlcnJvcnNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogQ2hlY2sgZm9yIGVycm9yc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogVGhyb3dzIEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBsZXQgcmVzcG9uc2U6IChSZXNwb25zZSB8IEVycilbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrRG9jcyhtb2RlbHMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICEociBhcyBhbnkpLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmICgoZWwgYXMgYW55KS5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7KGVsIGFzIGFueSkuZXJyb3J9JHsoZWwgYXMgYW55KS5yZWFzb24gPyBgIC0gJHsoZWwgYXMgYW55KS5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBkb2N1bWVudCBmcm9tIHRoZSBQb3VjaERCIGRhdGFiYXNlIHVzaW5nIHRoZSByZW1vdmUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHRvIGdldCBpdHMgcmV2aXNpb24sIHRoZW4gZGVsZXRlcyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UG91Y2hBZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiBnZXQoX2lkKVxuICAgKiAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBEb2N1bWVudCB3aXRoIF9yZXZcbiAgICogICBQb3VjaEFkYXB0ZXItPj5Qb3VjaERCOiByZW1vdmUoX2lkLCByZWNvcmQuX3JldilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IFN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3JldilcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IERlbGV0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGUpXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBJZE1ldGEgJiBHZXRNZXRhO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlLnJlbW92ZShfaWQsIHJlY29yZC5fcmV2KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgdGhlaXIgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIFBvdWNoREIgZGF0YWJhc2UgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBmaXJzdCByZXRyaWV2ZXMgYWxsIGRvY3VtZW50cyB0byBnZXQgdGhlaXIgcmV2aXNpb25zLCB0aGVuIG1hcmtzIHRoZW0gYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfG51bWJlcnxiaWdpbnQ+fSBpZHMgLSBUaGUgZG9jdW1lbnQgSURzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogZGVsZXRlQWxsKHRhYmxlTmFtZSwgaWRzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFwIGlkcyB0byBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hEQjogYnVsa0dldCh7ZG9jc30pXG4gICAqICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEJ1bGtHZXRSZXNwb25zZSB3aXRoIGRvY3VtZW50c1xuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogTWFyayBkb2N1bWVudHMgYXMgZGVsZXRlZFxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGJ1bGtEb2NzKG1hcmtlZCBkb2N1bWVudHMpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBTdWNjZXNzIHJlc3BvbnNlc1xuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBQcm9jZXNzIHJlc3VsdHNcbiAgICogICAgIFBvdWNoQWRhcHRlci0+PlBvdWNoQWRhcHRlcjogYXNzaWduTWV0YWRhdGEgZm9yIGVhY2ggZG9jXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBEZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hBZGFwdGVyLT4+UG91Y2hBZGFwdGVyOiBDaGVjayBmb3IgZXJyb3JzXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2xpZW50OiBUaHJvd3MgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEJ1bGtHZXRSZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsa0dldCh7XG4gICAgICBkb2NzOiBpZHMubWFwKChpZCkgPT4gKHsgaWQ6IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsZXRpb246IChSZXNwb25zZSB8IEVycilbXSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGtEb2NzKFxuICAgICAgcmVzdWx0cy5yZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJzID0gZGVsZXRpb24uZmlsdGVyKChkKSA9PiAoZCBhcyBhbnkpLmVycm9yKTtcbiAgICBpZiAoZXJycy5sZW5ndGgpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycnMuam9pbihcIlxcblwiKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByKSA9PiB7XG4gICAgICByLmRvY3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCAoZCBhcyB7IG9rOiBhbnkgfSkub2spO1xuICAgICAgICBhY2N1bS5wdXNoKHRoaXMuYXNzaWduTWV0YWRhdGEocmVzdWx0LCAoZCBhcyBhbnkpLm9rW0NvdWNoREJLZXlzLlJFVl0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBkaXJlY3QgZmluZCBvcGVyYXRpb24gdXNpbmcgYSBNYW5nbyBxdWVyeSBvYmplY3QuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgY29tcGxleCBxdWVyaWVzIGJleW9uZCB0aGUgc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbcHJvY2Vzcz10cnVlXSAtIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgKHRydWUgcmV0dXJucyBqdXN0IGRvY3MsIGZhbHNlIHJldHVybnMgZnVsbCByZXNwb25zZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PlBvdWNoQWRhcHRlcjogcmF3PFY+KHJhd0lucHV0LCBwcm9jZXNzKVxuICAgKiAgIFBvdWNoQWRhcHRlci0+PlBvdWNoREI6IGZpbmQocmF3SW5wdXQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFBvdWNoREItLT4+UG91Y2hBZGFwdGVyOiBGaW5kUmVzcG9uc2VcbiAgICogICAgIGFsdCBwcm9jZXNzPXRydWVcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UuZG9jcyBhcyBWXG4gICAqICAgICBlbHNlIHByb2Nlc3M9ZmFsc2VcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNsaWVudDogcmVzcG9uc2UgYXMgVlxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgUG91Y2hEQi0tPj5Qb3VjaEFkYXB0ZXI6IEVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItPj5Qb3VjaEFkYXB0ZXI6IHBhcnNlRXJyb3IoZSlcbiAgICogICAgIFBvdWNoQWRhcHRlci0tPj5DbGllbnQ6IFRocm93cyBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcmF3PFY+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCBwcm9jZXNzID0gdHJ1ZSk6IFByb21pc2U8Vj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogRmluZFJlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKFxuICAgICAgICByYXdJbnB1dCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBpZiAocmVzcG9uc2Uud2FybmluZykgY29uc29sZS53YXJuKHJlc3BvbnNlLndhcm5pbmcpO1xuICAgICAgaWYgKHByb2Nlc3MpIHJldHVybiByZXNwb25zZS5kb2NzIGFzIFY7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFBvdWNoQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgZnJvbSBQb3VjaERCIHRvIGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBQb3VjaERCIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24ncyBlcnJvciBoaWVyYXJjaHkuXG4gICAqIFRoaXMgaW5zdGFuY2UgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgc3RhdGljIHBhcnNlRXJyb3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gUG91Y2hBZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGVycm9ycyBmcm9tIFBvdWNoREIgdG8gYXBwbGljYXRpb24tc3BlY2lmaWMgZXJyb3JzXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIFBvdWNoREIgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGVycm9yIGhpZXJhcmNoeSBiYXNlZCBvbiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFuYWx5emVzIHRoZSBlcnJvciB0eXBlLCBzdGF0dXMgY29kZSwgb3IgbWVzc2FnZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIGNvbnZlcnRlZCBlcnJvciBvYmplY3RcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UG91Y2hBZGFwdGVyOiBwYXJzZUVycm9yKGVyciwgcmVhc29uKVxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBSZXR1cm4gZXJyIGFzIGlzXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBhbHQgY29udGFpbnMgXCJhbHJlYWR5IGV4aXN0XCIgb3IgXCJ1cGRhdGUgY29uZmxpY3RcIlxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvbnRhaW5zIFwibWlzc2luZ1wiIG9yIFwiZGVsZXRlZFwiXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBzdGF0dXNcbiAgICogICAgIGFsdCBzdGF0dXMgaXMgNDAxLCA0MTIsIDQwOVxuICAgKiAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIHN0YXR1cyBpcyA0MDRcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZWxzZSBzdGF0dXMgaXMgNDAwXG4gICAqICAgICAgIGFsdCBtZXNzYWdlIGNvbnRhaW5zIFwiTm8gaW5kZXggZXhpc3RzXCJcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgICAgIGVsc2VcbiAgICogICAgICAgICBQb3VjaEFkYXB0ZXItLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBtZXNzYWdlIGNvbnRhaW5zIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgICAgUG91Y2hBZGFwdGVyLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFBvdWNoQWRhcHRlci0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICAvLyByZXR1cm4gc3VwZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgbGV0IGNvZGU6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvZGUgPSBlcnI7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvYWxyZWFkeSBleGlzdHx1cGRhdGUgY29uZmxpY3QvZykpXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICAgIGlmIChjb2RlLm1hdGNoKC9taXNzaW5nfGRlbGV0ZWQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcbiAgICB9IGVsc2UgaWYgKChlcnIgYXMgYW55KS5zdGF0dXMpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIGNhc2UgXCI0MDFcIjpcbiAgICAgIGNhc2UgXCI0MTJcIjpcbiAgICAgIGNhc2UgXCI0MDlcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwNFwiOlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG4gICAgICBjYXNlIFwiNDAwXCI6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL05vXFxzaW5kZXhcXHNleGlzdHMvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgUG91Y2hEQi1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZmllbGRzIGluIG1vZGVscy5cbiAgICogVGhpcyBtZXRob2QgZGVmaW5lcyBob3cgdGhlc2UgZmllbGRzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUG91Y2hBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlBvdWNoQWRhcHRlcjogZGVjb3JhdGlvbigpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UG91Y2hBZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBQb3VjaEFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5Qb3VjaEFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFBvdWNoRmxhdm91cilcbiAgICogICBEZWNvcmF0aW9uLS0+PlBvdWNoQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFBvdWNoQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogZGVmaW5lKG9uQ3JlYXRlLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgUG91Y2hBZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhQb3VjaEZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUG91Y2hDcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUG91Y2hGbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblBvdWNoQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5Qb3VjaEFkYXB0ZXIuc2V0Q3VycmVudChQb3VjaEZsYXZvdXIpO1xuIl19
|
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
|
@@ -16,5 +16,5 @@ export * from "./adapter.js";
|
|
|
16
16
|
* @const VERSION
|
|
17
17
|
* @memberOf module:for-pouch
|
|
18
18
|
*/
|
|
19
|
-
export const VERSION = "0.2.
|
|
19
|
+
export const VERSION = "0.2.7";
|
|
20
20
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBa0I7QUFFekMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBRTFCLCtCQUE0QjtBQUM1QixxQ0FBa0M7QUFDbEMsMkJBQXdCO0FBQ3hCLDZCQUE2QjtBQUM3Qiw2QkFBMEI7QUFFMUI7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvdWNoQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuUG91Y2hBZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Qb3VjaFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4vLyBsZWZ0IHRvIHRoZSBlbmQgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIFR5cGVTY3JpcHQgYWRhcHRlciBmb3IgUG91Y2hEQiBpbnRlZ3JhdGlvblxuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSByZXBvc2l0b3J5IHBhdHRlcm4gaW1wbGVtZW50YXRpb24gZm9yIFBvdWNoREIsIGFsbG93aW5nIGZvciBlYXN5IGRhdGFiYXNlIG9wZXJhdGlvbnMgd2l0aCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5LiBJdCBleHBvcnRzIGNvbnN0YW50cywgcmVwb3NpdG9yeSBjbGFzc2VzLCB0eXBlcywgYW5kIGFkYXB0ZXJzIGZvciB3b3JraW5nIHdpdGggUG91Y2hEQi5cbiAqIEBtb2R1bGUgZm9yLXBvdWNoXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFja2FnZSB2ZXJzaW9uIGlkZW50aWZpZXJcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmb3ItcG91Y2ggcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
|
package/lib/index.cjs
CHANGED
|
@@ -33,5 +33,5 @@ __exportStar(require("./adapter.cjs"), exports);
|
|
|
33
33
|
* @const VERSION
|
|
34
34
|
* @memberOf module:for-pouch
|
|
35
35
|
*/
|
|
36
|
-
exports.VERSION = "0.2.
|
|
36
|
+
exports.VERSION = "0.2.7";
|
|
37
37
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUM7QUFFekMsc0JBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUUxQixrREFBNEI7QUFDNUIsd0RBQWtDO0FBQ2xDLDhDQUF3QjtBQUN4Qiw2QkFBNkI7QUFDN0IsZ0RBQTBCO0FBRTFCOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUNVLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvdWNoQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuUG91Y2hBZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Qb3VjaFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4vLyBsZWZ0IHRvIHRoZSBlbmQgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIFR5cGVTY3JpcHQgYWRhcHRlciBmb3IgUG91Y2hEQiBpbnRlZ3JhdGlvblxuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSByZXBvc2l0b3J5IHBhdHRlcm4gaW1wbGVtZW50YXRpb24gZm9yIFBvdWNoREIsIGFsbG93aW5nIGZvciBlYXN5IGRhdGFiYXNlIG9wZXJhdGlvbnMgd2l0aCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5LiBJdCBleHBvcnRzIGNvbnN0YW50cywgcmVwb3NpdG9yeSBjbGFzc2VzLCB0eXBlcywgYW5kIGFkYXB0ZXJzIGZvciB3b3JraW5nIHdpdGggUG91Y2hEQi5cbiAqIEBtb2R1bGUgZm9yLXBvdWNoXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFja2FnZSB2ZXJzaW9uIGlkZW50aWZpZXJcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmb3ItcG91Y2ggcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXBvdWNoXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
|
package/lib/index.d.ts
CHANGED