@decaf-ts/core 0.5.13 → 0.5.15
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/core.cjs +21 -6
- package/dist/core.esm.cjs +21 -8
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/BaseModel.js +4 -4
- package/lib/esm/model/decorators.d.ts +2 -0
- package/lib/esm/model/decorators.js +8 -2
- package/lib/esm/persistence/Adapter.d.ts +1 -0
- package/lib/esm/persistence/Adapter.js +10 -3
- package/lib/esm/ram/RamAdapter.js +4 -3
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/BaseModel.cjs +4 -4
- package/lib/model/decorators.cjs +9 -1
- package/lib/model/decorators.d.ts +2 -0
- package/lib/persistence/Adapter.cjs +10 -3
- package/lib/persistence/Adapter.d.ts +1 -0
- package/lib/ram/RamAdapter.cjs +3 -2
- package/package.json +1 -1
@@ -4,7 +4,7 @@ import { Repository } from "./../repository/Repository.js";
|
|
4
4
|
import { Adapter, PersistenceKeys, Sequence } from "./../persistence/index.js";
|
5
5
|
import { Lock } from "@decaf-ts/transactional-decorators";
|
6
6
|
import { Decoration, Model, propMetadata, } from "@decaf-ts/decorator-validation";
|
7
|
-
import { BaseError, ConflictError, findPrimaryKey, InternalError, NotFoundError, onCreate, } from "@decaf-ts/db-decorators";
|
7
|
+
import { BaseError, ConflictError, findPrimaryKey, InternalError, NotFoundError, onCreate, onCreateUpdate, } from "@decaf-ts/db-decorators";
|
8
8
|
import { RamSequence } from "./RamSequence.js";
|
9
9
|
import { createdByOnRamCreateUpdate } from "./handlers.js";
|
10
10
|
import { RamFlavour } from "./constants.js";
|
@@ -435,6 +435,7 @@ export class RamAdapter extends Adapter {
|
|
435
435
|
* RamAdapter->>Decoration: apply()
|
436
436
|
*/
|
437
437
|
static decoration() {
|
438
|
+
super.decoration();
|
438
439
|
const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
|
439
440
|
const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
|
440
441
|
Decoration.flavouredAs(RamFlavour)
|
@@ -443,10 +444,10 @@ export class RamAdapter extends Adapter {
|
|
443
444
|
.apply();
|
444
445
|
Decoration.flavouredAs(RamFlavour)
|
445
446
|
.for(updatedByKey)
|
446
|
-
.define(
|
447
|
+
.define(onCreateUpdate(createdByOnRamCreateUpdate), propMetadata(updatedByKey, {}))
|
447
448
|
.apply();
|
448
449
|
}
|
449
450
|
}
|
450
451
|
RamAdapter.decoration();
|
451
452
|
Adapter.setCurrent(RamFlavour);
|
452
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLDBCQUF1QjtBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLHNDQUFpQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsa0NBQXVCO0FBRXBFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRCxPQUFPLEVBRUwsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxFQUNiLGFBQWEsRUFDYixRQUFRLEdBRVQsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsV0FBVyxFQUFFLHlCQUFzQjtBQUM1QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsc0JBQW1CO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsdUJBQW9CO0FBRXpDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsT0FLL0I7SUFDQyxZQUFZLEtBQWM7UUFDeEIsS0FBSyxDQUFDLElBQUksR0FBRyxFQUE0QixFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQWtDdkQsWUFBTyxHQUFHLFVBQVUsQ0FBQztRQUV0QixZQUFPLEdBR1gsRUFBRSxDQUFDO1FBRUMsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUF4QzFCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxVQUFVO1FB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QUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQzthQUMvQixHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFDcEMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztRQUNYLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUNwQyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBRUQsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSYW1GbGFncywgUmF3UmFtUXVlcnksIFJhbVN0b3JhZ2UsIFJhbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtU3RhdGVtZW50IH0gZnJvbSBcIi4vUmFtU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cywgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSBcIkBkZWNhZi10cy90cmFuc2FjdGlvbmFsLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1TZXF1ZW5jZSB9IGZyb20gXCIuL1JhbVNlcXVlbmNlXCI7XG5pbXBvcnQgeyBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQgeyBSYW1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChSYW1GbGF2b3VyKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IGFkYXB0ZXIgZm9yIGRhdGEgcGVyc2lzdGVuY2VcbiAqIEBzdW1tYXJ5IFRoZSBSYW1BZGFwdGVyIHByb3ZpZGVzIGFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJdCBzdG9yZXMgZGF0YSBpbiBKYXZhU2NyaXB0IE1hcHMgYW5kIHByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgcXVlcnkgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBhZGFwdGVyIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgcHJvdG90eXBpbmcsIGFuZCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlXG4gKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWNyb3NzIGFwcGxpY2F0aW9uIHJlc3RhcnRzLlxuICogQGNsYXNzIFJhbUFkYXB0ZXJcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUmFtQWRhcHRlcignbXlSYW1BZGFwdGVyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShVc2VyLCBhZGFwdGVyKTtcbiAqXG4gKiAvLyBQZXJmb3JtIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYXdhaXQgdXNlclJlcG8uY3JlYXRlKHVzZXIpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLmZpbmRCeUlkKHVzZXIuaWQpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICogICBSYW1BZGFwdGVyLS0+PlJlcG9zaXRvcnk6IG1vZGVsXG4gKiAgIFJlcG9zaXRvcnktLT4+Q2xpZW50OiBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogZmluZEJ5SWQoaWQpXG4gKiAgIFJlcG9zaXRvcnktPj5SYW1BZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogbW9kZWxcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1TdG9yYWdlLFxuICBSYXdSYW1RdWVyeTxhbnk+LFxuICBSYW1GbGFncyxcbiAgUmFtQ29udGV4dFxuPiB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIGFueT4+KCksIFJhbUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZGVsIHR5cGUuXG4gICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIFJBTS1zcGVjaWZpYyByZXBvc2l0b3J5IGZ1bmN0aW9uYWxpdHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+fSBBIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBSQU0gcmVwb3NpdG9yaWVzXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj4ge1xuICAgIHJldHVybiBzdXBlci5yZXBvc2l0b3J5PE0+KCkgYXMgQ29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3BlcmF0aW9uIGZsYWdzIHdpdGggVVVJRFxuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGZsYWdzIHdpdGggYSBVVUlEIGZvciB1c2VyIGlkZW50aWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgYWxsIG9wZXJhdGlvbnMgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0cmFja2luZyBwdXJwb3Nlcy5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPFJhbUZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIGV4dGVuZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmFtRmxhZ3M+fSBDb21wbGV0ZSBmbGFncyB3aXRoIFVVSURcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxSYW1GbGFncz5cbiAgKTogUHJvbWlzZTxSYW1GbGFncz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgVVVJRDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICB9KSBhcyBSYW1GbGFncztcbiAgfVxuXG4gIG92ZXJyaWRlIENvbnRleHQgPSBSYW1Db250ZXh0O1xuXG4gIHByaXZhdGUgaW5kZXhlczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICA+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2NrID0gbmV3IExvY2soKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBSQU0gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBBIG5vLW9wIGluaXRpYWxpemF0aW9uIG1ldGhvZCBmb3IgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBTaW5jZSBSQU0gYWRhcHRlciBkb2Vzbid0IHJlcXVpcmUgYW55IHNldHVwLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBhcmd1bWVudHMgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRleGVzIG1vZGVscyBpbiB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbmRleGluZyBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGV4cGxpY2l0IGluZGV4aW5nLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBNb2RlbHMgdG8gYmUgaW5kZXhlZCAodW51c2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5kZXhpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5kZXgoLi4ubW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3Igc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBzdG9yYWdlIGluIHRoZSBSQU0gYWRhcHRlci5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHByaW1hcnkga2V5IGFuZCBjcmVhdGVzIGEgcmVjb3JkIHdpdGhvdXQgdGhlIHByaW1hcnkga2V5IGZpZWxkLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHByZXBhcmVkXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIE9iamVjdCBjb250YWluaW5nIHRoZSByZWNvcmQgYW5kIElEXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKTogeyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47IGlkOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG4gICAgZGVsZXRlIHByZXBhcmVkLnJlY29yZFtwayBhcyBzdHJpbmddO1xuICAgIHJldHVybiBwcmVwYXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdG9yZWQgcmVjb3JkIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgc3RvcmVkIHJlY29yZCBieSBhZGRpbmcgYmFjayB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBwcmVwYXJlIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0byByZXZlcnQgdG9cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc3RvcmVkIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlcyA9IHN1cGVyLnJldmVydChvYmosIGNsYXp6LCBwaywgaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY3JlYXRlcyB0aGUgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCxcbiAgICogY2hlY2tzIGZvciBjb25mbGljdHMsIGFuZCBzdG9yZXMgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZWNvcmQgaW5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGEgdG8gc3RvcmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN0b3JlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQodGFibGVOYW1lLCBuZXcgTWFwKCkpXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IENvbmZsaWN0RXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSkgdGhpcy5uYXRpdmUuc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKTtcbiAgICBpZiAodGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSkgJiYgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0IGFuZCB0aHJvd3MgYXBwcm9wcmlhdGUgZXJyb3JzIGlmIG5vdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZXRyaWV2ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlY29yZCB3aXRoIHRoZSBuZXcgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbmV3IHJlY29yZCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogcmV0cmlldmVzIHRoZSByZWNvcmQgYmVmb3JlIGRlbGV0aW9uLCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZGVsZXRlKGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgbmF0aXZlZCA9IHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5kZWxldGUoaWQpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG5hdGl2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIHRhYmxlIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIE1hcCByZXByZXNlbnRpbmcgYSB0YWJsZSBmb3IgYSBnaXZlbiBtb2RlbCBvciB0YWJsZSBuYW1lLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHVzZWRcbiAgICogYnkgb3RoZXIgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc3RvcmFnZSBsb2NhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3I8TT59IGZyb20gLSBUaGUgbW9kZWwgY2xhc3Mgb3IgdGFibGUgbmFtZVxuICAgKiBAcmV0dXJuIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBhbnk+IHwgdW5kZWZpbmVkfSBUaGUgdGFibGUgTWFwIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIHRhYmxlRm9yPE0gZXh0ZW5kcyBNb2RlbD4oZnJvbTogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09IFwic3RyaW5nXCIpIGZyb20gPSBNb2RlbC5nZXQoZnJvbSkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgdGFibGUgPSBSZXBvc2l0b3J5LnRhYmxlKGZyb20pO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlKSkgdGhpcy5uYXRpdmUuc2V0KHRhYmxlLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZXQodGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIHF1ZXJ5IG9wZXJhdGlvbiBvbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RvcmUgdXNpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGZpbHRlcmluZywgc29ydGluZywgcGFnaW5hdGlvbiwgYW5kIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8YW55Pn0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgc3BlY2lmaWNhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJhdyhyYXdJbnB1dClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogdGFibGVGb3IoZnJvbSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSlcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZW50cmllcygpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJldmVydChyLCBmcm9tLCBpZCwgcGspXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFdoZXJlIGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuZmlsdGVyKHdoZXJlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTb3J0IGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc29ydChzb3J0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTa2lwIHNwZWNpZmllZFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zbGljZShza2lwKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBMaW1pdCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNlbGVjdCBmaWVsZHMgc3BlY2lmaWVkXG4gICAqICAgICBsb29wIEZvciBlYWNoIHJlc3VsdFxuICAgKiAgICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogRmlsdGVyIHRvIHNlbGVjdGVkIGZpZWxkc1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBSYXdSYW1RdWVyeTxhbnk+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyB3aGVyZSwgc29ydCwgbGltaXQsIHNraXAsIGZyb20gfSA9IHJhd0lucHV0O1xuICAgIGxldCB7IHNlbGVjdCB9ID0gcmF3SW5wdXQ7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMudGFibGVGb3IoZnJvbSk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFRhYmxlICR7ZnJvbX0gbm90IGZvdW5kIGluIFJhbUFkYXB0ZXJgKTtcbiAgICBjb25zdCB7IGlkLCBwcm9wcyB9ID0gZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSk7XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IEFycmF5LmZyb20oY29sbGVjdGlvbi5lbnRyaWVzKCkpLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICBmcm9tLFxuICAgICAgICBpZCBhcyBhbnksXG4gICAgICAgIFNlcXVlbmNlLnBhcnNlVmFsdWUocHJvcHMudHlwZSBhcyBhbnksIHBrIGFzIHN0cmluZykgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcblxuICAgIHJlc3VsdCA9IHdoZXJlID8gcmVzdWx0LmZpbHRlcih3aGVyZSkgOiByZXN1bHQ7XG5cbiAgICBpZiAoc29ydCkgcmVzdWx0ID0gcmVzdWx0LnNvcnQoc29ydCk7XG5cbiAgICBpZiAoc2tpcCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKHNraXApO1xuICAgIGlmIChsaW1pdCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGxpbWl0KTtcblxuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIHNlbGVjdCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0KSA/IHNlbGVjdCA6IFtzZWxlY3RdO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocikgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocikucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoKHNlbGVjdCBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoa2V5KSkgYWNjW2tleV0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyB0byBhcHByb3ByaWF0ZSB0eXBlc1xuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgZXJyb3JzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nLlxuICAgKiBJZiB0aGUgZXJyb3IgaXMgYWxyZWFkeSBhIEJhc2VFcnJvciwgaXQncyByZXR1cm5lZCBhcyBpczsgb3RoZXJ3aXNlLCBpdCdzIHdyYXBwZWQgaW4gYW4gSW50ZXJuYWxFcnJvci5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgZXhwZWN0ZWQgZXJyb3IgdHlwZSwgZXh0ZW5kaW5nIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHJldHVybiB7Vn0gVGhlIHBhcnNlZCBlcnJvciBvZiB0aGUgZXhwZWN0ZWQgdHlwZVxuICAgKi9cbiAgcGFyc2VFcnJvcjxWIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yKTogViB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBWO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHF1ZXJpZXNcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFJhbVN0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllcy5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBmbHVlbnQgcXVlcnkgY29uc3RydWN0aW9uIGFnYWluc3QgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgc3RhdGVtZW50XG4gICAqIEByZXR1cm4ge1JhbVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogUmFtU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50PE0sIGFueT4odGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgSURzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TZXF1ZW5jZSBpbnN0YW5jZSBmb3IgSUQgZ2VuZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGF1dG8taW5jcmVtZW50aW5nIHNlcXVlbmNlcyBmb3IgZW50aXR5IElEcy5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgUkFNLXNwZWNpZmljIGRlY29yYXRpb25zIGZvciBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdGlvbnMgZm9yIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGZpZWxkcyBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIHNldCB1cCBoYW5kbGVycyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAgICogcG9wdWxhdGUgdGhlc2UgZmllbGRzIHdpdGggdGhlIGN1cnJlbnQgdXNlcidzIFVVSUQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEZWNvcmF0aW9uXG4gICAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5SYW1BZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogdXBkYXRlZEJ5S2V5XG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqL1xuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cblJhbUFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KFJhbUZsYXZvdXIpO1xuIl19
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLDBCQUF1QjtBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLHNDQUFpQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsa0NBQXVCO0FBRXBFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRCxPQUFPLEVBRUwsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxFQUNiLGFBQWEsRUFDYixRQUFRLEVBQ1IsY0FBYyxHQUVmLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSx5QkFBc0I7QUFDNUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHNCQUFtQjtBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLHVCQUFvQjtBQUV6QyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BSy9CO0lBQ0MsWUFBWSxLQUFjO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBNEIsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFrQ3ZELFlBQU8sR0FBRyxVQUFVLENBQUM7UUFFdEIsWUFBTyxHQUdYLEVBQUUsQ0FBQztRQUVDLFNBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBeEMxQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lB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LENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQzthQUMvQixHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFDcEMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FDL0I7YUFDQSxLQUFLLEVBQUUsQ0FBQztRQUNYLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxFQUMxQyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBRUQsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSYW1GbGFncywgUmF3UmFtUXVlcnksIFJhbVN0b3JhZ2UsIFJhbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtU3RhdGVtZW50IH0gZnJvbSBcIi4vUmFtU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cywgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSBcIkBkZWNhZi10cy90cmFuc2FjdGlvbmFsLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtU2VxdWVuY2UgfSBmcm9tIFwiLi9SYW1TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUgfSBmcm9tIFwiLi9oYW5kbGVyc1wiO1xuaW1wb3J0IHsgUmFtRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5BZGFwdGVyLnNldEN1cnJlbnQoUmFtRmxhdm91cik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBhZGFwdGVyIGZvciBkYXRhIHBlcnNpc3RlbmNlXG4gKiBAc3VtbWFyeSBUaGUgUmFtQWRhcHRlciBwcm92aWRlcyBhbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBlcnNpc3RlbmNlIGxheWVyLlxuICogSXQgc3RvcmVzIGRhdGEgaW4gSmF2YVNjcmlwdCBNYXBzIGFuZCBwcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGNhcGFiaWxpdGllcy5cbiAqIFRoaXMgYWRhcHRlciBpcyB1c2VmdWwgZm9yIHRlc3RpbmcsIHByb3RvdHlwaW5nLCBhbmQgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZVxuICogcGVyc2lzdGVudCBzdG9yYWdlIGFjcm9zcyBhcHBsaWNhdGlvbiByZXN0YXJ0cy5cbiAqIEBjbGFzcyBSYW1BZGFwdGVyXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IFJBTSBhZGFwdGVyXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFJhbUFkYXB0ZXIoJ215UmFtQWRhcHRlcicpO1xuICpcbiAqIC8vIENyZWF0ZSBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWxcbiAqIGNvbnN0IHVzZXJSZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoVXNlciwgYWRhcHRlcik7XG4gKlxuICogLy8gUGVyZm9ybSBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGF3YWl0IHVzZXJSZXBvLmNyZWF0ZSh1c2VyKTtcbiAqIGNvbnN0IHJldHJpZXZlZFVzZXIgPSBhd2FpdCB1c2VyUmVwby5maW5kQnlJZCh1c2VyLmlkKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwb3NpdG9yeS0+PlJhbUFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQoaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGZpbmRCeUlkKGlkKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IG1vZGVsXG4gKiAgIFJhbUFkYXB0ZXItLT4+UmVwb3NpdG9yeTogbW9kZWxcbiAqICAgUmVwb3NpdG9yeS0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUmFtU3RvcmFnZSxcbiAgUmF3UmFtUXVlcnk8YW55PixcbiAgUmFtRmxhZ3MsXG4gIFJhbUNvbnRleHRcbj4ge1xuICBjb25zdHJ1Y3RvcihhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBhbnk+PigpLCBSYW1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlbCB0eXBlLlxuICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBSQU0tc3BlY2lmaWMgcmVwb3NpdG9yeSBmdW5jdGlvbmFsaXR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgcmVwb3NpdG9yeVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSYW1SZXBvc2l0b3J5PE0+Pn0gQSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgUkFNIHJlcG9zaXRvcmllc1xuICAgKi9cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+IHtcbiAgICByZXR1cm4gc3VwZXIucmVwb3NpdG9yeTxNPigpIGFzIENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyB3aXRoIFVVSURcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBmbGFncyB3aXRoIGEgVVVJRCBmb3IgdXNlciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IGFsbCBvcGVyYXRpb25zIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxSYW1GbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBleHRlbmRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJhbUZsYWdzPn0gQ29tcGxldGUgZmxhZ3Mgd2l0aCBVVUlEXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UmFtRmxhZ3M+XG4gICk6IFByb21pc2U8UmFtRmxhZ3M+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgfSkgYXMgUmFtRmxhZ3M7XG4gIH1cblxuICBvdmVycmlkZSBDb250ZXh0ID0gUmFtQ29udGV4dDtcblxuICBwcml2YXRlIGluZGV4ZXM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgYW55Pj5cbiAgPiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jayA9IG5ldyBMb2NrKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbml0aWFsaXphdGlvbiBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGFueSBzZXR1cCwgdGhpcyBtZXRob2Qgc2ltcGx5IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzICh1bnVzZWQpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kZXhlcyBtb2RlbHMgaW4gdGhlIFJBTSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IEEgbm8tb3AgaW5kZXhpbmcgbWV0aG9kIGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFNpbmNlIFJBTSBhZGFwdGVyIGRvZXNuJ3QgcmVxdWlyZSBleHBsaWNpdCBpbmRleGluZywgdGhpcyBtZXRob2Qgc2ltcGx5IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gbW9kZWxzIC0gTW9kZWxzIHRvIGJlIGluZGV4ZWQgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluZGV4aW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluZGV4KC4uLm1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSB0byBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igc3RvcmFnZSBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBwcmltYXJ5IGtleSBhbmQgY3JlYXRlcyBhIHJlY29yZCB3aXRob3V0IHRoZSBwcmltYXJ5IGtleSBmaWVsZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwcmVwYXJlZFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBPYmplY3QgY29udGFpbmluZyB0aGUgcmVjb3JkIGFuZCBJRFxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuICAgIGRlbGV0ZSBwcmVwYXJlZC5yZWNvcmRbcGsgYXMgc3RyaW5nXTtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RvcmVkIHJlY29yZCBiYWNrIHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBhIHN0b3JlZCByZWNvcmQgYnkgYWRkaW5nIGJhY2sgdGhlIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJlcGFyZSBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdG8gcmV2ZXJ0IHRvXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIC0gVGhlIHN0b3JlZCByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBNIHtcbiAgICBjb25zdCByZXMgPSBzdXBlci5yZXZlcnQob2JqLCBjbGF6eiwgcGssIGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgU3RvcmVzIGEgbmV3IHJlY29yZCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlIHdpdGggdGhlIGdpdmVuIElELlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNyZWF0ZXMgdGhlIHRhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsXG4gICAqIGNoZWNrcyBmb3IgY29uZmxpY3RzLCBhbmQgc3RvcmVzIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgcmVjb3JkIGluXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhIHRvIHN0b3JlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdG9yZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKVxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBDb25mbGljdEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpIHRoaXMubmF0aXZlLnNldCh0YWJsZU5hbWUsIG5ldyBNYXAoKSk7XG4gICAgaWYgKHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpICYmIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVjb3JkIGZyb20gaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgZ2l2ZW4gdGFibGUuXG4gICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCBhbmQgdGhyb3dzIGFwcHJvcHJpYXRlIGVycm9ycyBpZiBub3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmV0cmlldmUgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlY29yZFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyByZWNvcmQgaW4gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIGFuZCB1cGRhdGVzIHRoZSByZWNvcmQgd2l0aCB0aGUgbmV3IGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG5ldyByZWNvcmQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiB1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIHJldHJpZXZlcyB0aGUgcmVjb3JkIGJlZm9yZSBkZWxldGlvbiwgYW5kIHRoZW4gcmVtb3ZlcyBpdCBmcm9tIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGRlbGV0ZShpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IG5hdGl2ZWQgPSB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgICB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBuYXRpdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSB0YWJsZSBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBNYXAgcmVwcmVzZW50aW5nIGEgdGFibGUgZm9yIGEgZ2l2ZW4gbW9kZWwgb3IgdGFibGUgbmFtZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB1c2VkXG4gICAqIGJ5IG90aGVyIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IHN0b3JhZ2UgbG9jYXRpb24uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBmcm9tIC0gVGhlIG1vZGVsIGNsYXNzIG9yIHRhYmxlIG5hbWVcbiAgICogQHJldHVybiB7TWFwPHN0cmluZyB8IG51bWJlciwgYW55PiB8IHVuZGVmaW5lZH0gVGhlIHRhYmxlIE1hcCBvciB1bmRlZmluZWRcbiAgICovXG4gIHByb3RlY3RlZCB0YWJsZUZvcjxNIGV4dGVuZHMgTW9kZWw+KGZyb206IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSBcInN0cmluZ1wiKSBmcm9tID0gTW9kZWwuZ2V0KGZyb20pIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IHRhYmxlID0gUmVwb3NpdG9yeS50YWJsZShmcm9tKTtcbiAgICBpZiAoIXRoaXMubmF0aXZlLmhhcyh0YWJsZSkpIHRoaXMubmF0aXZlLnNldCh0YWJsZSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0KHRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBxdWVyeSBvcGVyYXRpb24gb24gdGhlIGluLW1lbW9yeSBkYXRhIHN0b3JlIHVzaW5nIHRoZSBwcm92aWRlZCBxdWVyeSBzcGVjaWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIGFuZCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1Jhd1JhbVF1ZXJ5PGFueT59IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHNwZWNpZmljYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiByYXcocmF3SW5wdXQpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHRhYmxlRm9yKGZyb20pXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGVudHJpZXMoKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogZW50cmllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggZW50cnlcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXZlcnQociwgZnJvbSwgaWQsIHBrKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBXaGVyZSBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LmZpbHRlcih3aGVyZSlcbiAgICogICBlbmRcbiAgICogICBhbHQgU29ydCBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNvcnQoc29ydClcbiAgICogICBlbmRcbiAgICogICBhbHQgU2tpcCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2Uoc2tpcClcbiAgICogICBlbmRcbiAgICogICBhbHQgTGltaXQgc3BlY2lmaWVkXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNsaWNlKDAsIGxpbWl0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTZWxlY3QgZmllbGRzIHNwZWNpZmllZFxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IEZpbHRlciB0byBzZWxlY3RlZCBmaWVsZHNcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUmF3UmFtUXVlcnk8YW55Pik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgd2hlcmUsIHNvcnQsIGxpbWl0LCBza2lwLCBmcm9tIH0gPSByYXdJbnB1dDtcbiAgICBsZXQgeyBzZWxlY3QgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLnRhYmxlRm9yKGZyb20pO1xuICAgIGlmICghY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUYWJsZSAke2Zyb219IG5vdCBmb3VuZCBpbiBSYW1BZGFwdGVyYCk7XG4gICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpO1xuXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBBcnJheS5mcm9tKGNvbGxlY3Rpb24uZW50cmllcygpKS5tYXAoKFtwaywgcl0pID0+XG4gICAgICB0aGlzLnJldmVydChcbiAgICAgICAgcixcbiAgICAgICAgZnJvbSxcbiAgICAgICAgaWQgYXMgYW55LFxuICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKHByb3BzLnR5cGUgYXMgYW55LCBwayBhcyBzdHJpbmcpIGFzIHN0cmluZ1xuICAgICAgKVxuICAgICk7XG5cbiAgICByZXN1bHQgPSB3aGVyZSA/IHJlc3VsdC5maWx0ZXIod2hlcmUpIDogcmVzdWx0O1xuXG4gICAgaWYgKHNvcnQpIHJlc3VsdCA9IHJlc3VsdC5zb3J0KHNvcnQpO1xuXG4gICAgaWYgKHNraXApIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwKTtcbiAgICBpZiAobGltaXQpIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3QgOiBbc2VsZWN0XTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHIpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHIpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKChzZWxlY3QgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkpIGFjY1trZXldID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgdG8gYXBwcm9wcmlhdGUgdHlwZXNcbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IGVycm9ycyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZy5cbiAgICogSWYgdGhlIGVycm9yIGlzIGFscmVhZHkgYSBCYXNlRXJyb3IsIGl0J3MgcmV0dXJuZWQgYXMgaXM7IG90aGVyd2lzZSwgaXQncyB3cmFwcGVkIGluIGFuIEludGVybmFsRXJyb3IuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGV4cGVjdGVkIGVycm9yIHR5cGUsIGV4dGVuZGluZyBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1Z9IFRoZSBwYXJzZWQgZXJyb3Igb2YgdGhlIGV4cGVjdGVkIHR5cGVcbiAgICovXG4gIHBhcnNlRXJyb3I8ViBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvcik6IFYge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgVjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBxdWVyaWVzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgZmx1ZW50IHF1ZXJ5IGNvbnN0cnVjdGlvbiBhZ2FpbnN0IHRoZSBSQU0gYWRhcHRlci5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHN0YXRlbWVudFxuICAgKiBAcmV0dXJuIHtSYW1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFJhbVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFJhbVN0YXRlbWVudDxNLCBhbnk+KHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIElEc1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUmFtU2VxdWVuY2UgaW5zdGFuY2UgZm9yIElEIGdlbmVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBhdXRvLWluY3JlbWVudGluZyBzZXF1ZW5jZXMgZm9yIGVudGl0eSBJRHMuXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFJhbVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIFJBTS1zcGVjaWZpYyBkZWNvcmF0aW9ucyBmb3IgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRpb25zIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdXAgaGFuZGxlcnMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gICAqIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyB3aXRoIHRoZSBjdXJyZW50IHVzZXIncyBVVUlEIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUmFtQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlJhbUFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuUmFtQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoUmFtRmxhdm91cik7XG4iXX0=
|
package/lib/index.cjs
CHANGED
@@ -40,5 +40,5 @@ __exportStar(require("./persistence/index.cjs"), exports);
|
|
40
40
|
* @const VERSION
|
41
41
|
* @memberOf module:core
|
42
42
|
*/
|
43
|
-
exports.VERSION = "0.5.
|
43
|
+
exports.VERSION = "0.5.15";
|
44
44
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCx1REFBbUQ7QUFDbkQsMkVBQThEO0FBRTlELGtGQUFrRjtBQUNsRixtQ0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdDQUFtQixFQUFFLENBQUMsQ0FBQztBQUVuRCx1REFBMkI7QUFDM0IseURBQTZCO0FBQzdCLG9EQUF3QjtBQUN4QixvREFBd0I7QUFDeEIseURBQTZCO0FBQzdCLG9EQUF3QjtBQUN4Qix5QkFBeUI7QUFDekIsMERBQThCO0FBRTlCOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIG1vZHVsZSBmb3IgdGhlIERlY2FmIFR5cGVTY3JpcHQgZnJhbWV3b3JrXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZm91bmRhdGlvbmFsIGNvbXBvbmVudHMgb2YgdGhlIERlY2FmIGZyYW1ld29yaywgaW5jbHVkaW5nIGlkZW50aXR5IG1hbmFnZW1lbnQsIFxuICogbW9kZWwgZGVmaW5pdGlvbnMsIHJlcG9zaXRvcnkgcGF0dGVybnMsIHBlcnNpc3RlbmNlIGxheWVyLCBxdWVyeSBidWlsZGluZywgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLlxuICogSXQgZXhwb3J0cyBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCBzZXRzIHVwIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5IGZvciByZXBvc2l0b3J5IGRlY29yYXRvcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZXNSZWdpc3RyeSB9IGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcblxuLy8gb3ZlcnJpZGVzIHRoZSBwcmV2aW91cyBJbmplY3RhYmxlcyByZWdpc3RyeSB0byBlbmFibGUgdGhlIEByZXBvc2l0b3J5IGRlY29yYXRvclxuSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVzUmVnaXN0cnkoKSk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG4vL2xlZnQgdG8gbGFzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAc3VtbWFyeSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
|
package/lib/index.d.ts
CHANGED
package/lib/model/BaseModel.cjs
CHANGED
@@ -10,8 +10,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
10
10
|
};
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
12
12
|
exports.BaseModel = void 0;
|
13
|
-
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
14
13
|
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
14
|
+
const decorators_1 = require("./decorators.cjs");
|
15
15
|
/**
|
16
16
|
* @description Base model class for all domain models
|
17
17
|
* @summary An abstract base class that extends the Model class from decorator-validation and adds timestamp functionality.
|
@@ -42,11 +42,11 @@ class BaseModel extends decorator_validation_1.Model {
|
|
42
42
|
}
|
43
43
|
exports.BaseModel = BaseModel;
|
44
44
|
__decorate([
|
45
|
-
(0,
|
45
|
+
(0, decorators_1.createdAt)(),
|
46
46
|
__metadata("design:type", Date)
|
47
47
|
], BaseModel.prototype, "createdOn", void 0);
|
48
48
|
__decorate([
|
49
|
-
(0,
|
49
|
+
(0, decorators_1.updatedAt)(),
|
50
50
|
__metadata("design:type", Date)
|
51
51
|
], BaseModel.prototype, "updatedOn", void 0);
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZU1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL0Jhc2VNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFDQSx5RUFBaUU7QUFDakUsaURBQW9EO0FBRXBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLDRCQUFLO0lBZTNDLFlBQXNCLEdBQXlCO1FBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQWxCRCw4QkFrQkM7QUFaQztJQURDLElBQUEsc0JBQVMsR0FBRTs4QkFDQSxJQUFJOzRDQUFDO0FBT2pCO0lBREMsSUFBQSxzQkFBUyxHQUFFOzhCQUNBLElBQUk7NENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEQk9wZXJhdGlvbnMsIHRpbWVzdGFtcCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgbW9kZWwgY2xhc3MgZm9yIGFsbCBkb21haW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgY2xhc3MgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBhbmQgYWRkcyB0aW1lc3RhbXAgZnVuY3Rpb25hbGl0eS5cbiAqIEFsbCBkb21haW4gbW9kZWxzIGluIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW5oZXJpdCBjb21tb24gcHJvcGVydGllcyBhbmQgYmVoYXZpb3JzLlxuICogQHBhcmFtIHtNb2RlbEFyZzxCYXNlTW9kZWw+fSBhcmcgLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgbW9kZWxcbiAqIEBjbGFzcyBCYXNlTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiAgIFxuICogICBAZW1haWwoKVxuICogICBlbWFpbCE6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNb2RlbEFyZzxVc2VyPikge1xuICogICAgIHN1cGVyKGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IHVzZXJuYW1lOiAnam9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWRcbiAgICovXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkT24hOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFzdCB1cGRhdGUgdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIG1vZGlmaWVkXG4gICAqL1xuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZE9uITogRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8QmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/model/decorators.cjs
CHANGED
@@ -8,6 +8,8 @@ exports.unique = unique;
|
|
8
8
|
exports.createdByOnCreateUpdate = createdByOnCreateUpdate;
|
9
9
|
exports.createdBy = createdBy;
|
10
10
|
exports.updatedBy = updatedBy;
|
11
|
+
exports.createdAt = createdAt;
|
12
|
+
exports.updatedAt = updatedAt;
|
11
13
|
exports.oneToOne = oneToOne;
|
12
14
|
exports.oneToMany = oneToMany;
|
13
15
|
exports.manyToOne = manyToOne;
|
@@ -190,6 +192,12 @@ function updatedBy() {
|
|
190
192
|
.define((0, db_decorators_1.onCreateUpdate)(createdByOnCreateUpdate), (0, decorator_validation_1.propMetadata)(key, {}))
|
191
193
|
.apply();
|
192
194
|
}
|
195
|
+
function createdAt() {
|
196
|
+
return (0, db_decorators_1.timestamp)([db_decorators_1.OperationKeys.CREATE]);
|
197
|
+
}
|
198
|
+
function updatedAt() {
|
199
|
+
return (0, db_decorators_1.timestamp)();
|
200
|
+
}
|
193
201
|
/**
|
194
202
|
* @description Defines a one-to-one relationship between models
|
195
203
|
* @summary Decorator that establishes a one-to-one relationship between the current model and another model
|
@@ -403,4 +411,4 @@ function manyToMany(clazz, cascadeOptions = constants_2.DefaultCascade, populate
|
|
403
411
|
})
|
404
412
|
.apply();
|
405
413
|
}
|
406
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOENBLHNCQVFDO0FBVUQsd0JBWUM7QUFXRCxzQkFVQztBQW1CRCxvREFxQkM7QUFpQkQsd0JBS0M7QUFtQkQsMERBb0JDO0FBZ0JELDhCQUtDO0FBZ0JELDhCQUtDO0FBMkJELDRCQXdDQztBQThCRCw4QkF3Q0M7QUE4QkQsOEJBMkNDO0FBNkJELGdDQXVDQztBQXRnQkQsMkRBU2lDO0FBQ2pDLHFEQUF1RDtBQUN2RCw4REFBMkQ7QUFFM0QsNkRBQXlFO0FBQ3pFLHlFQVF3QztBQUN4QywwREFBaUQ7QUFDakQsK0RBQTREO0FBQzVELHdEQUErQztBQUUvQyxxREFRd0I7QUFDeEIsZ0RBQThDO0FBRTlDOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixLQUFLLENBQWdCLElBQVU7SUFDN0MsTUFBTSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxPQUFPLGlDQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUN2QixNQUFNLENBQUM7UUFDTixTQUFTLEVBQUUscUJBQVE7UUFDbkIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztLQUNsQixDQUFDO1NBQ0QsS0FBSyxFQUFFLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLE1BQU0sQ0FBZ0IsVUFBaUI7SUFDckQsTUFBTSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxPQUFPLGlDQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUN2QixNQUFNLENBQUM7UUFDTixTQUFTLEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxT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S0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsS0FBYTtZQUN4QyxNQUFNLENBQUMsSUFBSTtZQUNYLE1BQU0sQ0FBQyxJQUFJO1lBQ1gsTUFBTSxDQUFDLElBQUk7U0FDWixDQUFDO1FBQ0YseUNBQXlDO1FBQ3pDLHlDQUF5QztRQUN6Qyx5Q0FBeUM7UUFDekMsZ0NBQWdDO1FBQ2hDLElBQUEsbUNBQVksRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUFDO1FBQ04sU0FBUyxFQUFFLGFBQWE7UUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7S0FDeEMsQ0FBQztTQUNELEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgb25EZWxldGUsXG4gIG9uVXBkYXRlLFxuICBhZnRlckFueSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZU1ldGFkYXRhLCBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRDYXNjYWRlLCBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGxpc3QsXG4gIE1vZGVsLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG9uZVRvTWFueU9uQ3JlYXRlLFxuICBvbmVUb01hbnlPbkRlbGV0ZSxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIG9uZVRvT25lT25DcmVhdGUsXG4gIG9uZVRvT25lT25EZWxldGUsXG4gIG9uZVRvT25lT25VcGRhdGUsXG4gIHBvcHVsYXRlIGFzIHBvcCxcbn0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzXG4gKiBAZnVuY3Rpb24gdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZTxPUFRTID0gc3RyaW5nPihvcHRzOiBPUFRTKSB7XG4gIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1ldGFkYXRhLFxuICAgICAgYXJnczogW2tleSwgb3B0c10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgY29sdW1uIG5hbWUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY29sdW1uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sdW1uPE9QVFMgPSBzdHJpbmc+KGNvbHVtbk5hbWU/OiBPUFRTKSB7XG4gIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW4oaywgYykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29sdW1uKG9iajogYW55LCBhdHRyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhKGssIGMgfHwgYXR0cikob2JqLCBhdHRyKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBhcmdzOiBba2V5LCBjb2x1bW5OYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluZGV4IG9uIGEgbW9kZWwgcHJvcGVydHkgZm9yIGltcHJvdmVkIHF1ZXJ5IHBlcmZvcm1hbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIGJlIGluZGV4ZWQgaW4gdGhlIGRhdGFiYXNlLCBvcHRpb25hbGx5IHdpdGggc3BlY2lmaWMgZGlyZWN0aW9ucyBhbmQgY29tcG9zaXRpb25zXG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9uW119IFtkaXJlY3Rpb25zXSAtIE9wdGlvbmFsIGFycmF5IG9mIHNvcnQgZGlyZWN0aW9ucyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRvIGNyZWF0ZSBhIGNvbXBvc2l0ZSBpbmRleFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGluZGV4XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10sIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgUmVwb3NpdG9yeS5rZXkoXG4gICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICksXG4gICAge1xuICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgIGNvbXBvc2l0aW9uczogY29tcG9zaXRpb25zLFxuICAgIH0gYXMgSW5kZXhNZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmZvcmNlcyB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgZHVyaW5nIG1vZGVsIGNyZWF0aW9uIGFuZCB1cGRhdGVcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHVuaXF1ZSBkZWNvcmF0b3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2VcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIG1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlIG9yIHJlamVjdHMgd2l0aCBhIENvbmZsaWN0RXJyb3JcbiAqIEBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSkuZXEobW9kZWxba2V5XSkpXG4gICAgLmV4ZWN1dGUoKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlbnN1cmVzIGEgcHJvcGVydHkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdW5pcXVlKClcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQG9uZVRvT25lKFByb2ZpbGUpXG4gKiAgIHByb2ZpbGUhOiBzdHJpbmcgfCBQcm9maWxlO1xuICogfVxuICpcbiAqIGNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBiaW8hOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZTogYm9vbGVhbiA9IHRydWVcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBmdW5jdGlvbiBvbmVUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSwgbWV0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb09uZU9uVXBkYXRlLCBtZXRhKSxcbiAgICAgIG9uRGVsZXRlKG9uZVRvT25lT25EZWxldGUsIG1ldGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqXG4gKiAgIEBvbmVUb01hbnkoQm9vaylcbiAqICAgYm9va3MhOiBzdHJpbmdbXSB8IEJvb2tbXTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9PbmVcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZTogYm9vbGVhbiA9IHRydWVcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG9uZVRvTWFueURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+LFxuICAgICAgICBTdHJpbmcsXG4gICAgICAgIE51bWJlcixcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBCaWdpbnQgaXMgbm90IGEgY29uc3RydWN0b3JcbiAgICAgICAgQmlnSW50LFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvbmVUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWVcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcblxuICBmdW5jdGlvbiBtYW55VG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKCFjbGF6ei5uYW1lKVxuICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3I8TT4pKCkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtYW55VG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICpcbiAqICAgQG1hbnlUb09uZShBdXRob3IpXG4gKiAgIGF1dGhvciE6IHN0cmluZyB8IEF1dGhvcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlID0gdHJ1ZVxuKSB7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fTUFOWSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvTWFueURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQWxsKHBvcHVsYXRlLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiJdfQ==
|
414
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0RBLHNCQVFDO0FBVUQsd0JBWUM7QUFXRCxzQkFVQztBQW1CRCxvREFxQkM7QUFpQkQsd0JBS0M7QUFtQkQsMERBb0JDO0FBZ0JELDhCQUtDO0FBZ0JELDhCQUtDO0FBRUQsOEJBRUM7QUFFRCw4QkFFQztBQTJCRCw0QkF3Q0M7QUE4QkQsOEJBd0NDO0FBOEJELDhCQTJDQztBQTZCRCxnQ0F1Q0M7QUFoaEJELDJEQVdpQztBQUNqQyxxREFBdUQ7QUFDdkQsOERBQTJEO0FBRTNELDZEQUF5RTtBQUN6RSx5RUFRd0M7QUFDeEMsMERBQWlEO0FBQ2pELCtEQUE0RDtBQUM1RCx3REFBK0M7QUFFL0MscURBUXdCO0FBQ3hCLGdEQUE4QztBQUU5Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsS0FBSyxDQUFnQixJQUFVO0lBQzdDLE1BQU0sR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUFDO1FBQ04sU0FBUyxFQUFFLHFCQUFRO1FBQ25CLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7S0FDbEIsQ0FBQztTQUNELEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixNQUFNLENBQWdCLFVBQWlCO0lBQ3JELE1BQU0sR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUFDO1FBQ04sU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUMs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QUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxLQUFhO1lBQy9DLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFDRixPQUFPLElBQUEsa0JBQUssRUFDVixJQUFBLDJCQUFJLEVBQUMsMkJBQWUsQ0FBQyxTQUFTLENBQUMsRUFDL0IsSUFBQSwyQkFBSSxFQUFDO1lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsS0FBYTtZQUN4QyxNQUFNLENBQUMsSUFBSTtZQUNYLE1BQU0sQ0FBQyxJQUFJO1lBQ1gsTUFBTSxDQUFDLElBQUk7U0FDWixDQUFDO1FBQ0YseUNBQXlDO1FBQ3pDLHlDQUF5QztRQUN6Qyx5Q0FBeUM7UUFDekMsZ0NBQWdDO1FBQ2hDLElBQUEsbUNBQVksRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUFDO1FBQ04sU0FBUyxFQUFFLGFBQWE7UUFDeEIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7S0FDeEMsQ0FBQztTQUNELEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgb25EZWxldGUsXG4gIG9uVXBkYXRlLFxuICBhZnRlckFueSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0LFxuICB0aW1lc3RhbXAsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IHNldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cyAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3NcbiAqIEBmdW5jdGlvbiB0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlPE9QVFMgPSBzdHJpbmc+KG9wdHM6IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWV0YWRhdGEsXG4gICAgICBhcmdzOiBba2V5LCBvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleChkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSwgY29tcG9zaXRpb25zPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShcbiAgICAgIGAke1BlcnNpc3RlbmNlS2V5cy5JTkRFWH0ke2NvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoID8gYC4ke2NvbXBvc2l0aW9ucy5qb2luKFwiLlwiKX1gIDogXCJcIn1gXG4gICAgKSxcbiAgICB7XG4gICAgICBkaXJlY3Rpb25zOiBkaXJlY3Rpb25zLFxuICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgfSBhcyBJbmRleE1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVuZm9yY2VzIHVuaXF1ZW5lc3MgY29uc3RyYWludCBkdXJpbmcgbW9kZWwgY3JlYXRpb24gYW5kIHVwZGF0ZVxuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgdW5pcXVlIGRlY29yYXRvciB0byBjaGVjayBpZiBhIHByb3BlcnR5IHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhYmFzZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgbWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciB1bmlxdWVuZXNzXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2sgaXMgY29tcGxldGUgb3IgcmVqZWN0cyB3aXRoIGEgQ29uZmxpY3RFcnJvclxuICogQGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcShtb2RlbFtrZXldKSlcbiAgICAuZXhlY3V0ZSgpO1xuICBpZiAoZXhpc3RpbmcubGVuZ3RoKVxuICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgYG1vZGVsIGFscmVhZHkgZXhpc3RzIHdpdGggcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBlcXVhbCB0byAke0pTT04uc3RyaW5naWZ5KChtb2RlbCBhcyBhbnkpW2tleV0sIHVuZGVmaW5lZCwgMil9YFxuICAgICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRhZ3MgYSBwcm9wZXJ0eSBhcyB1bmlxdWVcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVuc3VyZXMgYSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1bmlxdWVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEB1bmlxdWUoKVxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlVXBkYXRlKHVuaXF1ZU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHVzZXIgaWRlbnRpZmljYXRpb24gZm9yIG93bmVyc2hpcCB0cmFja2luZ1xuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZGVjb3JhdG9ycyB0byBzZXQgb3duZXJzaGlwIGluZm9ybWF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzdG9yZSB0aGUgdXNlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoIGFuIEF1dGhvcml6YXRpb25FcnJvciBpZiB1c2VyIGlkZW50aWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBkYXRhOiBWLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBjcmVhdG9yIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQGNyZWF0ZWRCeSgpXG4gKiAgIGNyZWF0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgbGFzdCB1cGRhdGVyIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1cGRhdGVkQnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgRG9jdW1lbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdXBkYXRlZEJ5KClcbiAqICAgbGFzdEVkaXRvciE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcChbT3BlcmF0aW9uS2V5cy5DUkVBVEVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcCgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBvbmVUb09uZShQcm9maWxlKVxuICogICBwcm9maWxlITogc3RyaW5nIHwgUHJvZmlsZTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBQcm9maWxlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgYmlvITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgZnVuY3Rpb24gb25lVG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvT25lT25DcmVhdGUsIG1ldGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb09uZU9uRGVsZXRlLCBtZXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvbmVUb09uZURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgU3RyaW5nLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQmlnaW50IGlzIG5vdCBhIGNvbnN0cnVjdG9yXG4gICAgICAgIEJpZ0ludCxcbiAgICAgIF0pLFxuICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICpcbiAqICAgQG1hbnlUb09uZShBdXRob3IpXG4gKiAgIGF1dGhvciE6IHN0cmluZyB8IEF1dGhvcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuXG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICkge1xuICAgIGlmICghY2xhenoubmFtZSlcbiAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yPE0+KSgpIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWVcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFsbChwb3B1bGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtYW55VG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iXX0=
|
@@ -114,6 +114,8 @@ export declare function createdBy(): (target: any, propertyKey?: any, descriptor
|
|
114
114
|
* ```
|
115
115
|
*/
|
116
116
|
export declare function updatedBy(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
117
|
+
export declare function createdAt(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
118
|
+
export declare function updatedAt(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
117
119
|
/**
|
118
120
|
* @description Defines a one-to-one relationship between models
|
119
121
|
* @summary Decorator that establishes a one-to-one relationship between the current model and another model
|