Socket
Socket
Sign inDemoInstall

@tensorflow/tfjs-layers

Package Overview
Dependencies
Maintainers
9
Versions
157
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tensorflow/tfjs-layers - npm Package Compare versions

Comparing version 4.10.0 to 4.11.0

dist/layers/nlp/modeling/transformer_layer_utils.d.ts

2

dist/base_callbacks.js

@@ -491,2 +491,2 @@ /**

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jYWxsYmFja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFzZV9jYWxsYmFja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCx5Q0FBeUM7QUFFekMsT0FBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQWtCLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBTyxvQkFBb0IsRUFBaUIsTUFBTSxRQUFRLENBQUM7QUFDbEUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxvREFBb0Q7QUFDcEQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixxRUFBVSxDQUFBO0lBQ1YsdUVBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDO0FBRUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQVExQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFBbEM7UUFDRSxpREFBaUQ7UUFDakQsbUJBQWMsR0FBb0IsSUFBSSxDQUFDO0lBZ0N6QyxDQUFDO0lBMUJDLFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFxQixJQUFHLENBQUM7SUFFM0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUIsSUFBRyxDQUFDO0lBRXpELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElBQXFCLElBQUcsQ0FBQztJQUUzRCxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWEsRUFBRSxJQUFxQixJQUFHLENBQUM7SUFFekQsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQixJQUFHLENBQUM7SUFFNUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFxQixJQUFHLENBQUM7SUFFMUMsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsMEVBQTBFO0lBQzFFLDhFQUE4RTtJQUM5RSxtRUFBbUU7SUFDbkUsZUFBZTtJQUNmLFFBQVEsQ0FBQyxLQUFnQjtRQUN2Qix1RUFBdUU7SUFDekUsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUl2QixzRUFBc0U7SUFDdEUsdUNBQXVDO0lBQ3ZDLCtCQUErQjtJQUMvQiw0Q0FBNEM7SUFDNUMsMENBQTBDO0lBRTFDOzs7OztPQUtHO0lBQ0gsWUFBWSxTQUEwQixFQUFFLFdBQVcsR0FBRyxFQUFFO1FBQ3RELDJFQUEyRTtRQUMzRSxVQUFVO1FBQ1YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ3JCLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FDaEI7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXNCO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYztRQUN0QixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBZ0I7UUFDdkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBQ3JELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUI7UUFDbkQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLElBQUksR0FBRyxFQUFFLENBQUM7U0FDWDtRQUNELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFxQjtRQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNYO1FBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JDLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDMUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBQ25ELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXFCO1FBQ3RDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBcUI7UUFDcEMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLElBQUksR0FBRyxFQUFFLENBQUM7U0FDWDtRQUNELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFVBQVcsU0FBUSxZQUFZO0lBSTFDO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRVEsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFhO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVRLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBQzVELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQVcsQ0FBQztRQUNwRSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztRQUN2QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3RCO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVcsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDO2FBQ25FO2lCQUFNO2dCQUNMLElBQUksa0JBQTBCLENBQUM7Z0JBQy9CLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFXLENBQUM7aUJBQ2pEO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN0QjtnQkFDRCxNQUFNLEtBQUssR0FDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7b0JBQzlCLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUM5QjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUI7UUFDNUQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQWEsRUFBRTtnQkFDcEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDNUIsU0FBUztpQkFDVjtnQkFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ3BEO3FCQUFNO29CQUNMLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxHQUFHLEdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBVyxDQUFDLENBQUM7b0JBQzVCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRjtJQUNILENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLFlBQVk7SUFJOUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQjtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUI7UUFDNUQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLElBQUksR0FBRyxFQUFFLENBQUM7U0FDWDtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sUUFBUSxHQUF1RCxFQUFFLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ3JDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQVcsQ0FBQztvQkFDNUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztZQUNwRSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0NBQ0Y7QUFlRDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsWUFBWTtJQW1COUMsWUFBWSxJQUF3QixFQUFFLFVBQThCO1FBQ2xFLEtBQUssRUFBRSxDQUFDO1FBTEYsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFNdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUM7UUFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksTUFBTSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQztTQUMxQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRUFBZ0U7Z0JBQ2hFLG1EQUFtRCxDQUFDLENBQUM7U0FDMUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLCtEQUErRDtZQUMvRCxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBRSxJQUFvQjtRQUNoRSxNQUFNLEVBQUUsR0FBOEIsRUFBRSxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM5QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVRLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBRTlELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDM0IsTUFBTSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQVksQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVRLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBRTVELE1BQU0sRUFBRSxHQUE4QixFQUFFLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixNQUFNLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBWSxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLEVBQUU7WUFDL0IsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztTQUMvQjtRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVEsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFhLEVBQUUsSUFBcUI7UUFFOUQsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUMzQixNQUFNLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBWSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUI7UUFFNUQsTUFBTSxFQUFFLEdBQThCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sRUFBRTtZQUMvQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQy9CO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6QyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVEsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO1lBQzNCLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQVksQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQUVRLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBcUI7UUFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixNQUFNLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFZLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxTQUNvQixFQUNwQixVQUE2QjtJQUMvQixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFDckIsU0FBUyxHQUFHLEVBQWtCLENBQUM7S0FDaEM7SUFDRCxJQUFJLFNBQVMsWUFBWSxZQUFZLEVBQUU7UUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ3BCO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxZQUFZLEVBQUU7UUFDcEUsT0FBTyxTQUEyQixDQUFDO0tBQ3BDO0lBQ0QsOERBQThEO0lBQzlELE1BQU0sZUFBZSxHQUNqQixhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBeUIsQ0FBQztJQUM1RCxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQ3RCLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQU1EOzs7R0FHRztBQUNILE1BQWEsMkJBQTJCO0lBSXRDOztPQUVHO0lBQ0gsZ0JBQXVCLENBQUM7SUFFeEI7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsMkJBQTJCLENBQzlCLGNBQXNCLEVBQUUsbUJBQTRDO1FBQ3RFLElBQUksQ0FBQyxNQUFNLENBQ1AsY0FBYyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUN2RCxHQUFHLEVBQUUsQ0FBQyxxREFBcUQ7WUFDdkQsV0FBVyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLDJCQUEyQixDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3BFLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDL0Q7UUFDRCwyQkFBMkIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUN6RCxtQkFBbUIsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsbUJBQzJCO1FBQzFELEtBQUssTUFBTSxTQUFTLElBQUksMkJBQTJCLENBQUMsWUFBWSxFQUFFO1lBQ2hFLE1BQU0sWUFBWSxHQUFHLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFCLElBQUksSUFBSSxLQUFLLG1CQUFtQixFQUFFO29CQUNoQyxNQUFNLElBQUksVUFBVSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7aUJBQ3pEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNPLE1BQU0sQ0FBQyxLQUFLO1FBQ3BCLDJCQUEyQixDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLGNBQXNCO1FBQzNDLE1BQU0sWUFBWSxHQUE4QixFQUFFLENBQUM7UUFDbkQsS0FBSyxNQUFNLFNBQVMsSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUU7WUFDaEUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDekIsSUFBSSxjQUFjLElBQUksS0FBSyxFQUFFO2dCQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdkU7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDOztBQXRFYyx3Q0FBWSxHQUNpQyxFQUFFLENBQUM7U0FGcEQsMkJBQTJCO0FBMEV4QyxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLFNBQXlCLEVBQUUsT0FBOEIsRUFBRSxNQUFjLEVBQ3pFLFlBQW9CLEVBQUUsZUFBdUIsRUFBRSxhQUFxQixFQUNwRSxTQUFpQixFQUFFLFlBQXFCLEVBQ3hDLGVBQXlCO0lBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDOUIsTUFBTSxlQUFlLEdBQW1CO1FBQ3RDLElBQUksVUFBVSxFQUFFLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO0tBQzFFLENBQUM7SUFDRixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFDckIsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0tBQ3BDO0lBQ0QsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUV2RCxtRUFBbUU7SUFDbkUsY0FBYztJQUNkLHdEQUF3RDtJQUV4RCxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQ3JCLE1BQU07UUFDTixZQUFZO1FBQ1osT0FBTyxFQUFFLGVBQWU7UUFDeEIsS0FBSyxFQUFFLGFBQWE7UUFDcEIsU0FBUztRQUNULE9BQU87UUFDUCxZQUFZO1FBQ1osT0FBTyxFQUFFLGVBQWU7S0FDekIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9jYWxsYmFja3MucHkgKi9cblxuaW1wb3J0IHthZGQsIGRpdiwga2VlcCwgbXVsLCBuZXh0RnJhbWUsIFNjYWxhciwgVGVuc29yLCB0aWR5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NvbnRhaW5lcn0gZnJvbSAnLi9lbmdpbmUvY29udGFpbmVyJztcbmltcG9ydCB7VmFsdWVFcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtMb2dzLCByZXNvbHZlU2NhbGFyc0luTG9ncywgVW5yZXNvbHZlZExvZ3N9IGZyb20gJy4vbG9ncyc7XG5pbXBvcnQgKiBhcyBnZW5lcmljX3V0aWxzIGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5cbi8qKiBWZXJib3NpdHkgbG9nZ2luZyBsZXZlbCB3aGVuIGZpdHRpbmcgYSBtb2RlbC4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSB7XG4gIFNJTEVOVCA9IDAsXG4gIFZFUkJPU0UgPSAxXG59XG5cbi8qKiBIb3cgb2Z0ZW4gdG8geWllbGQgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdHJhaW5pbmcgKGluIG1zKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1lJRUxEX0VWRVJZX01TID0gMTI1O1xuXG5leHBvcnQgdHlwZSBQYXJhbXMgPSB7XG4gIFtrZXk6IHN0cmluZ106IG51bWJlcnxzdHJpbmd8Ym9vbGVhbnxudW1iZXJbXXxzdHJpbmdbXXxib29sZWFuW107XG59O1xuXG5leHBvcnQgdHlwZSBZaWVsZEV2ZXJ5T3B0aW9ucyA9ICdhdXRvJ3wnYmF0Y2gnfCdlcG9jaCd8J25ldmVyJ3xudW1iZXI7XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIHRvIGJ1aWxkIG5ldyBjYWxsYmFja3MuXG4gKlxuICogVGhlIGBsb2dzYCBkaWN0aW9uYXJ5IHRoYXQgY2FsbGJhY2sgbWV0aG9kcyB0YWtlIGFzIGFyZ3VtZW50IHdpbGwgY29udGFpblxuICoga2V5cyBmb3IgcXVhbnRpdGllcyByZWxldmFudCB0byB0aGUgY3VycmVudCBiYXRjaCBvciBlcG9jaC5cbiAqXG4gKiBDdXJyZW50bHksIHRoZSBgLmZpdCgpYCBtZXRob2Qgb2YgdGhlIGBTZXF1ZW50aWFsYCBtb2RlbCBjbGFzc1xuICogd2lsbCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcXVhbnRpdGllcyBpbiB0aGUgYGxvZ3NgIHRoYXRcbiAqIGl0IHBhc3NlcyB0byBpdHMgY2FsbGJhY2tzOlxuICpcbiAqIG9uRXBvY2hFbmQ6IExvZ3MgaW5jbHVkZSBgYWNjYCBhbmQgYGxvc3NgLCBhbmQgb3B0aW9uYWxseSBpbmNsdWRlIGB2YWxMb3NzYFxuICogICAoaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkIGluIGBmaXRgKSwgYW5kIGB2YWxBY2NgIChpZiB2YWxpZGF0aW9uIGFuZFxuICogICBhY2N1cmFjeSBtb25pdG9yaW5nIGFyZSBlbmFibGVkKS5cbiAqIG9uQmF0Y2hCZWdpbjogTG9ncyBpbmNsdWRlIGBzaXplYCwgdGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBjdXJyZW50XG4gKiAgIGJhdGNoLlxuICogb25CYXRjaEVuZDogTG9ncyBpbmNsdWRlIGBsb3NzYCwgYW5kIG9wdGlvbmFsbHkgYGFjY2AgKGlmIGFjY3VyYWN5IG1vbml0b3JpbmdcbiAqICAgaXMgZW5hYmxlZCkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ2FsbGJhY2sge1xuICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IFRoaXMgdHlwZSBpcyBhIGJlc3QgZ3Vlc3MuXG4gIHZhbGlkYXRpb25EYXRhOiBUZW5zb3J8VGVuc29yW10gPSBudWxsO1xuICAvKipcbiAgICogVHJhaW5pbmcgcGFyYW1ldGVycyAoZWcuIHZlcmJvc2l0eSwgYmF0Y2ggc2l6ZSwgbnVtYmVyIG9mIGVwb2Nocy4uLikuXG4gICAqL1xuICBwYXJhbXM6IFBhcmFtcztcblxuICBzZXRQYXJhbXMocGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIGFzeW5jIG9uRXBvY2hCZWdpbihlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25CYXRjaEJlZ2luKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICBhc3luYyBvbkJhdGNoRW5kKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICBhc3luYyBvblRyYWluQmVnaW4obG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIC8vIExheWVyc01vZGVsIG5lZWRzIHRvIGNhbGwgQ2FsbGJhY2suc2V0TW9kZWwoKSwgYnV0IGNhbm5vdCBhY3R1YWxseSBkZXBlbmRcbiAgLy8gb24gQ2FsbGJhY2sgYmVjYXVzZSB0aGF0IGNyZWF0ZXMgYSBjeWNsaWMgZGVwZW5kZW5jeS4gIFByb3ZpZGluZyB0aGlzIG5vLW9wXG4gIC8vIG1ldGhvZCBvbiBCYXNlQ2FsbGJhY2sgYnJlYWtzIHRoZSBjeWNsZTogdGhpcyB3YXkgTGF5ZXJzTW9kZWwgY2FuIGRlcGVuZCBvblxuICAvLyBCYXNlQ2FsbGJhY2sgYnV0IG5vdCBvbiBDYWxsYmFjay4gIFRoZSBhcmd1bWVudCBpcyB0eXBlZCBhcyBgQ29udGFpbmVyYFxuICAvLyAodGhlIHN1cGVyY2xhc3Mgb2YgTGF5ZXJzTW9kZWwpIHRvIGF2b2lkIHJlY2FwaXR1bGF0aW5nIHRoZSBjeWNsZS4gQ2FsbGJhY2tcbiAgLy8gb3ZlcnJpZGVzIHRoaXMgbWV0aG9kIGFuZCBlbmZvcmNlcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZWFsbHkgYVxuICAvLyBMYXllcnNNb2RlbC5cbiAgc2V0TW9kZWwobW9kZWw6IENvbnRhaW5lcik6IHZvaWQge1xuICAgIC8vIERvIG5vdGhpbmcuIFVzZSBDYWxsYmFjayBpbnN0ZWFkIG9mIEJhc2VDYWxsYmFjayB0byB0cmFjayB0aGUgbW9kZWwuXG4gIH1cbn1cblxuLyoqXG4gKiBDb250YWluZXIgYWJzdHJhY3RpbmcgYSBsaXN0IG9mIGNhbGxiYWNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrTGlzdCB7XG4gIGNhbGxiYWNrczogQmFzZUNhbGxiYWNrW107XG4gIHF1ZXVlTGVuZ3RoOiBudW1iZXI7XG5cbiAgLy8gVE9ETyhjYWlzKTogV2hlbiB0aGUgbmVlZCBhcmlzZXMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzIGFuZFxuICAvLyBpbXBsZW1lbnQgdGhlIHF1ZXVlIGZvciB0aW1lIHZhbHVlcy5cbiAgLy8gcHJpdmF0ZSBkZWx0YVRCYXRjaDogbnVtYmVyO1xuICAvLyBwcml2YXRlIGRlbHRhVHNCYXRjaEJlZ2luOiBBcnJheTxudW1iZXI+O1xuICAvLyBwcml2YXRlIGRlbHRhVHNCYXRjaEVuZDogQXJyYXk8bnVtYmVyPjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3Igb2YgQ2FsbGJhY2tMaXN0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2tzIEFycmF5IG9mIGBDYWxsYmFja2AgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0gcXVldWVMZW5ndGggUXVldWUgbGVuZ3RoIGZvciBrZWVwaW5nIHJ1bm5pbmcgc3RhdGlzdGljcyBvdmVyXG4gICAqICAgY2FsbGJhY2sgZXhlY3V0aW9uIHRpbWUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYWxsYmFja3M/OiBCYXNlQ2FsbGJhY2tbXSwgcXVldWVMZW5ndGggPSAxMCkge1xuICAgIC8vIFRPRE8oY2Fpcyk6IE1ha2UgdXNlIG9mIHF1ZXVlTGVuZ3RoIHdoZW4gaW1wbGVtZW50aW5nIHRoZSBxdWV1ZSBmb3IgdGltZVxuICAgIC8vIHZhbHVlcy5cbiAgICBpZiAoY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrcztcbiAgICB0aGlzLnF1ZXVlTGVuZ3RoID0gcXVldWVMZW5ndGg7XG4gIH1cblxuICBhcHBlbmQoY2FsbGJhY2s6IEJhc2VDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgc2V0UGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgY2FsbGJhY2suc2V0UGFyYW1zKHBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgc2V0TW9kZWwobW9kZWw6IENvbnRhaW5lcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrLnNldE1vZGVsKG1vZGVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhbiBlcG9jaC5cbiAgICogQHBhcmFtIGVwb2NoIEluZGV4IG9mIGVwb2NoLlxuICAgKiBAcGFyYW0gbG9ncyBEaWN0aW9uYXJ5IG9mIGxvZ3MuXG4gICAqL1xuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vbkVwb2NoQmVnaW4oZXBvY2gsIGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBhbiBlcG9jaC5cbiAgICogQHBhcmFtIGVwb2NoIEluZGV4IG9mIGVwb2NoLlxuICAgKiBAcGFyYW0gbG9ncyBEaWN0aW9uYXJ5IG9mIGxvZ3MuXG4gICAqL1xuICBhc3luYyBvbkVwb2NoRW5kKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25FcG9jaEVuZChlcG9jaCwgbG9ncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCAgcmlnaHQgYmVmb3JlIHByb2Nlc3NpbmcgYSBiYXRjaC5cbiAgICogQHBhcmFtIGJhdGNoIEluZGV4IG9mIGJhdGNoIHdpdGhpbiB0aGUgY3VycmVudCBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25CYXRjaEJlZ2luKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25CYXRjaEJlZ2luKGJhdGNoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBiYXRjaC5cbiAgICogQHBhcmFtIGJhdGNoIEluZGV4IG9mIGJhdGNoIHdpdGhpbiB0aGUgY3VycmVudCBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uQmF0Y2hFbmQoYmF0Y2gsIGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0cmFpbmluZy5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25UcmFpbkJlZ2luKGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0cmFpbmluZy5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25UcmFpbkVuZChsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uVHJhaW5FbmQobG9ncyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdGhhdCBhY2N1bXVsYXRlcyBlcG9jaCBhdmVyYWdlcyBvZiBtZXRyaWNzLlxuICpcbiAqIFRoaXMgY2FsbGJhY2sgaXMgYXV0b21hdGljYWxseSBhcHBsaWVkIHRvIGV2ZXJ5IExheWVyc01vZGVsLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUxvZ2dlciBleHRlbmRzIEJhc2VDYWxsYmFjayB7XG4gIHByaXZhdGUgc2VlbjogbnVtYmVyO1xuICBwcml2YXRlIHRvdGFsczogVW5yZXNvbHZlZExvZ3M7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uRXBvY2hCZWdpbihlcG9jaDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWVuID0gMDtcbiAgICB0aGlzLnRvdGFscyA9IHt9O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGxvZ3NbJ3NpemUnXSA9PSBudWxsID8gMCA6IGxvZ3NbJ3NpemUnXSBhcyBudW1iZXI7XG4gICAgdGhpcy5zZWVuICs9IGJhdGNoU2l6ZTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2dzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGxvZ3Nba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmICghdGhpcy50b3RhbHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRoaXMudG90YWxzW2tleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxzW2tleV0gPSB0aGlzLnRvdGFsc1trZXldIGFzIG51bWJlciArIHZhbHVlICogYmF0Y2hTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG9sZFRvdGFsc1RvRGlzcG9zZTogU2NhbGFyO1xuICAgICAgICBpZiAoa2V5IGluIHRoaXMudG90YWxzKSB7XG4gICAgICAgICAgb2xkVG90YWxzVG9EaXNwb3NlID0gdGhpcy50b3RhbHNba2V5XSBhcyBTY2FsYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50b3RhbHNba2V5XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWw6IFNjYWxhciA9XG4gICAgICAgICAgICB0aWR5KCgpID0+IGFkZCgodGhpcy50b3RhbHNba2V5XSksIG11bCh2YWx1ZSwgYmF0Y2hTaXplKSkpO1xuICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gdG90YWw7XG4gICAgICAgIGlmIChvbGRUb3RhbHNUb0Rpc3Bvc2UgIT0gbnVsbCkge1xuICAgICAgICAgIG9sZFRvdGFsc1RvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBvbkVwb2NoRW5kKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMucGFyYW1zWydtZXRyaWNzJ10gYXMgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKHRoaXMudG90YWxzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50b3RhbHNba2V5XSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dzW2tleV0gPSB0aGlzLnRvdGFsc1trZXldIGFzIG51bWJlciAvIHRoaXMuc2VlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvZzogU2NhbGFyID0gbXVsKGRpdigxLCB0aGlzLnNlZW4pLCB0aGlzLnRvdGFsc1trZXldKTtcbiAgICAgICAgICAgIGxvZ3Nba2V5XSA9IGxvZztcbiAgICAgICAgICAgICh0aGlzLnRvdGFsc1trZXldIGFzIFRlbnNvcikuZGlzcG9zZSgpO1xuICAgICAgICAgICAga2VlcChsb2dzW2tleV0gYXMgU2NhbGFyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmVjb3JkcyBldmVudHMgaW50byBhIGBIaXN0b3J5YCBvYmplY3QuIFRoaXMgY2FsbGJhY2sgaXNcbiAqIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBldmVyeSBURi5qcyBMYXllcnMgbW9kZWwuIFRoZSBgSGlzdG9yeWAgb2JqZWN0XG4gKiBnZXRzIHJldHVybmVkIGJ5IHRoZSBgZml0YCBtZXRob2Qgb2YgbW9kZWxzLlxuICovXG5leHBvcnQgY2xhc3MgSGlzdG9yeSBleHRlbmRzIEJhc2VDYWxsYmFjayB7XG4gIGVwb2NoOiBudW1iZXJbXTtcbiAgaGlzdG9yeToge1trZXk6IHN0cmluZ106IEFycmF5PG51bWJlcnxUZW5zb3I+fTtcblxuICBvdmVycmlkZSBhc3luYyBvblRyYWluQmVnaW4obG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgdGhpcy5lcG9jaCA9IFtdO1xuICAgIHRoaXMuaGlzdG9yeSA9IHt9O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIHRoaXMuZXBvY2gucHVzaChlcG9jaCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9ncykge1xuICAgICAgaWYgKHRoaXMuaGlzdG9yeVtrZXldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5W2tleV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlzdG9yeVtrZXldLnB1c2gobG9nc1trZXldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXdhaXQgdGhlIHZhbHVlcyBvZiBhbGwgbG9zc2VzIGFuZCBtZXRyaWNzLlxuICAgKi9cbiAgYXN5bmMgc3luY0RhdGEoKSB7XG4gICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8RmxvYXQzMkFycmF5fEludDMyQXJyYXl8VWludDhBcnJheT4+ID0gW107XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaGlzdG9yeSkge1xuICAgICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMuaGlzdG9yeVtrZXldO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVBcnJheVtpXSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZVNjYWxhciA9IHZhbHVlQXJyYXlbaV0gYXMgVGVuc29yO1xuICAgICAgICAgIHByb21pc2VzLnB1c2godmFsdWVTY2FsYXIuZGF0YSgpKTtcbiAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICBpbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdmFsdWVzLmxlbmd0aDsgKytuKSB7XG4gICAgICBjb25zdCB0ZW5zb3JUb0Rpc3Bvc2UgPSB0aGlzLmhpc3Rvcnlba2V5c1tuXV1baW5kaWNlc1tuXV0gYXMgVGVuc29yO1xuICAgICAgdGVuc29yVG9EaXNwb3NlLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuaGlzdG9yeVtrZXlzW25dXVtpbmRpY2VzW25dXSA9IHZhbHVlc1tuXVswXTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21DYWxsYmFja0FyZ3Mge1xuICBvblRyYWluQmVnaW4/OiAobG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvblRyYWluRW5kPzogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25FcG9jaEJlZ2luPzogKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25FcG9jaEVuZD86IChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uQmF0Y2hCZWdpbj86IChiYXRjaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uQmF0Y2hFbmQ/OiAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbllpZWxkPzogKGVwb2NoOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsIGxvZ3M6IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAvLyBVc2VkIGZvciB0ZXN0IERJIG1vY2tpbmcuXG4gIG5vd0Z1bmM/OiBGdW5jdGlvbjtcbiAgbmV4dEZyYW1lRnVuYz86IEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEN1c3RvbSBjYWxsYmFjayBmb3IgdHJhaW5pbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21DYWxsYmFjayBleHRlbmRzIEJhc2VDYWxsYmFjayB7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFpbkJlZ2luOiAobG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhaW5FbmQ6IChsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBlcG9jaEJlZ2luOlxuICAgICAgKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVwb2NoRW5kOlxuICAgICAgKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhdGNoQmVnaW46XG4gICAgICAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmF0Y2hFbmQ6XG4gICAgICAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgeWllbGQ6XG4gICAgICAoZXBvY2g6IG51bWJlciwgYmF0Y2g6IG51bWJlciwgbG9nczogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbiAgcHJpdmF0ZSB5aWVsZEV2ZXJ5OiBZaWVsZEV2ZXJ5T3B0aW9ucztcbiAgcHJpdmF0ZSBjdXJyZW50RXBvY2ggPSAwO1xuICBwdWJsaWMgbm93RnVuYzogRnVuY3Rpb247XG4gIHB1YmxpYyBuZXh0RnJhbWVGdW5jOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBDdXN0b21DYWxsYmFja0FyZ3MsIHlpZWxkRXZlcnk/OiBZaWVsZEV2ZXJ5T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5ub3dGdW5jID0gYXJncy5ub3dGdW5jO1xuICAgIHRoaXMubmV4dEZyYW1lRnVuYyA9IGFyZ3MubmV4dEZyYW1lRnVuYyB8fCBuZXh0RnJhbWU7XG4gICAgdGhpcy55aWVsZEV2ZXJ5ID0geWllbGRFdmVyeSB8fCAnYXV0byc7XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ2F1dG8nKSB7XG4gICAgICB0aGlzLnlpZWxkRXZlcnkgPSBERUZBVUxUX1lJRUxEX0VWRVJZX01TO1xuICAgIH1cbiAgICBpZiAodGhpcy55aWVsZEV2ZXJ5ID09PSAnbmV2ZXInICYmIGFyZ3Mub25ZaWVsZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3lpZWxkRXZlcnkgaXMgYG5ldmVyYCBidXQgeW91IHByb3ZpZGVkIGFuIGBvbllpZWxkYCBjYWxsYmFjay4gJyArXG4gICAgICAgICAgJ0VpdGhlciBjaGFuZ2UgYHlpZWxkRXZlcnlgIG9yIHJlbW92ZSB0aGUgY2FsbGJhY2snKTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaXNOdW1iZXIodGhpcy55aWVsZEV2ZXJ5KSkge1xuICAgICAgLy8gRGVjb3JhdGUgYG1heWJlV2FpdGAgc28gaXQgd2lsbCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIGV2ZXJ5XG4gICAgICAvLyBgeWllbGRFdmVyeWAgbXMuXG4gICAgICB0aGlzLm1heWJlV2FpdCA9IGdlbmVyaWNfdXRpbHMuZGVib3VuY2UoXG4gICAgICAgICAgdGhpcy5tYXliZVdhaXQuYmluZCh0aGlzKSwgdGhpcy55aWVsZEV2ZXJ5IGFzIG51bWJlciwgdGhpcy5ub3dGdW5jKTtcbiAgICB9XG4gICAgdGhpcy50cmFpbkJlZ2luID0gYXJncy5vblRyYWluQmVnaW47XG4gICAgdGhpcy50cmFpbkVuZCA9IGFyZ3Mub25UcmFpbkVuZDtcbiAgICB0aGlzLmVwb2NoQmVnaW4gPSBhcmdzLm9uRXBvY2hCZWdpbjtcbiAgICB0aGlzLmVwb2NoRW5kID0gYXJncy5vbkVwb2NoRW5kO1xuICAgIHRoaXMuYmF0Y2hCZWdpbiA9IGFyZ3Mub25CYXRjaEJlZ2luO1xuICAgIHRoaXMuYmF0Y2hFbmQgPSBhcmdzLm9uQmF0Y2hFbmQ7XG4gICAgdGhpcy55aWVsZCA9IGFyZ3Mub25ZaWVsZDtcbiAgfVxuXG4gIGFzeW5jIG1heWJlV2FpdChlcG9jaDogbnVtYmVyLCBiYXRjaDogbnVtYmVyLCBsb2dzOiBVbnJlc29sdmVkTG9ncykge1xuICAgIGNvbnN0IHBzOiBBcnJheTx2b2lkfFByb21pc2U8dm9pZD4+ID0gW107XG4gICAgaWYgKHRoaXMueWllbGQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBwcy5wdXNoKHRoaXMueWllbGQoZXBvY2gsIGJhdGNoLCBsb2dzIGFzIExvZ3MpKTtcbiAgICB9XG4gICAgcHMucHVzaCh0aGlzLm5leHRGcmFtZUZ1bmMoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25FcG9jaEJlZ2luKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncyk6XG4gICAgICBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmN1cnJlbnRFcG9jaCA9IGVwb2NoO1xuICAgIGlmICh0aGlzLmVwb2NoQmVnaW4gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLmVwb2NoQmVnaW4oZXBvY2gsIGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOlxuICAgICAgUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHM6IEFycmF5PHZvaWR8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBpZiAodGhpcy5lcG9jaEVuZCAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIHBzLnB1c2godGhpcy5lcG9jaEVuZChlcG9jaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdlcG9jaCcpIHtcbiAgICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBvbkJhdGNoQmVnaW4oYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKTpcbiAgICAgIFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmJhdGNoQmVnaW4gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLmJhdGNoQmVnaW4oYmF0Y2gsIGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOlxuICAgICAgUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHM6IEFycmF5PHZvaWR8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBpZiAodGhpcy5iYXRjaEVuZCAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIHBzLnB1c2godGhpcy5iYXRjaEVuZChiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdiYXRjaCcpIHtcbiAgICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5pc051bWJlcih0aGlzLnlpZWxkRXZlcnkpKSB7XG4gICAgICBwcy5wdXNoKHRoaXMubWF5YmVXYWl0KHRoaXMuY3VycmVudEVwb2NoLCBiYXRjaCwgbG9ncykpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBvblRyYWluQmVnaW4obG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5CZWdpbiAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIGF3YWl0IHRoaXMudHJhaW5CZWdpbihsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5FbmQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLnRyYWluRW5kKGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemUgY2FsbGJhY2tzIG9yIGNvbmZpZ3VyYXRpb25zIG9mIHRoZW0gdG8gYW4gQXJyYXkgb2YgY2FsbGJhY2tzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2t8QmFzZUNhbGxiYWNrW118Q3VzdG9tQ2FsbGJhY2tBcmdzfFxuICAgIEN1c3RvbUNhbGxiYWNrQXJnc1tdLFxuICAgIHlpZWxkRXZlcnk6IFlpZWxkRXZlcnlPcHRpb25zKTogQmFzZUNhbGxiYWNrW10ge1xuICBpZiAoY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICBjYWxsYmFja3MgPSB7fSBhcyBCYXNlQ2FsbGJhY2s7XG4gIH1cbiAgaWYgKGNhbGxiYWNrcyBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBbY2FsbGJhY2tzXTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjYWxsYmFja3MpICYmIGNhbGxiYWNrc1swXSBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBjYWxsYmFja3MgYXMgQmFzZUNhbGxiYWNrW107XG4gIH1cbiAgLy8gQ29udmVydCBjdXN0b20gY2FsbGJhY2sgY29uZmlncyB0byBjdXN0b20gY2FsbGJhY2sgb2JqZWN0cy5cbiAgY29uc3QgY2FsbGJhY2tDb25maWdzID1cbiAgICAgIGdlbmVyaWNfdXRpbHMudG9MaXN0KGNhbGxiYWNrcykgYXMgQ3VzdG9tQ2FsbGJhY2tBcmdzW107XG4gIHJldHVybiBjYWxsYmFja0NvbmZpZ3MubWFwKFxuICAgICAgY2FsbGJhY2tDb25maWcgPT4gbmV3IEN1c3RvbUNhbGxiYWNrKGNhbGxiYWNrQ29uZmlnLCB5aWVsZEV2ZXJ5KSk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IgPSB7XG4gIG5ldyAoKTogQmFzZUNhbGxiYWNrXG59O1xuXG4vKipcbiAqIEEgZ2xvYmFsIHJlZ2lzdHJ5IGZvciBjYWxsYmFjayBjb25zdHJ1Y3RvcnMgdG8gYmUgdXNlZCBkdXJpbmdcbiAqIExheWVyc01vZGVsLmZpdCgpLlxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgY29uc3RydWN0b3JzOlxuICAgICAge1t2ZXJib3NpdHlMZXZlbDogbnVtYmVyXTogQmFzZUNhbGxiYWNrQ29uc3RydWN0b3JbXX0gPSB7fTtcblxuICAvKipcbiAgICogQmxvY2tzIHB1YmxpYyBhY2Nlc3MgdG8gY29uc3RydWN0b3IuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB0Zi5MYXllcnNNb2RlbC5maXQoKSBjYWxsYmFjayBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlXG4gICAqIGNhbGxiYWNrcyBmb3IgZXZlcnkgdGYuTGF5ZXJzTW9kZWwuZml0KCkgY2FsbCBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWwgTGV2ZWwgb2YgdmVyYm9zaXR5IGF0IHdoaWNoIHRoZSBgY2FsbGJhY2tDb25zdHJ1Y3RvcmBcbiAgICogICBpcyB0byBiZSByZWlnc3RlcmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tDb25zdHJ1Y3RvciBBIG5vLWFyZyBjb25zdHJ1Y3RvciBmb3IgYHRmLkNhbGxiYWNrYC5cbiAgICogQHRocm93cyBFcnJvciwgaWYgdGhlIHNhbWUgY2FsbGJhY2tDb25zdHJ1Y3RvciBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSxcbiAgICogICBlaXRoZXIgYXQgdGhlIHNhbWUgb3IgYSBkaWZmZXJlbnQgYHZlcmJvc2l0eUxldmVsYC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3IoXG4gICAgICB2ZXJib3NpdHlMZXZlbDogbnVtYmVyLCBjYWxsYmFja0NvbnN0cnVjdG9yOiBCYXNlQ2FsbGJhY2tDb25zdHJ1Y3Rvcikge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB2ZXJib3NpdHlMZXZlbCA+PSAwICYmIE51bWJlci5pc0ludGVnZXIodmVyYm9zaXR5TGV2ZWwpLFxuICAgICAgICAoKSA9PiBgVmVyYm9zaXR5IGxldmVsIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIgPj0gMCwgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCAke3ZlcmJvc2l0eUxldmVsfWApO1xuICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yKTtcbiAgICBpZiAoQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPT0gbnVsbCkge1xuICAgICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPSBbXTtcbiAgICB9XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0ucHVzaChcbiAgICAgICAgY2FsbGJhY2tDb25zdHJ1Y3Rvcik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IpIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzWytsZXZlbE5hbWVdO1xuICAgICAgY29uc3RydWN0b3JzLmZvckVhY2goY3RvciA9PiB7XG4gICAgICAgIGlmIChjdG9yID09PSBjYWxsYmFja0NvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0R1cGxpY2F0ZSBjYWxsYmFjayBjb25zdHJ1Y3Rvci4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrIGNvbnN0cnVjdG9ycy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgY2xlYXIoKSB7XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9ycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYWxsYmFja3MgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3JzLlxuICAgKlxuICAgKiBHaXZlbiBgdmVyYm9zaXR5TGV2ZWxgLCBhbGwgY29uc3RydWN0b3JzIHJlZ2lzdGVyZWQgYXQgdGhhdCBsZXZlbCBvciBhYm92ZVxuICAgKiB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIGluc3RhbnRpYXRlZCBjYWxsYmFja3Mgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWw6IExldmVsIG9mIHZlcmJvc2l0eS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVDYWxsYmFja3ModmVyYm9zaXR5TGV2ZWw6IG51bWJlcik6IEJhc2VDYWxsYmFja1tdIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnM6IEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBsZXZlbCA9ICtsZXZlbE5hbWU7XG4gICAgICBpZiAodmVyYm9zaXR5TGV2ZWwgPj0gbGV2ZWwpIHtcbiAgICAgICAgY29uc3RydWN0b3JzLnB1c2goLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1tsZXZlbF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uc3RydWN0b3JzLm1hcChjdG9yID0+IG5ldyBjdG9yKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2tbXSwgdmVyYm9zZTogTW9kZWxMb2dnaW5nVmVyYm9zaXR5LCBlcG9jaHM6IG51bWJlcixcbiAgICBpbml0aWFsRXBvY2g6IG51bWJlciwgbnVtVHJhaW5TYW1wbGVzOiBudW1iZXIsIHN0ZXBzUGVyRXBvY2g6IG51bWJlcixcbiAgICBiYXRjaFNpemU6IG51bWJlciwgZG9WYWxpZGF0aW9uOiBib29sZWFuLFxuICAgIGNhbGxiYWNrTWV0cmljczogc3RyaW5nW10pOiB7Y2FsbGJhY2tMaXN0OiBDYWxsYmFja0xpc3QsIGhpc3Rvcnk6IEhpc3Rvcnl9IHtcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gIGNvbnN0IGFjdHVhbENhbGxiYWNrczogQmFzZUNhbGxiYWNrW10gPSBbXG4gICAgbmV3IEJhc2VMb2dnZXIoKSwgLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNyZWF0ZUNhbGxiYWNrcyh2ZXJib3NlKVxuICBdO1xuICBpZiAoY2FsbGJhY2tzICE9IG51bGwpIHtcbiAgICBhY3R1YWxDYWxsYmFja3MucHVzaCguLi5jYWxsYmFja3MpO1xuICB9XG4gIGFjdHVhbENhbGxiYWNrcy5wdXNoKGhpc3RvcnkpO1xuICBjb25zdCBjYWxsYmFja0xpc3QgPSBuZXcgQ2FsbGJhY2tMaXN0KGFjdHVhbENhbGxiYWNrcyk7XG5cbiAgLy8gVE9ETyhjYWlzKTogRmlndXJlIG91dCB3aGVuIHRoaXMgTGF5ZXJzTW9kZWwgaW5zdGFuY2UgY2FuIGhhdmUgYVxuICAvLyBkeW5hbWljYWxseVxuICAvLyAgIHNldCBwcm9wZXJ0eSBjYWxsZWQgJ2NhbGxiYWNrX21vZGVsJyBhcyBpbiBQeUtlcmFzLlxuXG4gIGNhbGxiYWNrTGlzdC5zZXRQYXJhbXMoe1xuICAgIGVwb2NocyxcbiAgICBpbml0aWFsRXBvY2gsXG4gICAgc2FtcGxlczogbnVtVHJhaW5TYW1wbGVzLFxuICAgIHN0ZXBzOiBzdGVwc1BlckVwb2NoLFxuICAgIGJhdGNoU2l6ZSxcbiAgICB2ZXJib3NlLFxuICAgIGRvVmFsaWRhdGlvbixcbiAgICBtZXRyaWNzOiBjYWxsYmFja01ldHJpY3MsXG4gIH0pO1xuICByZXR1cm4ge2NhbGxiYWNrTGlzdCwgaGlzdG9yeX07XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jYWxsYmFja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFzZV9jYWxsYmFja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCx5Q0FBeUM7QUFFekMsT0FBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQWtCLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBTyxvQkFBb0IsRUFBaUIsTUFBTSxRQUFRLENBQUM7QUFDbEUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxvREFBb0Q7QUFDcEQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixxRUFBVSxDQUFBO0lBQ1YsdUVBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDO0FBRUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQVExQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFBbEM7UUFDRSxpREFBaUQ7UUFDakQsbUJBQWMsR0FBb0IsSUFBSSxDQUFDO0lBZ0N6QyxDQUFDO0lBMUJDLFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFxQixJQUFHLENBQUM7SUFFM0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUIsSUFBRyxDQUFDO0lBRXpELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElB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U0FBaUIsRUFBRSxZQUFxQixFQUN4QyxlQUF5QjtJQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sZUFBZSxHQUFtQjtRQUN0QyxJQUFJLFVBQVUsRUFBRSxFQUFFLEdBQUcsMkJBQTJCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztLQUMxRSxDQUFDO0lBQ0YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1FBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztLQUNwQztJQUNELGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFdkQsbUVBQW1FO0lBQ25FLGNBQWM7SUFDZCx3REFBd0Q7SUFFeEQsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNyQixNQUFNO1FBQ04sWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFNBQVM7UUFDVCxPQUFPO1FBQ1AsWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO0tBQ3pCLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBQyxZQUFZLEVBQUUsT0FBTyxFQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMvY2FsbGJhY2tzLnB5ICovXG5cbmltcG9ydCB7YWRkLCBkaXYsIGtlZXAsIG11bCwgbmV4dEZyYW1lLCBTY2FsYXIsIFRlbnNvciwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4vZW5naW5lL2NvbnRhaW5lcic7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TG9ncywgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MsIFVucmVzb2x2ZWRMb2dzfSBmcm9tICcuL2xvZ3MnO1xuaW1wb3J0ICogYXMgZ2VuZXJpY191dGlscyBmcm9tICcuL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vKiogVmVyYm9zaXR5IGxvZ2dpbmcgbGV2ZWwgd2hlbiBmaXR0aW5nIGEgbW9kZWwuICovXG5leHBvcnQgZW51bSBNb2RlbExvZ2dpbmdWZXJib3NpdHkge1xuICBTSUxFTlQgPSAwLFxuICBWRVJCT1NFID0gMVxufVxuXG4vKiogSG93IG9mdGVuIHRvIHlpZWxkIHRvIHRoZSBtYWluIHRocmVhZCB3aGVuIHRyYWluaW5nIChpbiBtcykuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ZSUVMRF9FVkVSWV9NUyA9IDEyNTtcblxuZXhwb3J0IHR5cGUgUGFyYW1zID0ge1xuICBba2V5OiBzdHJpbmddOiBudW1iZXJ8c3RyaW5nfGJvb2xlYW58bnVtYmVyW118c3RyaW5nW118Ym9vbGVhbltdO1xufTtcblxuZXhwb3J0IHR5cGUgWWllbGRFdmVyeU9wdGlvbnMgPSAnYXV0byd8J2JhdGNoJ3wnZXBvY2gnfCduZXZlcid8bnVtYmVyO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCB0byBidWlsZCBuZXcgY2FsbGJhY2tzLlxuICpcbiAqIFRoZSBgbG9nc2AgZGljdGlvbmFyeSB0aGF0IGNhbGxiYWNrIG1ldGhvZHMgdGFrZSBhcyBhcmd1bWVudCB3aWxsIGNvbnRhaW5cbiAqIGtleXMgZm9yIHF1YW50aXRpZXMgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgYmF0Y2ggb3IgZXBvY2guXG4gKlxuICogQ3VycmVudGx5LCB0aGUgYC5maXQoKWAgbWV0aG9kIG9mIHRoZSBgU2VxdWVudGlhbGAgbW9kZWwgY2xhc3NcbiAqIHdpbGwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHF1YW50aXRpZXMgaW4gdGhlIGBsb2dzYCB0aGF0XG4gKiBpdCBwYXNzZXMgdG8gaXRzIGNhbGxiYWNrczpcbiAqXG4gKiBvbkVwb2NoRW5kOiBMb2dzIGluY2x1ZGUgYGFjY2AgYW5kIGBsb3NzYCwgYW5kIG9wdGlvbmFsbHkgaW5jbHVkZSBgdmFsTG9zc2BcbiAqICAgKGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZCBpbiBgZml0YCksIGFuZCBgdmFsQWNjYCAoaWYgdmFsaWRhdGlvbiBhbmRcbiAqICAgYWNjdXJhY3kgbW9uaXRvcmluZyBhcmUgZW5hYmxlZCkuXG4gKiBvbkJhdGNoQmVnaW46IExvZ3MgaW5jbHVkZSBgc2l6ZWAsIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgY3VycmVudFxuICogICBiYXRjaC5cbiAqIG9uQmF0Y2hFbmQ6IExvZ3MgaW5jbHVkZSBgbG9zc2AsIGFuZCBvcHRpb25hbGx5IGBhY2NgIChpZiBhY2N1cmFjeSBtb25pdG9yaW5nXG4gKiAgIGlzIGVuYWJsZWQpLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNhbGxiYWNrIHtcbiAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBUaGlzIHR5cGUgaXMgYSBiZXN0IGd1ZXNzLlxuICB2YWxpZGF0aW9uRGF0YTogVGVuc29yfFRlbnNvcltdID0gbnVsbDtcbiAgLyoqXG4gICAqIFRyYWluaW5nIHBhcmFtZXRlcnMgKGVnLiB2ZXJib3NpdHksIGJhdGNoIHNpemUsIG51bWJlciBvZiBlcG9jaHMuLi4pLlxuICAgKi9cbiAgcGFyYW1zOiBQYXJhbXM7XG5cbiAgc2V0UGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gIH1cblxuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICBhc3luYyBvblRyYWluRW5kKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICAvLyBMYXllcnNNb2RlbCBuZWVkcyB0byBjYWxsIENhbGxiYWNrLnNldE1vZGVsKCksIGJ1dCBjYW5ub3QgYWN0dWFsbHkgZGVwZW5kXG4gIC8vIG9uIENhbGxiYWNrIGJlY2F1c2UgdGhhdCBjcmVhdGVzIGEgY3ljbGljIGRlcGVuZGVuY3kuICBQcm92aWRpbmcgdGhpcyBuby1vcFxuICAvLyBtZXRob2Qgb24gQmFzZUNhbGxiYWNrIGJyZWFrcyB0aGUgY3ljbGU6IHRoaXMgd2F5IExheWVyc01vZGVsIGNhbiBkZXBlbmQgb25cbiAgLy8gQmFzZUNhbGxiYWNrIGJ1dCBub3Qgb24gQ2FsbGJhY2suICBUaGUgYXJndW1lbnQgaXMgdHlwZWQgYXMgYENvbnRhaW5lcmBcbiAgLy8gKHRoZSBzdXBlcmNsYXNzIG9mIExheWVyc01vZGVsKSB0byBhdm9pZCByZWNhcGl0dWxhdGluZyB0aGUgY3ljbGUuIENhbGxiYWNrXG4gIC8vIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgZW5mb3JjZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVhbGx5IGFcbiAgLy8gTGF5ZXJzTW9kZWwuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nLiBVc2UgQ2FsbGJhY2sgaW5zdGVhZCBvZiBCYXNlQ2FsbGJhY2sgdG8gdHJhY2sgdGhlIG1vZGVsLlxuICB9XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGFic3RyYWN0aW5nIGEgbGlzdCBvZiBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0xpc3Qge1xuICBjYWxsYmFja3M6IEJhc2VDYWxsYmFja1tdO1xuICBxdWV1ZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFdoZW4gdGhlIG5lZWQgYXJpc2VzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBhbmRcbiAgLy8gaW1wbGVtZW50IHRoZSBxdWV1ZSBmb3IgdGltZSB2YWx1ZXMuXG4gIC8vIHByaXZhdGUgZGVsdGFUQmF0Y2g6IG51bWJlcjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hCZWdpbjogQXJyYXk8bnVtYmVyPjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hFbmQ6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG9mIENhbGxiYWNrTGlzdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrcyBBcnJheSBvZiBgQ2FsbGJhY2tgIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHF1ZXVlTGVuZ3RoIFF1ZXVlIGxlbmd0aCBmb3Iga2VlcGluZyBydW5uaW5nIHN0YXRpc3RpY3Mgb3ZlclxuICAgKiAgIGNhbGxiYWNrIGV4ZWN1dGlvbiB0aW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2FsbGJhY2tzPzogQmFzZUNhbGxiYWNrW10sIHF1ZXVlTGVuZ3RoID0gMTApIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBNYWtlIHVzZSBvZiBxdWV1ZUxlbmd0aCB3aGVuIGltcGxlbWVudGluZyB0aGUgcXVldWUgZm9yIHRpbWVcbiAgICAvLyB2YWx1ZXMuXG4gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3M7XG4gICAgdGhpcy5xdWV1ZUxlbmd0aCA9IHF1ZXVlTGVuZ3RoO1xuICB9XG5cbiAgYXBwZW5kKGNhbGxiYWNrOiBCYXNlQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNldFBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrLnNldFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBjYWxsYmFjay5zZXRNb2RlbChtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEJlZ2luKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25FcG9jaEJlZ2luKGVwb2NoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uRXBvY2hFbmQoZXBvY2gsIGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgIHJpZ2h0IGJlZm9yZSBwcm9jZXNzaW5nIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uQmF0Y2hCZWdpbihiYXRjaCwgbG9ncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vbkJhdGNoRW5kKGJhdGNoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5CZWdpbihsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uVHJhaW5CZWdpbihsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vblRyYWluRW5kKGxvZ3MpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgYWNjdW11bGF0ZXMgZXBvY2ggYXZlcmFnZXMgb2YgbWV0cmljcy5cbiAqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBldmVyeSBMYXllcnNNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VMb2dnZXIgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcml2YXRlIHNlZW46IG51bWJlcjtcbiAgcHJpdmF0ZSB0b3RhbHM6IFVucmVzb2x2ZWRMb2dzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlcikge1xuICAgIHRoaXMuc2VlbiA9IDA7XG4gICAgdGhpcy50b3RhbHMgPSB7fTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBiYXRjaFNpemUgPSBsb2dzWydzaXplJ10gPT0gbnVsbCA/IDAgOiBsb2dzWydzaXplJ10gYXMgbnVtYmVyO1xuICAgIHRoaXMuc2VlbiArPSBiYXRjaFNpemU7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9ncykge1xuICAgICAgY29uc3QgdmFsdWUgPSBsb2dzW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoIXRoaXMudG90YWxzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgKyB2YWx1ZSAqIGJhdGNoU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBvbGRUb3RhbHNUb0Rpc3Bvc2U6IFNjYWxhcjtcbiAgICAgICAgaWYgKGtleSBpbiB0aGlzLnRvdGFscykge1xuICAgICAgICAgIG9sZFRvdGFsc1RvRGlzcG9zZSA9IHRoaXMudG90YWxzW2tleV0gYXMgU2NhbGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG90YWxzW2tleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsOiBTY2FsYXIgPVxuICAgICAgICAgICAgdGlkeSgoKSA9PiBhZGQoKHRoaXMudG90YWxzW2tleV0pLCBtdWwodmFsdWUsIGJhdGNoU2l6ZSkpKTtcbiAgICAgICAgdGhpcy50b3RhbHNba2V5XSA9IHRvdGFsO1xuICAgICAgICBpZiAob2xkVG90YWxzVG9EaXNwb3NlICE9IG51bGwpIHtcbiAgICAgICAgICBvbGRUb3RhbHNUb0Rpc3Bvc2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnBhcmFtc1snbWV0cmljcyddIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudG90YWxzW2tleV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgLyB0aGlzLnNlZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb2c6IFNjYWxhciA9IG11bChkaXYoMSwgdGhpcy5zZWVuKSwgdGhpcy50b3RhbHNba2V5XSk7XG4gICAgICAgICAgICBsb2dzW2tleV0gPSBsb2c7XG4gICAgICAgICAgICAodGhpcy50b3RhbHNba2V5XSBhcyBUZW5zb3IpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIGtlZXAobG9nc1trZXldIGFzIFNjYWxhcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJlY29yZHMgZXZlbnRzIGludG8gYSBgSGlzdG9yeWAgb2JqZWN0LiBUaGlzIGNhbGxiYWNrIGlzXG4gKiBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gZXZlcnkgVEYuanMgTGF5ZXJzIG1vZGVsLiBUaGUgYEhpc3RvcnlgIG9iamVjdFxuICogZ2V0cyByZXR1cm5lZCBieSB0aGUgYGZpdGAgbWV0aG9kIG9mIG1vZGVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBlcG9jaDogbnVtYmVyW107XG4gIGhpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBBcnJheTxudW1iZXJ8VGVuc29yPn07XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIHRoaXMuZXBvY2ggPSBbXTtcbiAgICB0aGlzLmhpc3RvcnkgPSB7fTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmVwb2NoLnB1c2goZXBvY2gpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICAgIGlmICh0aGlzLmhpc3Rvcnlba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeVtrZXldID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5XS5wdXNoKGxvZ3Nba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0IHRoZSB2YWx1ZXMgb2YgYWxsIGxvc3NlcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhKCkge1xuICAgIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPEZsb2F0MzJBcnJheXxJbnQzMkFycmF5fFVpbnQ4QXJyYXk+PiA9IFtdO1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhpc3RvcnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLmhpc3Rvcnlba2V5XTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlQXJyYXlbaV0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVTY2FsYXIgPSB2YWx1ZUFycmF5W2ldIGFzIFRlbnNvcjtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHZhbHVlU2NhbGFyLmRhdGEoKSk7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHZhbHVlcy5sZW5ndGg7ICsrbikge1xuICAgICAgY29uc3QgdGVuc29yVG9EaXNwb3NlID0gdGhpcy5oaXN0b3J5W2tleXNbbl1dW2luZGljZXNbbl1dIGFzIFRlbnNvcjtcbiAgICAgIHRlbnNvclRvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5c1tuXV1baW5kaWNlc1tuXV0gPSB2YWx1ZXNbbl1bMF07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2FsbGJhY2tBcmdzIHtcbiAgb25UcmFpbkJlZ2luPzogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25UcmFpbkVuZD86IChsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hCZWdpbj86IChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hFbmQ/OiAoZXBvY2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoQmVnaW4/OiAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoRW5kPzogKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25ZaWVsZD86IChlcG9jaDogbnVtYmVyLCBiYXRjaDogbnVtYmVyLCBsb2dzOiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLy8gVXNlZCBmb3IgdGVzdCBESSBtb2NraW5nLlxuICBub3dGdW5jPzogRnVuY3Rpb247XG4gIG5leHRGcmFtZUZ1bmM/OiBGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gY2FsbGJhY2sgZm9yIHRyYWluaW5nLlxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tQ2FsbGJhY2sgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhaW5CZWdpbjogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYWluRW5kOiAobG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXBvY2hCZWdpbjpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBlcG9jaEVuZDpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBiYXRjaEJlZ2luOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhdGNoRW5kOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHlpZWxkOlxuICAgICAgKGVwb2NoOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsIGxvZ3M6IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gIHByaXZhdGUgeWllbGRFdmVyeTogWWllbGRFdmVyeU9wdGlvbnM7XG4gIHByaXZhdGUgY3VycmVudEVwb2NoID0gMDtcbiAgcHVibGljIG5vd0Z1bmM6IEZ1bmN0aW9uO1xuICBwdWJsaWMgbmV4dEZyYW1lRnVuYzogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ3VzdG9tQ2FsbGJhY2tBcmdzLCB5aWVsZEV2ZXJ5PzogWWllbGRFdmVyeU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubm93RnVuYyA9IGFyZ3Mubm93RnVuYztcbiAgICB0aGlzLm5leHRGcmFtZUZ1bmMgPSBhcmdzLm5leHRGcmFtZUZ1bmMgfHwgbmV4dEZyYW1lO1xuICAgIHRoaXMueWllbGRFdmVyeSA9IHlpZWxkRXZlcnkgfHwgJ2F1dG8nO1xuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy55aWVsZEV2ZXJ5ID0gREVGQVVMVF9ZSUVMRF9FVkVSWV9NUztcbiAgICB9XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ25ldmVyJyAmJiBhcmdzLm9uWWllbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd5aWVsZEV2ZXJ5IGlzIGBuZXZlcmAgYnV0IHlvdSBwcm92aWRlZCBhbiBgb25ZaWVsZGAgY2FsbGJhY2suICcgK1xuICAgICAgICAgICdFaXRoZXIgY2hhbmdlIGB5aWVsZEV2ZXJ5YCBvciByZW1vdmUgdGhlIGNhbGxiYWNrJyk7XG4gICAgfVxuICAgIGlmICh1dGlsLmlzTnVtYmVyKHRoaXMueWllbGRFdmVyeSkpIHtcbiAgICAgIC8vIERlY29yYXRlIGBtYXliZVdhaXRgIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBldmVyeVxuICAgICAgLy8gYHlpZWxkRXZlcnlgIG1zLlxuICAgICAgdGhpcy5tYXliZVdhaXQgPSBnZW5lcmljX3V0aWxzLmRlYm91bmNlKFxuICAgICAgICAgIHRoaXMubWF5YmVXYWl0LmJpbmQodGhpcyksIHRoaXMueWllbGRFdmVyeSBhcyBudW1iZXIsIHRoaXMubm93RnVuYyk7XG4gICAgfVxuICAgIHRoaXMudHJhaW5CZWdpbiA9IGFyZ3Mub25UcmFpbkJlZ2luO1xuICAgIHRoaXMudHJhaW5FbmQgPSBhcmdzLm9uVHJhaW5FbmQ7XG4gICAgdGhpcy5lcG9jaEJlZ2luID0gYXJncy5vbkVwb2NoQmVnaW47XG4gICAgdGhpcy5lcG9jaEVuZCA9IGFyZ3Mub25FcG9jaEVuZDtcbiAgICB0aGlzLmJhdGNoQmVnaW4gPSBhcmdzLm9uQmF0Y2hCZWdpbjtcbiAgICB0aGlzLmJhdGNoRW5kID0gYXJncy5vbkJhdGNoRW5kO1xuICAgIHRoaXMueWllbGQgPSBhcmdzLm9uWWllbGQ7XG4gIH1cblxuICBhc3luYyBtYXliZVdhaXQoZXBvY2g6IG51bWJlciwgYmF0Y2g6IG51bWJlciwgbG9nczogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBjb25zdCBwczogQXJyYXk8dm9pZHxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgIGlmICh0aGlzLnlpZWxkICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgcHMucHVzaCh0aGlzLnlpZWxkKGVwb2NoLCBiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHBzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uRXBvY2hCZWdpbihlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOlxuICAgICAgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50RXBvY2ggPSBlcG9jaDtcbiAgICBpZiAodGhpcy5lcG9jaEJlZ2luICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5lcG9jaEJlZ2luKGVwb2NoLCBsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKTpcbiAgICAgIFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBzOiBBcnJheTx2b2lkfFByb21pc2U8dm9pZD4+ID0gW107XG4gICAgaWYgKHRoaXMuZXBvY2hFbmQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBwcy5wdXNoKHRoaXMuZXBvY2hFbmQoZXBvY2gsIGxvZ3MgYXMgTG9ncykpO1xuICAgIH1cbiAgICBpZiAodGhpcy55aWVsZEV2ZXJ5ID09PSAnZXBvY2gnKSB7XG4gICAgICBwcy5wdXNoKHRoaXMubmV4dEZyYW1lRnVuYygpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25CYXRjaEJlZ2luKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncyk6XG4gICAgICBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5iYXRjaEJlZ2luICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5iYXRjaEJlZ2luKGJhdGNoLCBsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKTpcbiAgICAgIFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBzOiBBcnJheTx2b2lkfFByb21pc2U8dm9pZD4+ID0gW107XG4gICAgaWYgKHRoaXMuYmF0Y2hFbmQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBwcy5wdXNoKHRoaXMuYmF0Y2hFbmQoYmF0Y2gsIGxvZ3MgYXMgTG9ncykpO1xuICAgIH1cbiAgICBpZiAodGhpcy55aWVsZEV2ZXJ5ID09PSAnYmF0Y2gnKSB7XG4gICAgICBwcy5wdXNoKHRoaXMubmV4dEZyYW1lRnVuYygpKTtcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNOdW1iZXIodGhpcy55aWVsZEV2ZXJ5KSkge1xuICAgICAgcHMucHVzaCh0aGlzLm1heWJlV2FpdCh0aGlzLmN1cnJlbnRFcG9jaCwgYmF0Y2gsIGxvZ3MpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnRyYWluQmVnaW4gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLnRyYWluQmVnaW4obG9ncyBhcyBMb2dzKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBvblRyYWluRW5kKGxvZ3M/OiBVbnJlc29sdmVkTG9ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnRyYWluRW5kICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgYXdhaXQgdGhpcy50cmFpbkVuZChsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN0YW5kYXJkaXplIGNhbGxiYWNrcyBvciBjb25maWd1cmF0aW9ucyBvZiB0aGVtIHRvIGFuIEFycmF5IG9mIGNhbGxiYWNrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYXJkaXplQ2FsbGJhY2tzKFxuICAgIGNhbGxiYWNrczogQmFzZUNhbGxiYWNrfEJhc2VDYWxsYmFja1tdfEN1c3RvbUNhbGxiYWNrQXJnc3xcbiAgICBDdXN0b21DYWxsYmFja0FyZ3NbXSxcbiAgICB5aWVsZEV2ZXJ5OiBZaWVsZEV2ZXJ5T3B0aW9ucyk6IEJhc2VDYWxsYmFja1tdIHtcbiAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgY2FsbGJhY2tzID0ge30gYXMgQmFzZUNhbGxiYWNrO1xuICB9XG4gIGlmIChjYWxsYmFja3MgaW5zdGFuY2VvZiBCYXNlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gW2NhbGxiYWNrc107XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2FsbGJhY2tzKSAmJiBjYWxsYmFja3NbMF0gaW5zdGFuY2VvZiBCYXNlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2tzIGFzIEJhc2VDYWxsYmFja1tdO1xuICB9XG4gIC8vIENvbnZlcnQgY3VzdG9tIGNhbGxiYWNrIGNvbmZpZ3MgdG8gY3VzdG9tIGNhbGxiYWNrIG9iamVjdHMuXG4gIGNvbnN0IGNhbGxiYWNrQ29uZmlncyA9XG4gICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdDxCYXNlQ2FsbGJhY2sgfCBDdXN0b21DYWxsYmFja0FyZ3M+KFxuICAgICAgICBjYWxsYmFja3MpIGFzIEN1c3RvbUNhbGxiYWNrQXJnc1tdO1xuICByZXR1cm4gY2FsbGJhY2tDb25maWdzLm1hcChcbiAgICAgIGNhbGxiYWNrQ29uZmlnID0+IG5ldyBDdXN0b21DYWxsYmFjayhjYWxsYmFja0NvbmZpZywgeWllbGRFdmVyeSkpO1xufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yID0ge1xuICBuZXcgKCk6IEJhc2VDYWxsYmFja1xufTtcblxuLyoqXG4gKiBBIGdsb2JhbCByZWdpc3RyeSBmb3IgY2FsbGJhY2sgY29uc3RydWN0b3JzIHRvIGJlIHVzZWQgZHVyaW5nXG4gKiBMYXllcnNNb2RlbC5maXQoKS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeSB7XG4gIHByaXZhdGUgc3RhdGljIGNvbnN0cnVjdG9yczpcbiAgICAgIHtbdmVyYm9zaXR5TGV2ZWw6IG51bWJlcl06IEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yW119ID0ge307XG5cbiAgLyoqXG4gICAqIEJsb2NrcyBwdWJsaWMgYWNjZXNzIHRvIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdGYuTGF5ZXJzTW9kZWwuZml0KCkgY2FsbGJhY2sgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZVxuICAgKiBjYWxsYmFja3MgZm9yIGV2ZXJ5IHRmLkxheWVyc01vZGVsLmZpdCgpIGNhbGwgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogQHBhcmFtIHZlcmJvc2l0eUxldmVsIExldmVsIG9mIHZlcmJvc2l0eSBhdCB3aGljaCB0aGUgYGNhbGxiYWNrQ29uc3RydWN0b3JgXG4gICAqICAgaXMgdG8gYmUgcmVpZ3N0ZXJlZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrQ29uc3RydWN0b3IgQSBuby1hcmcgY29uc3RydWN0b3IgZm9yIGB0Zi5DYWxsYmFja2AuXG4gICAqIEB0aHJvd3MgRXJyb3IsIGlmIHRoZSBzYW1lIGNhbGxiYWNrQ29uc3RydWN0b3IgaGFzIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUsXG4gICAqICAgZWl0aGVyIGF0IHRoZSBzYW1lIG9yIGEgZGlmZmVyZW50IGB2ZXJib3NpdHlMZXZlbGAuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJDYWxsYmFja0NvbnN0cnVjdG9yKFxuICAgICAgdmVyYm9zaXR5TGV2ZWw6IG51bWJlciwgY2FsbGJhY2tDb25zdHJ1Y3RvcjogQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdmVyYm9zaXR5TGV2ZWwgPj0gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZlcmJvc2l0eUxldmVsKSxcbiAgICAgICAgKCkgPT4gYFZlcmJvc2l0eSBsZXZlbCBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnRlZ2VyID49IDAsIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgJHt2ZXJib3NpdHlMZXZlbH1gKTtcbiAgICBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY2hlY2tGb3JEdXBsaWNhdGUoY2FsbGJhY2tDb25zdHJ1Y3Rvcik7XG4gICAgaWYgKENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jb25zdHJ1Y3RvcnNbdmVyYm9zaXR5TGV2ZWxdID09IG51bGwpIHtcbiAgICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jb25zdHJ1Y3RvcnNbdmVyYm9zaXR5TGV2ZWxdID0gW107XG4gICAgfVxuICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jb25zdHJ1Y3RvcnNbdmVyYm9zaXR5TGV2ZWxdLnB1c2goXG4gICAgICAgIGNhbGxiYWNrQ29uc3RydWN0b3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tGb3JEdXBsaWNhdGUoY2FsbGJhY2tDb25zdHJ1Y3RvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yKSB7XG4gICAgZm9yIChjb25zdCBsZXZlbE5hbWUgaW4gQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9ycykge1xuICAgICAgY29uc3QgY29uc3RydWN0b3JzID0gQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1srbGV2ZWxOYW1lXTtcbiAgICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKGN0b3IgPT4ge1xuICAgICAgICBpZiAoY3RvciA9PT0gY2FsbGJhY2tDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgY29uc3RydWN0b3IuJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayBjb25zdHJ1Y3RvcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGNsZWFyKCkge1xuICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jb25zdHJ1Y3RvcnMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FsbGJhY2tzIHVzaW5nIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGNvbnN0cnVjdG9ycy5cbiAgICpcbiAgICogR2l2ZW4gYHZlcmJvc2l0eUxldmVsYCwgYWxsIGNvbnN0cnVjdG9ycyByZWdpc3RlcmVkIGF0IHRoYXQgbGV2ZWwgb3IgYWJvdmVcbiAgICogd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBpbnN0YW50aWF0ZWQgY2FsbGJhY2tzIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIHZlcmJvc2l0eUxldmVsOiBMZXZlbCBvZiB2ZXJib3NpdHkuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQ2FsbGJhY2tzKHZlcmJvc2l0eUxldmVsOiBudW1iZXIpOiBCYXNlQ2FsbGJhY2tbXSB7XG4gICAgY29uc3QgY29uc3RydWN0b3JzOiBCYXNlQ2FsbGJhY2tDb25zdHJ1Y3RvcltdID0gW107XG4gICAgZm9yIChjb25zdCBsZXZlbE5hbWUgaW4gQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9ycykge1xuICAgICAgY29uc3QgbGV2ZWwgPSArbGV2ZWxOYW1lO1xuICAgICAgaWYgKHZlcmJvc2l0eUxldmVsID49IGxldmVsKSB7XG4gICAgICAgIGNvbnN0cnVjdG9ycy5wdXNoKC4uLkNhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jb25zdHJ1Y3RvcnNbbGV2ZWxdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9ycy5tYXAoY3RvciA9PiBuZXcgY3RvcigpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlQ2FsbGJhY2tzKFxuICAgIGNhbGxiYWNrczogQmFzZUNhbGxiYWNrW10sIHZlcmJvc2U6IE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSwgZXBvY2hzOiBudW1iZXIsXG4gICAgaW5pdGlhbEVwb2NoOiBudW1iZXIsIG51bVRyYWluU2FtcGxlczogbnVtYmVyLCBzdGVwc1BlckVwb2NoOiBudW1iZXIsXG4gICAgYmF0Y2hTaXplOiBudW1iZXIsIGRvVmFsaWRhdGlvbjogYm9vbGVhbixcbiAgICBjYWxsYmFja01ldHJpY3M6IHN0cmluZ1tdKToge2NhbGxiYWNrTGlzdDogQ2FsbGJhY2tMaXN0LCBoaXN0b3J5OiBIaXN0b3J5fSB7XG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICBjb25zdCBhY3R1YWxDYWxsYmFja3M6IEJhc2VDYWxsYmFja1tdID0gW1xuICAgIG5ldyBCYXNlTG9nZ2VyKCksIC4uLkNhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jcmVhdGVDYWxsYmFja3ModmVyYm9zZSlcbiAgXTtcbiAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7XG4gICAgYWN0dWFsQ2FsbGJhY2tzLnB1c2goLi4uY2FsbGJhY2tzKTtcbiAgfVxuICBhY3R1YWxDYWxsYmFja3MucHVzaChoaXN0b3J5KTtcbiAgY29uc3QgY2FsbGJhY2tMaXN0ID0gbmV3IENhbGxiYWNrTGlzdChhY3R1YWxDYWxsYmFja3MpO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IEZpZ3VyZSBvdXQgd2hlbiB0aGlzIExheWVyc01vZGVsIGluc3RhbmNlIGNhbiBoYXZlIGFcbiAgLy8gZHluYW1pY2FsbHlcbiAgLy8gICBzZXQgcHJvcGVydHkgY2FsbGVkICdjYWxsYmFja19tb2RlbCcgYXMgaW4gUHlLZXJhcy5cblxuICBjYWxsYmFja0xpc3Quc2V0UGFyYW1zKHtcbiAgICBlcG9jaHMsXG4gICAgaW5pdGlhbEVwb2NoLFxuICAgIHNhbXBsZXM6IG51bVRyYWluU2FtcGxlcyxcbiAgICBzdGVwczogc3RlcHNQZXJFcG9jaCxcbiAgICBiYXRjaFNpemUsXG4gICAgdmVyYm9zZSxcbiAgICBkb1ZhbGlkYXRpb24sXG4gICAgbWV0cmljczogY2FsbGJhY2tNZXRyaWNzLFxuICB9KTtcbiAgcmV0dXJuIHtjYWxsYmFja0xpc3QsIGhpc3Rvcnl9O1xufVxuIl19

@@ -105,2 +105,3 @@ /**

loadWeights(weights: NamedTensorMap, strict?: boolean): void;
protected parseWeights(weights: NamedTensorMap): void;
/**

@@ -107,0 +108,0 @@ * Util shared between different serialization methods.

@@ -629,2 +629,3 @@ /**

computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor | Tensor[];
private setMaskMetadata;
/**

@@ -631,0 +632,0 @@ * Internal method to create an inbound node for the layer.

@@ -126,3 +126,3 @@ /**

*/
axis?: number;
axis?: number | number[];
}

@@ -132,3 +132,3 @@ export declare class Softmax extends Layer {

static className: string;
readonly axis: number;
readonly axis: number | number[];
readonly softmax: (t: Tensor, a?: number) => Tensor;

@@ -135,0 +135,0 @@ readonly DEFAULT_AXIS = 1;

@@ -13,3 +13,3 @@ /**

*/
import { cast, clipByValue, elu, greater, leakyRelu, mul, prelu, relu, serialization } from '@tensorflow/tfjs-core';
import { add, cast, clipByValue, elu, exp, greater, leakyRelu, logSumExp, mul, ones, prelu, relu, scalar, serialization, sub, tidy } from '@tensorflow/tfjs-core';
import { Softmax as softmaxActivation } from '../activations';

@@ -216,4 +216,25 @@ import { getConstraint, serializeConstraint } from '../constraints';

call(inputs, kwargs) {
const x = getExactlyOneTensor(inputs);
return this.softmax(x, this.axis);
// TODO(pforderique): Add tests for when `this.axis` is a number[].
return tidy(() => {
let x = getExactlyOneTensor(inputs);
const mask = kwargs['mask'];
if (mask != null) {
// Since mask is 1.0 for positions we want to keep and 0.0 for masked
// positions, this operation will create a tensor which is 0.0 for
// positions we want to attend and -1e.9 for masked positions.
const adder = mul(sub(ones(x.shape), cast(mask, x.dtype)), scalar(-1e9));
// Since we are adding it to the raw scores before the softmax, this
// is effectively the same as removing these entirely.
x = add(x, adder);
}
if (this.axis instanceof Array) {
if (this.axis.length > 1) {
return exp(sub(x, logSumExp(x, this.axis, true)));
}
else {
return this.softmax(x, this.axis[0]);
}
}
return this.softmax(x, this.axis);
});
}

@@ -234,2 +255,2 @@ computeOutputShape(inputShape) {

serialization.registerClass(Softmax);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWRfYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2FkdmFuY2VkX2FjdGl2YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxSCxPQUFPLEVBQUMsT0FBTyxJQUFJLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFhLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQWUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQVU3RSxNQUFhLElBQUssU0FBUSxLQUFLO0lBSzdCLFlBQVksSUFBb0I7UUFDOUIsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLElBQUks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R0FBNkIsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQTdCRCxrQkFBa0I7QUFDWCxpQkFBUyxHQUFHLFNBQVMsQUFBWixDQUFhO1NBRmxCLE9BQU87QUFnQ3BCLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqICBBZHZhbmNlZCBhY3RpdmF0aW9uIGxheWVycy5cbiAqL1xuXG5pbXBvcnQge2Nhc3QsIGNsaXBCeVZhbHVlLCBlbHUsIGdyZWF0ZXIsIGxlYWt5UmVsdSwgbXVsLCBwcmVsdSwgcmVsdSwgc2VyaWFsaXphdGlvbiwgVGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge1NvZnRtYXggYXMgc29mdG1heEFjdGl2YXRpb259IGZyb20gJy4uL2FjdGl2YXRpb25zJztcbmltcG9ydCB7Q29uc3RyYWludCwgZ2V0Q29uc3RyYWludCwgc2VyaWFsaXplQ29uc3RyYWludH0gZnJvbSAnLi4vY29uc3RyYWludHMnO1xuaW1wb3J0IHtJbnB1dFNwZWMsIExheWVyLCBMYXllckFyZ3N9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7U2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQge0xheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBSZUxVTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEZsb2F0LCB0aGUgbWF4aW11bSBvdXRwdXQgdmFsdWUuXG4gICAqL1xuICBtYXhWYWx1ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlTFUgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1JlTFUnO1xuICBtYXhWYWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBSZUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gICAgaWYgKGFyZ3MgIT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhWYWx1ZSA9IGFyZ3MubWF4VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICBsZXQgb3V0cHV0ID0gcmVsdShpbnB1dHMpO1xuICAgIGlmICh0aGlzLm1heFZhbHVlICE9IG51bGwpIHtcbiAgICAgIG91dHB1dCA9IGNsaXBCeVZhbHVlKG91dHB1dCwgMCwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBvdmVycmlkZSBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7bWF4VmFsdWU6IHRoaXMubWF4VmFsdWV9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFJlTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgTGVha3lSZUxVTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEZsb2F0IGA+PSAwYC4gTmVnYXRpdmUgc2xvcGUgY29lZmZpY2llbnQuIERlZmF1bHRzIHRvIGAwLjNgLlxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMZWFreVJlTFUgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0xlYWt5UmVMVSc7XG4gIHJlYWRvbmx5IGFscGhhOiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BTFBIQSA9IDAuMztcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogTGVha3lSZUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuYWxwaGEgPSBhcmdzLmFscGhhID09IG51bGwgPyB0aGlzLkRFRkFVTFRfQUxQSEEgOiBhcmdzLmFscGhhO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHggPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgcmV0dXJuIGxlYWt5UmVsdSh4LCB0aGlzLmFscGhhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHthbHBoYTogdGhpcy5hbHBoYX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGVha3lSZUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBSZUxVTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgbGVhcm5hYmxlIGFscGhhLlxuICAgKi9cbiAgYWxwaGFJbml0aWFsaXplcj86IEluaXRpYWxpemVyfEluaXRpYWxpemVySWRlbnRpZmllcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZm9yIHRoZSBsZWFybmFibGUgYWxwaGEuXG4gICAqL1xuICBhbHBoYVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZm9yIHRoZSBsZWFybmFibGUgYWxwaGEuXG4gICAqL1xuICBhbHBoYUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgYXhlcyBhbG9uZyB3aGljaCB0byBzaGFyZSBsZWFybmFibGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGl2YXRpb25cbiAgICogZnVuY3Rpb24uIEZvciBleGFtcGxlLCBpZiB0aGUgaW5jb21pbmcgZmVhdHVyZSBtYXBzIGFyZSBmcm9tIGEgMkRcbiAgICogY29udm9sdXRpb24gd2l0aCBvdXRwdXQgc2hhcGUgYFtudW1FeGFtcGxlcywgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdYCxcbiAgICogYW5kIHlvdSB3aXNoIHRvIHNoYXJlIHBhcmFtZXRlcnMgYWNyb3NzIHNwYWNlIChoZWlnaHQgYW5kIHdpZHRoKSBzbyB0aGF0XG4gICAqIGVhY2ggZmlsdGVyIGNoYW5uZWxzIGhhcyBvbmx5IG9uZSBzZXQgb2YgcGFyYW1ldGVycywgc2V0XG4gICAqIGBzaGFyZWRfYXhlczogWzEsIDJdYC5cbiAgICovXG4gIHNoYXJlZEF4ZXM/OiBudW1iZXJ8bnVtYmVyW107XG59XG5cbmV4cG9ydCBjbGFzcyBQUmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUFJlTFUnO1xuICBwcml2YXRlIHJlYWRvbmx5IGFscGhhSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFscGhhUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFscGhhQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaGFyZWRBeGVzOiBudW1iZXJbXTtcbiAgcHJpdmF0ZSBhbHBoYTogTGF5ZXJWYXJpYWJsZTtcblxuICByZWFkb25seSBERUZBVUxUX0FMUEhBX0lOSVRJQUxJWkVSOiBJbml0aWFsaXplcklkZW50aWZpZXIgPSAnemVyb3MnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBQUmVMVUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFscGhhSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLmFscGhhSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX0FMUEhBX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmFscGhhUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmFscGhhUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuYWxwaGFDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLmFscGhhQ29uc3RyYWludCk7XG4gICAgaWYgKGFyZ3Muc2hhcmVkQXhlcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLnNoYXJlZEF4ZXMgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnNoYXJlZEF4ZXMpKSB7XG4gICAgICB0aGlzLnNoYXJlZEF4ZXMgPSBhcmdzLnNoYXJlZEF4ZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncy5zaGFyZWRBeGVzID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5zaGFyZWRBeGVzID0gW2FyZ3Muc2hhcmVkQXhlc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBzaGFyZWRBeGVzIHRvIGJlIGEgbnVtYmVyIG9yIGFuIGFycmF5IG9mIG51bWJlcnMsIGAgK1xuICAgICAgICAgIGBidXQgZ290ICR7YXJncy5zaGFyZWRBeGVzfWApO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtU2hhcGU6IFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgxKTtcbiAgICBpZiAodGhpcy5zaGFyZWRBeGVzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnNoYXJlZEF4ZXMpIHtcbiAgICAgICAgcGFyYW1TaGFwZVtpIC0gMV0gPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFscGhhID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdhbHBoYScsIHBhcmFtU2hhcGUsICdmbG9hdDMyJywgdGhpcy5hbHBoYUluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmFscGhhUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYWxwaGFDb25zdHJhaW50KTtcbiAgICAvLyBTZXQgaW5wdXQgc3BlYy5cbiAgICBjb25zdCBheGVzOiB7W2F4aXM6IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICBpZiAodGhpcy5zaGFyZWRBeGVzICE9IG51bGwpIHtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBheGVzW2ldID0gaW5wdXRTaGFwZVtpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7XG4gICAgICBuZGltOiBpbnB1dFNoYXBlLmxlbmd0aCxcbiAgICAgIGF4ZXMsXG4gICAgfSldO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gcHJlbHUoaW5wdXRzLCB0aGlzLmFscGhhLnJlYWQoKSk7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIGFscGhhSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYWxwaGFJbml0aWFsaXplciksXG4gICAgICBhbHBoYVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFscGhhUmVndWxhcml6ZXIpLFxuICAgICAgYWxwaGFDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMuYWxwaGFDb25zdHJhaW50KSxcbiAgICAgIHNoYXJlZEF4ZXM6IHRoaXMuc2hhcmVkQXhlc1xuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUFJlTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRUxVTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEZsb2F0IGA+PSAwYC4gTmVnYXRpdmUgc2xvcGUgY29lZmZpY2llbnQuIERlZmF1bHRzIHRvIGAxLjBgLlxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBFTFUgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0VMVSc7XG4gIHJlYWRvbmx5IGFscGhhOiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BTFBIQSA9IDEuMDtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogRUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MuYWxwaGEgIT0gbnVsbCAmJiBhcmdzLmFscGhhICE9PSB0aGlzLkRFRkFVTFRfQUxQSEEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgIGBOb24tZGVmYXVsdCBhbHBoYSB2YWx1ZSAoJHthcmdzLmFscGhhfSkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYCArXG4gICAgICAgICAgYEVMVSBsYXllciB5ZXQuYCk7XG4gICAgfVxuXG4gICAgdGhpcy5hbHBoYSA9IGFyZ3MuYWxwaGEgPT0gbnVsbCA/IHRoaXMuREVGQVVMVF9BTFBIQSA6IGFyZ3MuYWxwaGE7XG4gIH1cblxuICBvdmVycmlkZSBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gZWx1KHgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge2FscGhhOiB0aGlzLmFscGhhfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVGhyZXNob2xkZWRSZUxVTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEZsb2F0ID49IDAuIFRocmVzaG9sZCBsb2NhdGlvbiBvZiBhY3RpdmF0aW9uLlxuICAgKi9cbiAgdGhldGE/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBUaHJlc2hvbGRlZFJlTFUgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1RocmVzaG9sZGVkUmVMVSc7XG4gIHJlYWRvbmx5IHRoZXRhOiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9USEVUQSA9IDEuMDtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogVGhyZXNob2xkZWRSZUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy50aGV0YSA9IGFyZ3MudGhldGEgPT0gbnVsbCA/IHRoaXMuREVGQVVMVF9USEVUQSA6IGFyZ3MudGhldGE7XG4gIH1cblxuICBvdmVycmlkZSBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gbXVsKHgsIGNhc3QoZ3JlYXRlcih4LCB0aGlzLnRoZXRhKSwgJ2Zsb2F0MzInKSk7XG4gIH1cblxuICBvdmVycmlkZSBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7dGhldGE6IHRoaXMudGhldGF9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRocmVzaG9sZGVkUmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTb2Z0bWF4TGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEludGVnZXIsIGF4aXMgYWxvbmcgd2hpY2ggdGhlIHNvZnRtYXggbm9ybWFsaXphdGlvbiBpcyBhcHBsaWVkLlxuICAgKiBEZWZhdWx0cyB0byBgLTFgIChpLmUuLCB0aGUgbGFzdCBheGlzKS5cbiAgICovXG4gIGF4aXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTb2Z0bWF4IGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdTb2Z0bWF4JztcbiAgcmVhZG9ubHkgYXhpczogbnVtYmVyO1xuICByZWFkb25seSBzb2Z0bWF4OiAodDogVGVuc29yLCBhPzogbnVtYmVyKSA9PiBUZW5zb3I7XG4gIHJlYWRvbmx5IERFRkFVTFRfQVhJUyA9IDEuMDtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogU29mdG1heExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnNvZnRtYXggPSBuZXcgc29mdG1heEFjdGl2YXRpb24oKS5hcHBseTtcbiAgICB0aGlzLmF4aXMgPSBhcmdzLmF4aXMgPT0gbnVsbCA/IHRoaXMuREVGQVVMVF9BWElTIDogYXJncy5heGlzO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHggPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgcmV0dXJuIHRoaXMuc29mdG1heCh4LCB0aGlzLmF4aXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge2F4aXM6IHRoaXMuYXhpc307XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU29mdG1heCk7XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWRfYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2FkdmFuY2VkX2FjdGl2YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEssT0FBTyxFQUFDLE9BQU8sSUFBSSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBYSxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFDLGNBQWMsRUFBc0Msb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUMsY0FBYyxFQUFlLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFVN0UsTUFBYSxJQUFLLFNBQVEsS0FBSztJQUs3QixZQUFZLElBQW9CO1FBQzlCLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElB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QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQW5ERCxrQkFBa0I7QUFDWCxpQkFBUyxHQUFHLFNBQVMsQUFBWixDQUFhO1NBRmxCLE9BQU87QUFzRHBCLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqICBBZHZhbmNlZCBhY3RpdmF0aW9uIGxheWVycy5cbiAqL1xuXG5pbXBvcnQge2FkZCwgY2FzdCwgY2xpcEJ5VmFsdWUsIGVsdSwgZXhwLCBncmVhdGVyLCBsZWFreVJlbHUsIGxvZ1N1bUV4cCwgbXVsLCBvbmVzLCBwcmVsdSwgcmVsdSwgc2NhbGFyLCBzZXJpYWxpemF0aW9uLCBzdWIsIFRlbnNvciwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtTb2Z0bWF4IGFzIHNvZnRtYXhBY3RpdmF0aW9ufSBmcm9tICcuLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQge0NvbnN0cmFpbnQsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBzZXJpYWxpemVSZWd1bGFyaXplcn0gZnJvbSAnLi4vcmVndWxhcml6ZXJzJztcbmltcG9ydCB7S3dhcmdzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZSwgZ2V0RXhhY3RseU9uZVRlbnNvcn0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0IHtMYXllclZhcmlhYmxlfSBmcm9tICcuLi92YXJpYWJsZXMnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUmVMVUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBGbG9hdCwgdGhlIG1heGltdW0gb3V0cHV0IHZhbHVlLlxuICAgKi9cbiAgbWF4VmFsdWU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSZUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdSZUxVJztcbiAgbWF4VmFsdWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogUmVMVUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIGlmIChhcmdzICE9IG51bGwpIHtcbiAgICAgIHRoaXMubWF4VmFsdWUgPSBhcmdzLm1heFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgbGV0IG91dHB1dCA9IHJlbHUoaW5wdXRzKTtcbiAgICBpZiAodGhpcy5tYXhWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBvdXRwdXQgPSBjbGlwQnlWYWx1ZShvdXRwdXQsIDAsIHRoaXMubWF4VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge21heFZhbHVlOiB0aGlzLm1heFZhbHVlfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSZUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExlYWt5UmVMVUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBGbG9hdCBgPj0gMGAuIE5lZ2F0aXZlIHNsb3BlIGNvZWZmaWNpZW50LiBEZWZhdWx0cyB0byBgMC4zYC5cbiAgICovXG4gIGFscGhhPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTGVha3lSZUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdMZWFreVJlTFUnO1xuICByZWFkb25seSBhbHBoYTogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUxQSEEgPSAwLjM7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IExlYWt5UmVMVUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmFscGhhID0gYXJncy5hbHBoYSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FMUEhBIDogYXJncy5hbHBoYTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBjb25zdCB4ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBsZWFreVJlbHUoeCwgdGhpcy5hbHBoYSk7XG4gIH1cblxuICBvdmVycmlkZSBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7YWxwaGE6IHRoaXMuYWxwaGF9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExlYWt5UmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQUmVMVUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGxlYXJuYWJsZSBhbHBoYS5cbiAgICovXG4gIGFscGhhSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcnxJbml0aWFsaXplcklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZvciB0aGUgbGVhcm5hYmxlIGFscGhhLlxuICAgKi9cbiAgYWxwaGFSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZvciB0aGUgbGVhcm5hYmxlIGFscGhhLlxuICAgKi9cbiAgYWxwaGFDb25zdHJhaW50PzogQ29uc3RyYWludDtcblxuICAvKipcbiAgICogVGhlIGF4ZXMgYWxvbmcgd2hpY2ggdG8gc2hhcmUgbGVhcm5hYmxlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3RpdmF0aW9uXG4gICAqIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGluY29taW5nIGZlYXR1cmUgbWFwcyBhcmUgZnJvbSBhIDJEXG4gICAqIGNvbnZvbHV0aW9uIHdpdGggb3V0cHV0IHNoYXBlIGBbbnVtRXhhbXBsZXMsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAsXG4gICAqIGFuZCB5b3Ugd2lzaCB0byBzaGFyZSBwYXJhbWV0ZXJzIGFjcm9zcyBzcGFjZSAoaGVpZ2h0IGFuZCB3aWR0aCkgc28gdGhhdFxuICAgKiBlYWNoIGZpbHRlciBjaGFubmVscyBoYXMgb25seSBvbmUgc2V0IG9mIHBhcmFtZXRlcnMsIHNldFxuICAgKiBgc2hhcmVkX2F4ZXM6IFsxLCAyXWAuXG4gICAqL1xuICBzaGFyZWRBeGVzPzogbnVtYmVyfG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgUFJlTFUgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1BSZUxVJztcbiAgcHJpdmF0ZSByZWFkb25seSBhbHBoYUluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhbHBoYVJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhbHBoYUNvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hhcmVkQXhlczogbnVtYmVyW107XG4gIHByaXZhdGUgYWxwaGE6IExheWVyVmFyaWFibGU7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BTFBIQV9JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ3plcm9zJztcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogUFJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gICAgdGhpcy5hbHBoYUluaXRpYWxpemVyID1cbiAgICAgICAgZ2V0SW5pdGlhbGl6ZXIoYXJncy5hbHBoYUluaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9BTFBIQV9JTklUSUFMSVpFUik7XG4gICAgdGhpcy5hbHBoYVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5hbHBoYVJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmFscGhhQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5hbHBoYUNvbnN0cmFpbnQpO1xuICAgIGlmIChhcmdzLnNoYXJlZEF4ZXMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zaGFyZWRBeGVzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5zaGFyZWRBeGVzKSkge1xuICAgICAgdGhpcy5zaGFyZWRBeGVzID0gYXJncy5zaGFyZWRBeGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3Muc2hhcmVkQXhlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuc2hhcmVkQXhlcyA9IFthcmdzLnNoYXJlZEF4ZXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgc2hhcmVkQXhlcyB0byBiZSBhIG51bWJlciBvciBhbiBhcnJheSBvZiBudW1iZXJzLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCAke2FyZ3Muc2hhcmVkQXhlc31gKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBwYXJhbVNoYXBlOiBTaGFwZSA9IGlucHV0U2hhcGUuc2xpY2UoMSk7XG4gICAgaWYgKHRoaXMuc2hhcmVkQXhlcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5zaGFyZWRBeGVzKSB7XG4gICAgICAgIHBhcmFtU2hhcGVbaSAtIDFdID0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hbHBoYSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAnYWxwaGEnLCBwYXJhbVNoYXBlLCAnZmxvYXQzMicsIHRoaXMuYWxwaGFJbml0aWFsaXplcixcbiAgICAgICAgdGhpcy5hbHBoYVJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmFscGhhQ29uc3RyYWludCk7XG4gICAgLy8gU2V0IGlucHV0IHNwZWMuXG4gICAgY29uc3QgYXhlczoge1theGlzOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgaWYgKHRoaXMuc2hhcmVkQXhlcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYXhlc1tpXSA9IGlucHV0U2hhcGVbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXRTcGVjID0gW25ldyBJbnB1dFNwZWMoe1xuICAgICAgbmRpbTogaW5wdXRTaGFwZS5sZW5ndGgsXG4gICAgICBheGVzLFxuICAgIH0pXTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgcmV0dXJuIHByZWx1KGlucHV0cywgdGhpcy5hbHBoYS5yZWFkKCkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBhbHBoYUluaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmFscGhhSW5pdGlhbGl6ZXIpLFxuICAgICAgYWxwaGFSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5hbHBoYVJlZ3VsYXJpemVyKSxcbiAgICAgIGFscGhhQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmFscGhhQ29uc3RyYWludCksXG4gICAgICBzaGFyZWRBeGVzOiB0aGlzLnNoYXJlZEF4ZXNcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFBSZUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVMVUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBGbG9hdCBgPj0gMGAuIE5lZ2F0aXZlIHNsb3BlIGNvZWZmaWNpZW50LiBEZWZhdWx0cyB0byBgMS4wYC5cbiAgICovXG4gIGFscGhhPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdFTFUnO1xuICByZWFkb25seSBhbHBoYTogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUxQSEEgPSAxLjA7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IEVMVUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChhcmdzLmFscGhhICE9IG51bGwgJiYgYXJncy5hbHBoYSAhPT0gdGhpcy5ERUZBVUxUX0FMUEhBKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgTm9uLWRlZmF1bHQgYWxwaGEgdmFsdWUgKCR7YXJncy5hbHBoYX0pIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGAgK1xuICAgICAgICAgIGBFTFUgbGF5ZXIgeWV0LmApO1xuICAgIH1cblxuICAgIHRoaXMuYWxwaGEgPSBhcmdzLmFscGhhID09IG51bGwgPyB0aGlzLkRFRkFVTFRfQUxQSEEgOiBhcmdzLmFscGhhO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHggPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgcmV0dXJuIGVsdSh4KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHthbHBoYTogdGhpcy5hbHBoYX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFRocmVzaG9sZGVkUmVMVUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBGbG9hdCA+PSAwLiBUaHJlc2hvbGQgbG9jYXRpb24gb2YgYWN0aXZhdGlvbi5cbiAgICovXG4gIHRoZXRhPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGhyZXNob2xkZWRSZUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdUaHJlc2hvbGRlZFJlTFUnO1xuICByZWFkb25seSB0aGV0YTogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfVEhFVEEgPSAxLjA7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFRocmVzaG9sZGVkUmVMVUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMudGhldGEgPSBhcmdzLnRoZXRhID09IG51bGwgPyB0aGlzLkRFRkFVTFRfVEhFVEEgOiBhcmdzLnRoZXRhO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHggPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgcmV0dXJuIG11bCh4LCBjYXN0KGdyZWF0ZXIoeCwgdGhpcy50aGV0YSksICdmbG9hdDMyJykpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge3RoZXRhOiB0aGlzLnRoZXRhfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhUaHJlc2hvbGRlZFJlTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU29mdG1heExheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBJbnRlZ2VyLCBheGlzIGFsb25nIHdoaWNoIHRoZSBzb2Z0bWF4IG5vcm1hbGl6YXRpb24gaXMgYXBwbGllZC5cbiAgICogRGVmYXVsdHMgdG8gYC0xYCAoaS5lLiwgdGhlIGxhc3QgYXhpcykuXG4gICAqL1xuICBheGlzPzogbnVtYmVyfG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgU29mdG1heCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnU29mdG1heCc7XG4gIHJlYWRvbmx5IGF4aXM6IG51bWJlcnxudW1iZXJbXTtcbiAgcmVhZG9ubHkgc29mdG1heDogKHQ6IFRlbnNvciwgYT86IG51bWJlcikgPT4gVGVuc29yO1xuICByZWFkb25seSBERUZBVUxUX0FYSVMgPSAxLjA7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFNvZnRtYXhMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5zb2Z0bWF4ID0gbmV3IHNvZnRtYXhBY3RpdmF0aW9uKCkuYXBwbHk7XG4gICAgdGhpcy5heGlzID0gYXJncy5heGlzID09IG51bGwgPyB0aGlzLkRFRkFVTFRfQVhJUyA6IGFyZ3MuYXhpcztcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICAvLyBUT0RPKHBmb3JkZXJpcXVlKTogQWRkIHRlc3RzIGZvciB3aGVuIGB0aGlzLmF4aXNgIGlzIGEgbnVtYmVyW10uXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgbGV0IHggPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBjb25zdCBtYXNrID0ga3dhcmdzWydtYXNrJ10gYXMgVGVuc29yO1xuICAgICAgaWYgKG1hc2sgIT0gbnVsbCkge1xuICAgICAgICAvLyBTaW5jZSBtYXNrIGlzIDEuMCBmb3IgcG9zaXRpb25zIHdlIHdhbnQgdG8ga2VlcCBhbmQgMC4wIGZvciBtYXNrZWRcbiAgICAgICAgLy8gcG9zaXRpb25zLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNyZWF0ZSBhIHRlbnNvciB3aGljaCBpcyAwLjAgZm9yXG4gICAgICAgIC8vIHBvc2l0aW9ucyB3ZSB3YW50IHRvIGF0dGVuZCBhbmQgLTFlLjkgZm9yIG1hc2tlZCBwb3NpdGlvbnMuXG4gICAgICAgIGNvbnN0IGFkZGVyID1cbiAgICAgICAgICBtdWwoc3ViKG9uZXMoeC5zaGFwZSksIGNhc3QobWFzaywgeC5kdHlwZSkpLCBzY2FsYXIoLTFlOSkpO1xuXG4gICAgICAgIC8vIFNpbmNlIHdlIGFyZSBhZGRpbmcgaXQgdG8gdGhlIHJhdyBzY29yZXMgYmVmb3JlIHRoZSBzb2Z0bWF4LCB0aGlzXG4gICAgICAgIC8vIGlzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIHJlbW92aW5nIHRoZXNlIGVudGlyZWx5LlxuICAgICAgICB4ID0gYWRkKHgsIGFkZGVyKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmF4aXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBpZiAodGhpcy5heGlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gZXhwKHN1Yih4LCBsb2dTdW1FeHAoeCwgdGhpcy5heGlzLCB0cnVlKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvZnRtYXgoeCwgdGhpcy5heGlzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc29mdG1heCh4LCB0aGlzLmF4aXMpO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge2F4aXM6IHRoaXMuYXhpc307XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU29mdG1heCk7XG4iXX0=

@@ -21,3 +21,3 @@ /**

*/
import { Tensor, Tensor1D, Tensor2D } from '@tensorflow/tfjs-core';
import { Tensor } from '@tensorflow/tfjs-core';
import { MultiHeadAttention } from '../multihead_attention';

@@ -63,3 +63,3 @@ export declare interface CachedMultiHeadAttentionOptions {

*/
cacheUpdateIndex?: number | Tensor;
cacheUpdateIndex?: number;
}

@@ -97,7 +97,7 @@ /**

export declare class CachedMultiHeadAttention extends MultiHeadAttention {
call(query: Tensor, kwargs: CachedMultiHeadAttentionOptions): Tensor | Tensor2D;
call(query: Tensor, kwargs: CachedMultiHeadAttentionOptions): Tensor;
/**
* Exactly like `call` except also returns the updated cache.
*/
callAndReturnCache(query: Tensor, kwargs: CachedMultiHeadAttentionOptions): [Tensor1D | Tensor2D, Tensor1D | Tensor2D];
callAndReturnCache(query: Tensor, { value, key, attentionMask, cache, cacheUpdateIndex }: CachedMultiHeadAttentionOptions): [Tensor, Tensor];
}

@@ -21,5 +21,6 @@ /**

/* Original source: keras_nlp/layers/modeling/cached_multi_head_attention.py */
import { serialization } from '@tensorflow/tfjs-core';
import { cast, einsum, mul, reciprocal, serialization, sqrt, stack, tidy } from '@tensorflow/tfjs-core';
import { ValueError } from '../../../errors';
import { MultiHeadAttention } from '../multihead_attention';
import { NotImplementedError } from '../../../errors';
import { sliceUpdate } from '../utils';
/**

@@ -62,7 +63,52 @@ * MultiHeadAttention layer with cache support.

*/
callAndReturnCache(query, kwargs) {
throw new NotImplementedError(`Not implemented yet.`);
callAndReturnCache(query, { value, key, attentionMask, cache, cacheUpdateIndex }) {
return tidy(() => {
if (!this.builtFromSignature) {
this.buildFromSignature(query.shape, value.shape, key ? key.shape : null);
}
if (key == null) {
key = value;
}
query = this.queryDense.apply(query);
// If cache is not `null`, we will use the cache to compute the final key
// and value tensors. If `cacheUpdateIndex` is not `null`, we will first
// update the cache before use. To do this, we first call the
// `keyDense` and `valueDense` layers, and copy the outputs into the
// cache at the specified index. `cache = null` handles the training
// case, where we don't use the cache at all.
if (cache != null) {
const keyCache = cache.gather([0], 1).squeeze();
const valueCache = cache.gather([1], 1).squeeze();
if (cacheUpdateIndex == null) {
key = keyCache;
value = valueCache;
}
else {
const keyUpdate = this.keyDense.apply(key);
const valueUpdate = this.valueDense.apply(value);
const start = [0, cacheUpdateIndex, 0, 0];
key = sliceUpdate(keyCache, start, keyUpdate);
value = sliceUpdate(valueCache, start, valueUpdate);
cache = stack([key, value], 1);
}
}
else {
if (cacheUpdateIndex != null) {
throw new ValueError('`cacheUpdateIndex` should not be set if `cache` is `null`. ' +
`Received: cache=${cache}, cacheUpdateIndex=${cacheUpdateIndex}`);
}
key = this.keyDense.apply(key);
value = this.valueDense.apply(value);
}
query = mul(query, reciprocal(sqrt(cast(this.keyDim, query.dtype))));
let attentionScores = einsum(this.dotProductEquation, key, query);
attentionScores = this.maskedSoftmax(attentionScores, attentionMask);
attentionScores = this.dropoutLayer.apply(attentionScores);
let attentionOutput = einsum(this.combineEquation, attentionScores, value);
attentionOutput = this.outputDense.apply(attentionOutput);
return [attentionOutput, cache];
});
}
}
serialization.registerClass(CachedMultiHeadAttention);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkX211bHRpaGVhZF9hdHRlbnRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbGluZy9jYWNoZWRfbXVsdGloZWFkX2F0dGVudGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7R0FFRztBQUVILCtFQUErRTtBQUMvRSxPQUFPLEVBQThCLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUR0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsa0JBQWtCO0lBRXJELElBQUksQ0FDWCxLQUFhLEVBQUUsTUFBdUM7UUFFdEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUNoQixLQUFhLEVBQUUsTUFBdUM7UUFFdEQsTUFBTSxJQUFJLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGO0FBQ0QsYUFBYSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqICBDYWNoZWQgTUhBIGxheWVyIGJhc2VkIG9uIGBNdWx0aUhlYWRBdHRlbnRpb25gLlxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXNfbmxwL2xheWVycy9tb2RlbGluZy9jYWNoZWRfbXVsdGlfaGVhZF9hdHRlbnRpb24ucHkgKi9cbmltcG9ydCB7IFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJELCBzZXJpYWxpemF0aW9uIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHsgTXVsdGlIZWFkQXR0ZW50aW9uIH0gZnJvbSAnLi4vbXVsdGloZWFkX2F0dGVudGlvbic7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENhY2hlZE11bHRpSGVhZEF0dGVudGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogUXVlcnkgYFRlbnNvcmAgb2Ygc2hhcGUgYChCLCBULCBkaW0pYC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFZhbHVlIGBUZW5zb3JgIG9mIHNoYXBlIGAoQiwgUyosIGRpbSlgLiBJZiBgY2FjaGVgIGlzIGBudWxsYCwgYFMqYFxuICAgKiBtdXN0IGVxdWFsIGBTYCBhbmQgbWF0Y2ggdGhlIHNoYXBlIG9mIGBhdHRlbnRpb25NYXNrYC4gSWYgYGNhY2hlYCBpc1xuICAgKiBub3QgYG51bGxgLCBgUypgIGNhbiBiZSBhbnkgbGVuZ3RoIGxlc3MgdGhhbiBgU2AsIGFuZCB0aGUgY29tcHV0ZWRcbiAgICogdmFsdWUgd2lsbCBiZSBzcGxpY2VkIGludG8gYGNhY2hlYCBhdCBgY2FjaGVVcGRhdGVJbmRleGAuXG4gICAqL1xuICB2YWx1ZTogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBLZXkgYFRlbnNvcmAgb2Ygc2hhcGUgYChCLCBTKiwgZGltKWAuICBJZiBgY2FjaGVgIGlzIGBudWxsYCwgYFMqYCBtdXN0XG4gICAqIGVxdWFsIGBTYCBhbmQgbWF0Y2ggdGhlIHNoYXBlIG9mIGBhdHRlbnRpb25NYXNrYC4gSWYgYGNhY2hlYCBpcyBub3QgYG51bGxgLFxuICAgKiBgUypgIGNhbiBiZSBhbnkgbGVuZ3RoIGxlc3MgdGhhbiBgU2AsIGFuZCB0aGUgY29tcHV0ZWQgdmFsdWUgd2lsbCBiZVxuICAgKiBzcGxpY2VkIGludG8gYGNhY2hlYCBhdCBgY2FjaGVVcGRhdGVJbmRleGAuXG4gICAqL1xuICBrZXk/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBtYXNrIG9mIHNoYXBlIGAoQiwgVCwgUylgLiBgYXR0ZW50aW9uTWFza2AgcHJldmVudHNcbiAgICogYXR0ZW50aW9uIHRvIGNlcnRhaW4gcG9zaXRpb25zLiBUaGUgYm9vbGVhbiBtYXNrIHNwZWNpZmllcyB3aGljaFxuICAgKiBxdWVyeSBlbGVtZW50cyBjYW4gYXR0ZW5kIHRvIHdoaWNoIGtleSBlbGVtZW50cywgMSBpbmRpY2F0ZXNcbiAgICogYXR0ZW50aW9uIGFuZCAwIGluZGljYXRlcyBubyBhdHRlbnRpb24uIEJyb2FkY2FzdGluZyBjYW4gaGFwcGVuIGZvclxuICAgKiB0aGUgbWlzc2luZyBiYXRjaCBkaW1lbnNpb25zIGFuZCB0aGUgaGVhZCBkaW1lbnNpb24uXG4gICAqL1xuICBhdHRlbnRpb25NYXNrPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGRlbnNlIGZsb2F0IFRlbnNvci4gVGhlIGtleS92YWx1ZSBjYWNoZSwgb2Ygc2hhcGVcbiAgICogYFtCLCAyLCBTLCBudW1IZWFkcywga2V5RGltc11gLCB3aGVyZSBgU2AgbXVzdCBhZ3JlZSB3aXRoIHRoZVxuICAgKiBgYXR0ZW50aW9uTWFza2Agc2hhcGUuIFRoaXMgYXJndW1lbnQgaXMgaW50ZW5kZWQgZm9yIHVzZSBkdXJpbmdcbiAgICogZ2VuZXJhdGlvbiB0byBhdm9pZCByZWNvbXB1dGluZyBpbnRlcm1lZGlhdGUgc3RhdGUuXG4gICAqL1xuICBjYWNoZT86IFRlbnNvcjtcblxuICAvKipcbiAgICogSW50ZWdlciBvciBJbnRlZ2VyIGBUZW5zb3JgLiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gdXBkYXRlIGBjYWNoZWBcbiAgICogKHVzdWFsbHkgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHRva2VuIGJlaW5nIHByb2Nlc3NlZCB3aGVuIHJ1bm5pbmdcbiAgICogZ2VuZXJhdGlvbikuIElmIGBjYWNoZVVwZGF0ZUluZGV4PW51bGxgIHdoaWxlIGBjYWNoZWAgaXMgc2V0LCB0aGUgY2FjaGVcbiAgICogd2lsbCBub3QgYmUgdXBkYXRlZC5cbiAgICovXG4gIGNhY2hlVXBkYXRlSW5kZXg/OiBudW1iZXJ8VGVuc29yO1xufVxuXG4vKipcbiAqIE11bHRpSGVhZEF0dGVudGlvbiBsYXllciB3aXRoIGNhY2hlIHN1cHBvcnQuXG4gKlxuICogVGhpcyBsYXllciBpcyBzdWl0YWJsZSBmb3IgdXNlIGluIGF1dG9yZWdyZXNzaXZlIGRlY29kaW5nLiBJdCBjYW4gYmUgdXNlXG4gKiB0byBjYWNoZSBkZWNvZGVyIHNlbGYtYXR0ZW50aW9uIGFuZCBjcm9zcy1hdHRlbnRpb24uIFRoZSBmb3J3YXJkIHBhc3NcbiAqIGNhbiBoYXBwZW4gaW4gb25lIG9mIHRocmVlIG1vZGVzOlxuICogLSBObyBjYWNoZSwgc2FtZSBhcyByZWd1bGFyIG11bHRpLWhlYWQgYXR0ZW50aW9uLlxuICogLSBTdGF0aWMgY2FjaGUgKGBjYWNoZVVwZGF0ZUluZGV4YCBpcyBOb25lKS4gSW4gdGhpcyBjYXNlLCB0aGVcbiAqICAgICBjYWNoZWQga2V5L3ZhbHVlIHByb2plY3Rpb25zIHdpbGwgYmUgdXNlZCBhbmQgdGhlIGlucHV0IHZhbHVlcyB3aWxsXG4gKiAgICAgYmUgaWdub3JlZC5cbiAqIC0gVXBkYXRlZCBjYWNoZSAoYGNhY2hlVXBkYXRlSW5kZXhgIGlzIG5vdCBOb25lKS4gSW4gdGhpcyBjYXNlLCBuZXdcbiAqICAgICBrZXkvdmFsdWUgcHJvamVjdGlvbnMgYXJlIGNvbXB1dGVkIHVzaW5nIHRoZSBpbnB1dCwgYW5kIHNwbGljZWQgaW50b1xuICogICAgIHRoZSBjYWNoZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqIE5vdGUgdGhhdCBjYWNoaW5nIGlzIHVzZWZ1bCBvbmx5IGR1cmluZyBpbmZlcmVuY2UgYW5kIHNob3VsZCBub3QgYmUgdXNlZFxuICogZHVyaW5nIHRyYWluaW5nLlxuICpcbiAqIFdlIHVzZSB0aGUgbm90YXRpb24gYEJgLCBgVGAsIGBTYCBiZWxvdywgd2hlcmUgYEJgIGlzIHRoZSBiYXRjaCBkaW1lbnNpb24sXG4gKiBgVGAgaXMgdGhlIHRhcmdldCBzZXF1ZW5jZSBsZW5ndGgsIGFuZCBgU2AgaW4gdGhlIHNvdXJjZSBzZXF1ZW5jZSBsZW5ndGguXG4gKiBOb3RlIHRoYXQgZHVyaW5nIGdlbmVyYXRpdmUgZGVjb2RpbmcsIGBUYCBpcyB1c3VhbGx5IDEgKHlvdSBhcmVcbiAqIGdlbmVyYXRpbmcgYSB0YXJnZXQgc2VxdWVuY2Ugb2YgbGVuZ3RoIG9uZSB0byBwcmVkaWN0IHRoZSBuZXh0IHRva2VuKS5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAgIEFuIGAoYXR0ZW50aW9uT3V0cHV0LCBjYWNoZSlgIHR1cGxlLiBgYXR0ZW50aW9uT3V0cHV0YCBpcyB0aGUgcmVzdWx0XG4gKiAgICAgb2YgdGhlIGNvbXB1dGF0aW9uLCBvZiBzaGFwZSBgKEIsIFQsIGRpbSlgLCB3aGVyZSBgVGAgaXMgZm9yIHRhcmdldFxuICogICAgIHNlcXVlbmNlIHNoYXBlcyBhbmQgYGRpbWAgaXMgdGhlIHF1ZXJ5IGlucHV0IGxhc3QgZGltZW5zaW9uIGlmXG4gKiAgICAgYG91dHB1dFNoYXBlYCBpcyBgbnVsbGAuIE90aGVyd2lzZSwgdGhlIG11bHRpLWhlYWQgb3V0cHV0cyBhcmVcbiAqICAgICBwcm9qZWN0ZWQgdG8gdGhlIHNoYXBlIHNwZWNpZmllZCBieSBgb3V0cHV0U2hhcGVgLiBgY2FjaGVgIGlzIHRoZVxuICogICAgIHVwZGF0ZWQgY2FjaGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZWRNdWx0aUhlYWRBdHRlbnRpb24gZXh0ZW5kcyBNdWx0aUhlYWRBdHRlbnRpb24ge1xuXG4gIG92ZXJyaWRlIGNhbGwoXG4gICAgcXVlcnk6IFRlbnNvciwga3dhcmdzOiBDYWNoZWRNdWx0aUhlYWRBdHRlbnRpb25PcHRpb25zXG4gICk6IFRlbnNvcnxUZW5zb3IyRCB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbEFuZFJldHVybkNhY2hlKHF1ZXJ5LCBrd2FyZ3MpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4YWN0bHkgbGlrZSBgY2FsbGAgZXhjZXB0IGFsc28gcmV0dXJucyB0aGUgdXBkYXRlZCBjYWNoZS5cbiAgICovXG4gIGNhbGxBbmRSZXR1cm5DYWNoZShcbiAgICBxdWVyeTogVGVuc29yLCBrd2FyZ3M6IENhY2hlZE11bHRpSGVhZEF0dGVudGlvbk9wdGlvbnNcbiAgKTogW1RlbnNvcjFEfFRlbnNvcjJELCBUZW5zb3IxRHxUZW5zb3IyRF0ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgeWV0LmApO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQ2FjaGVkTXVsdGlIZWFkQXR0ZW50aW9uKTtcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkX211bHRpaGVhZF9hdHRlbnRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbGluZy9jYWNoZWRfbXVsdGloZWFkX2F0dGVudGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7R0FFRztBQUVILCtFQUErRTtBQUMvRSxPQUFPLEVBQVUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBaUR2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsa0JBQWtCO0lBRXJELElBQUksQ0FDWCxLQUFhLEVBQUUsTUFBdUM7UUFFdEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUNoQixLQUFhLEVBQ2IsRUFDRSxLQUFLLEVBQ0wsR0FBRyxFQUNILGFBQWEsRUFDYixLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2lCO1FBRW5DLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMs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QUM7Q0FDRjtBQUNELGFBQWEsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTEMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiAgQ2FjaGVkIE1IQSBsYXllciBiYXNlZCBvbiBgTXVsdGlIZWFkQXR0ZW50aW9uYC5cbiAqL1xuXG4vKiBPcmlnaW5hbCBzb3VyY2U6IGtlcmFzX25scC9sYXllcnMvbW9kZWxpbmcvY2FjaGVkX211bHRpX2hlYWRfYXR0ZW50aW9uLnB5ICovXG5pbXBvcnQgeyBUZW5zb3IsIGNhc3QsIGVpbnN1bSwgbXVsLCByZWNpcHJvY2FsLCBzZXJpYWxpemF0aW9uLCBzcXJ0LCBzdGFjaywgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgTXVsdGlIZWFkQXR0ZW50aW9uIH0gZnJvbSAnLi4vbXVsdGloZWFkX2F0dGVudGlvbic7XG5pbXBvcnQgeyBzbGljZVVwZGF0ZSB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENhY2hlZE11bHRpSGVhZEF0dGVudGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogUXVlcnkgYFRlbnNvcmAgb2Ygc2hhcGUgYChCLCBULCBkaW0pYC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFZhbHVlIGBUZW5zb3JgIG9mIHNoYXBlIGAoQiwgUyosIGRpbSlgLiBJZiBgY2FjaGVgIGlzIGBudWxsYCwgYFMqYFxuICAgKiBtdXN0IGVxdWFsIGBTYCBhbmQgbWF0Y2ggdGhlIHNoYXBlIG9mIGBhdHRlbnRpb25NYXNrYC4gSWYgYGNhY2hlYCBpc1xuICAgKiBub3QgYG51bGxgLCBgUypgIGNhbiBiZSBhbnkgbGVuZ3RoIGxlc3MgdGhhbiBgU2AsIGFuZCB0aGUgY29tcHV0ZWRcbiAgICogdmFsdWUgd2lsbCBiZSBzcGxpY2VkIGludG8gYGNhY2hlYCBhdCBgY2FjaGVVcGRhdGVJbmRleGAuXG4gICAqL1xuICB2YWx1ZTogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBLZXkgYFRlbnNvcmAgb2Ygc2hhcGUgYChCLCBTKiwgZGltKWAuICBJZiBgY2FjaGVgIGlzIGBudWxsYCwgYFMqYCBtdXN0XG4gICAqIGVxdWFsIGBTYCBhbmQgbWF0Y2ggdGhlIHNoYXBlIG9mIGBhdHRlbnRpb25NYXNrYC4gSWYgYGNhY2hlYCBpcyBub3QgYG51bGxgLFxuICAgKiBgUypgIGNhbiBiZSBhbnkgbGVuZ3RoIGxlc3MgdGhhbiBgU2AsIGFuZCB0aGUgY29tcHV0ZWQgdmFsdWUgd2lsbCBiZVxuICAgKiBzcGxpY2VkIGludG8gYGNhY2hlYCBhdCBgY2FjaGVVcGRhdGVJbmRleGAuXG4gICAqL1xuICBrZXk/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBtYXNrIG9mIHNoYXBlIGAoQiwgVCwgUylgLiBgYXR0ZW50aW9uTWFza2AgcHJldmVudHNcbiAgICogYXR0ZW50aW9uIHRvIGNlcnRhaW4gcG9zaXRpb25zLiBUaGUgYm9vbGVhbiBtYXNrIHNwZWNpZmllcyB3aGljaFxuICAgKiBxdWVyeSBlbGVtZW50cyBjYW4gYXR0ZW5kIHRvIHdoaWNoIGtleSBlbGVtZW50cywgMSBpbmRpY2F0ZXNcbiAgICogYXR0ZW50aW9uIGFuZCAwIGluZGljYXRlcyBubyBhdHRlbnRpb24uIEJyb2FkY2FzdGluZyBjYW4gaGFwcGVuIGZvclxuICAgKiB0aGUgbWlzc2luZyBiYXRjaCBkaW1lbnNpb25zIGFuZCB0aGUgaGVhZCBkaW1lbnNpb24uXG4gICAqL1xuICBhdHRlbnRpb25NYXNrPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGRlbnNlIGZsb2F0IFRlbnNvci4gVGhlIGtleS92YWx1ZSBjYWNoZSwgb2Ygc2hhcGVcbiAgICogYFtCLCAyLCBTLCBudW1IZWFkcywga2V5RGltc11gLCB3aGVyZSBgU2AgbXVzdCBhZ3JlZSB3aXRoIHRoZVxuICAgKiBgYXR0ZW50aW9uTWFza2Agc2hhcGUuIFRoaXMgYXJndW1lbnQgaXMgaW50ZW5kZWQgZm9yIHVzZSBkdXJpbmdcbiAgICogZ2VuZXJhdGlvbiB0byBhdm9pZCByZWNvbXB1dGluZyBpbnRlcm1lZGlhdGUgc3RhdGUuXG4gICAqL1xuICBjYWNoZT86IFRlbnNvcjtcblxuICAvKipcbiAgICogSW50ZWdlciBvciBJbnRlZ2VyIGBUZW5zb3JgLiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gdXBkYXRlIGBjYWNoZWBcbiAgICogKHVzdWFsbHkgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHRva2VuIGJlaW5nIHByb2Nlc3NlZCB3aGVuIHJ1bm5pbmdcbiAgICogZ2VuZXJhdGlvbikuIElmIGBjYWNoZVVwZGF0ZUluZGV4PW51bGxgIHdoaWxlIGBjYWNoZWAgaXMgc2V0LCB0aGUgY2FjaGVcbiAgICogd2lsbCBub3QgYmUgdXBkYXRlZC5cbiAgICovXG4gIGNhY2hlVXBkYXRlSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTXVsdGlIZWFkQXR0ZW50aW9uIGxheWVyIHdpdGggY2FjaGUgc3VwcG9ydC5cbiAqXG4gKiBUaGlzIGxheWVyIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYXV0b3JlZ3Jlc3NpdmUgZGVjb2RpbmcuIEl0IGNhbiBiZSB1c2VcbiAqIHRvIGNhY2hlIGRlY29kZXIgc2VsZi1hdHRlbnRpb24gYW5kIGNyb3NzLWF0dGVudGlvbi4gVGhlIGZvcndhcmQgcGFzc1xuICogY2FuIGhhcHBlbiBpbiBvbmUgb2YgdGhyZWUgbW9kZXM6XG4gKiAtIE5vIGNhY2hlLCBzYW1lIGFzIHJlZ3VsYXIgbXVsdGktaGVhZCBhdHRlbnRpb24uXG4gKiAtIFN0YXRpYyBjYWNoZSAoYGNhY2hlVXBkYXRlSW5kZXhgIGlzIE5vbmUpLiBJbiB0aGlzIGNhc2UsIHRoZVxuICogICAgIGNhY2hlZCBrZXkvdmFsdWUgcHJvamVjdGlvbnMgd2lsbCBiZSB1c2VkIGFuZCB0aGUgaW5wdXQgdmFsdWVzIHdpbGxcbiAqICAgICBiZSBpZ25vcmVkLlxuICogLSBVcGRhdGVkIGNhY2hlIChgY2FjaGVVcGRhdGVJbmRleGAgaXMgbm90IE5vbmUpLiBJbiB0aGlzIGNhc2UsIG5ld1xuICogICAgIGtleS92YWx1ZSBwcm9qZWN0aW9ucyBhcmUgY29tcHV0ZWQgdXNpbmcgdGhlIGlucHV0LCBhbmQgc3BsaWNlZCBpbnRvXG4gKiAgICAgdGhlIGNhY2hlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gKlxuICogTm90ZSB0aGF0IGNhY2hpbmcgaXMgdXNlZnVsIG9ubHkgZHVyaW5nIGluZmVyZW5jZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBkdXJpbmcgdHJhaW5pbmcuXG4gKlxuICogV2UgdXNlIHRoZSBub3RhdGlvbiBgQmAsIGBUYCwgYFNgIGJlbG93LCB3aGVyZSBgQmAgaXMgdGhlIGJhdGNoIGRpbWVuc2lvbixcbiAqIGBUYCBpcyB0aGUgdGFyZ2V0IHNlcXVlbmNlIGxlbmd0aCwgYW5kIGBTYCBpbiB0aGUgc291cmNlIHNlcXVlbmNlIGxlbmd0aC5cbiAqIE5vdGUgdGhhdCBkdXJpbmcgZ2VuZXJhdGl2ZSBkZWNvZGluZywgYFRgIGlzIHVzdWFsbHkgMSAoeW91IGFyZVxuICogZ2VuZXJhdGluZyBhIHRhcmdldCBzZXF1ZW5jZSBvZiBsZW5ndGggb25lIHRvIHByZWRpY3QgdGhlIG5leHQgdG9rZW4pLlxuICpcbiAqIFJldHVybnM6XG4gKiAgICAgQW4gYChhdHRlbnRpb25PdXRwdXQsIGNhY2hlKWAgdHVwbGUuIGBhdHRlbnRpb25PdXRwdXRgIGlzIHRoZSByZXN1bHRcbiAqICAgICBvZiB0aGUgY29tcHV0YXRpb24sIG9mIHNoYXBlIGAoQiwgVCwgZGltKWAsIHdoZXJlIGBUYCBpcyBmb3IgdGFyZ2V0XG4gKiAgICAgc2VxdWVuY2Ugc2hhcGVzIGFuZCBgZGltYCBpcyB0aGUgcXVlcnkgaW5wdXQgbGFzdCBkaW1lbnNpb24gaWZcbiAqICAgICBgb3V0cHV0U2hhcGVgIGlzIGBudWxsYC4gT3RoZXJ3aXNlLCB0aGUgbXVsdGktaGVhZCBvdXRwdXRzIGFyZVxuICogICAgIHByb2plY3RlZCB0byB0aGUgc2hhcGUgc3BlY2lmaWVkIGJ5IGBvdXRwdXRTaGFwZWAuIGBjYWNoZWAgaXMgdGhlXG4gKiAgICAgdXBkYXRlZCBjYWNoZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhY2hlZE11bHRpSGVhZEF0dGVudGlvbiBleHRlbmRzIE11bHRpSGVhZEF0dGVudGlvbiB7XG5cbiAgb3ZlcnJpZGUgY2FsbChcbiAgICBxdWVyeTogVGVuc29yLCBrd2FyZ3M6IENhY2hlZE11bHRpSGVhZEF0dGVudGlvbk9wdGlvbnNcbiAgKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsQW5kUmV0dXJuQ2FjaGUocXVlcnksIGt3YXJncylbMF07XG4gIH1cblxuICAvKipcbiAgICogRXhhY3RseSBsaWtlIGBjYWxsYCBleGNlcHQgYWxzbyByZXR1cm5zIHRoZSB1cGRhdGVkIGNhY2hlLlxuICAgKi9cbiAgY2FsbEFuZFJldHVybkNhY2hlKFxuICAgIHF1ZXJ5OiBUZW5zb3IsXG4gICAge1xuICAgICAgdmFsdWUsXG4gICAgICBrZXksXG4gICAgICBhdHRlbnRpb25NYXNrLFxuICAgICAgY2FjaGUsXG4gICAgICBjYWNoZVVwZGF0ZUluZGV4XG4gICAgfSA6IENhY2hlZE11bHRpSGVhZEF0dGVudGlvbk9wdGlvbnNcbiAgKTogW1RlbnNvciwgVGVuc29yXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmJ1aWx0RnJvbVNpZ25hdHVyZSkge1xuICAgICAgICB0aGlzLmJ1aWxkRnJvbVNpZ25hdHVyZShcbiAgICAgICAgICBxdWVyeS5zaGFwZSwgdmFsdWUuc2hhcGUsIGtleSA/IGtleS5zaGFwZSA6IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGtleSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBxdWVyeSA9IHRoaXMucXVlcnlEZW5zZS5hcHBseShxdWVyeSkgYXMgVGVuc29yO1xuICAgICAgLy8gSWYgY2FjaGUgaXMgbm90IGBudWxsYCwgd2Ugd2lsbCB1c2UgdGhlIGNhY2hlIHRvIGNvbXB1dGUgdGhlIGZpbmFsIGtleVxuICAgICAgLy8gYW5kIHZhbHVlIHRlbnNvcnMuIElmIGBjYWNoZVVwZGF0ZUluZGV4YCBpcyBub3QgYG51bGxgLCB3ZSB3aWxsIGZpcnN0XG4gICAgICAvLyB1cGRhdGUgdGhlIGNhY2hlIGJlZm9yZSB1c2UuIFRvIGRvIHRoaXMsIHdlIGZpcnN0IGNhbGwgdGhlXG4gICAgICAvLyBga2V5RGVuc2VgIGFuZCBgdmFsdWVEZW5zZWAgbGF5ZXJzLCBhbmQgY29weSB0aGUgb3V0cHV0cyBpbnRvIHRoZVxuICAgICAgLy8gY2FjaGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gYGNhY2hlID0gbnVsbGAgaGFuZGxlcyB0aGUgdHJhaW5pbmdcbiAgICAgIC8vIGNhc2UsIHdoZXJlIHdlIGRvbid0IHVzZSB0aGUgY2FjaGUgYXQgYWxsLlxuICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3Qga2V5Q2FjaGUgPSBjYWNoZS5nYXRoZXIoWzBdLCAxKS5zcXVlZXplKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2FjaGUgPSBjYWNoZS5nYXRoZXIoWzFdLCAxKS5zcXVlZXplKCk7XG4gICAgICAgIGlmIChjYWNoZVVwZGF0ZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICBrZXkgPSBrZXlDYWNoZTtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlQ2FjaGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qga2V5VXBkYXRlID0gdGhpcy5rZXlEZW5zZS5hcHBseShrZXkpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZVVwZGF0ZSA9IHRoaXMudmFsdWVEZW5zZS5hcHBseSh2YWx1ZSkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gWzAsIGNhY2hlVXBkYXRlSW5kZXgsIDAsIDBdO1xuICAgICAgICAgIGtleSA9IHNsaWNlVXBkYXRlKGtleUNhY2hlLCBzdGFydCwga2V5VXBkYXRlKTtcbiAgICAgICAgICB2YWx1ZSA9IHNsaWNlVXBkYXRlKHZhbHVlQ2FjaGUsIHN0YXJ0LCB2YWx1ZVVwZGF0ZSk7XG4gICAgICAgICAgY2FjaGUgPSBzdGFjayhba2V5LCB2YWx1ZV0sIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2FjaGVVcGRhdGVJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnYGNhY2hlVXBkYXRlSW5kZXhgIHNob3VsZCBub3QgYmUgc2V0IGlmIGBjYWNoZWAgaXMgYG51bGxgLiAnICtcbiAgICAgICAgICAgIGBSZWNlaXZlZDogY2FjaGU9JHtjYWNoZX0sIGNhY2hlVXBkYXRlSW5kZXg9JHtjYWNoZVVwZGF0ZUluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IHRoaXMua2V5RGVuc2UuYXBwbHkoa2V5KSBhcyBUZW5zb3I7XG4gICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZURlbnNlLmFwcGx5KHZhbHVlKSBhcyBUZW5zb3I7XG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5ID0gbXVsKHF1ZXJ5LCByZWNpcHJvY2FsKHNxcnQoY2FzdCh0aGlzLmtleURpbSwgcXVlcnkuZHR5cGUpKSkpO1xuICAgICAgbGV0IGF0dGVudGlvblNjb3JlcyA9IGVpbnN1bSh0aGlzLmRvdFByb2R1Y3RFcXVhdGlvbiwga2V5LCBxdWVyeSk7XG4gICAgICBhdHRlbnRpb25TY29yZXMgPSB0aGlzLm1hc2tlZFNvZnRtYXgoYXR0ZW50aW9uU2NvcmVzLCBhdHRlbnRpb25NYXNrKTtcbiAgICAgIGF0dGVudGlvblNjb3JlcyA9IHRoaXMuZHJvcG91dExheWVyLmFwcGx5KGF0dGVudGlvblNjb3JlcykgYXMgVGVuc29yO1xuXG4gICAgICBsZXQgYXR0ZW50aW9uT3V0cHV0ID1cbiAgICAgICAgZWluc3VtKHRoaXMuY29tYmluZUVxdWF0aW9uLCBhdHRlbnRpb25TY29yZXMsIHZhbHVlKTtcbiAgICAgIGF0dGVudGlvbk91dHB1dCA9IHRoaXMub3V0cHV0RGVuc2UuYXBwbHkoYXR0ZW50aW9uT3V0cHV0KSBhcyBUZW5zb3I7XG5cbiAgICAgIHJldHVybiBbYXR0ZW50aW9uT3V0cHV0LCBjYWNoZV07XG4gICAgfSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhDYWNoZWRNdWx0aUhlYWRBdHRlbnRpb24pO1xuIl19

@@ -21,6 +21,7 @@ /**

*/
import { Tensor, Tensor1D, Tensor2D, serialization } from '@tensorflow/tfjs-core';
import { Tensor, serialization } from '@tensorflow/tfjs-core';
import { Shape } from '../../../keras_format/common';
import { Layer, LayerArgs } from '../../../engine/topology';
import { InitializerIdentifier } from '../../../initializers';
import { Initializer, InitializerIdentifier } from '../../../initializers';
import { LayerVariable } from '../../../variables';
export declare interface PositionEmbeddingArgs extends LayerArgs {

@@ -35,3 +36,3 @@ /**

*/
initializer?: InitializerIdentifier;
initializer?: Initializer | InitializerIdentifier;
}

@@ -81,6 +82,10 @@ export declare interface PositionEmbeddingOptions {

static readonly className = "PositionEmbedding";
private sequenceLength;
private initializer;
protected positionEmbeddings: LayerVariable;
constructor(args: PositionEmbeddingArgs);
getConfig(): serialization.ConfigDict;
build(inputShape: Shape | Shape[]): void;
call(inputs: Tensor | Tensor[], kwargs?: PositionEmbeddingOptions): Tensor1D | Tensor2D;
build(inputShape: Shape): void;
call(inputs: Tensor | Tensor[], kwargs?: PositionEmbeddingOptions): Tensor;
computeOutputShape(inputShape: Shape): Shape;
}

@@ -21,5 +21,7 @@ /**

/* Original source: keras_nlp/layers/modeling/position_embedding.py */
import { serialization } from '@tensorflow/tfjs-core';
import { serialization, tidy } from '@tensorflow/tfjs-core';
import { Layer } from '../../../engine/topology';
import { NotImplementedError } from '../../../errors';
import { ValueError } from '../../../errors';
import { getInitializer, serializeInitializer } from '../../../initializers';
import { getExactlyOneTensor } from '../../../utils/types_utils';
/**

@@ -61,13 +63,38 @@ * A layer which learns a position embedding for input sequences.

super(args);
throw new NotImplementedError('PositionEmbedding not implemented yet.');
if (args.sequenceLength == null) {
throw new ValueError('`sequenceLength` must be an Integer, received `null`.');
}
this.sequenceLength = args.sequenceLength;
this.initializer = getInitializer(args.initializer || 'glorotUniform');
}
getConfig() {
throw new NotImplementedError('Not implemented yet.');
const config = {
'sequenceLength': this.sequenceLength,
'initializer': serializeInitializer(this.initializer),
};
const baseConfig = super.getConfig();
Object.assign(config, baseConfig);
return config;
}
build(inputShape) {
throw new NotImplementedError('Not implemented yet.');
const featureSize = inputShape[inputShape.length - 1];
this.positionEmbeddings = this.addWeight('embeddings', [this.sequenceLength, featureSize], null, this.initializer, null, true);
super.build(inputShape);
}
call(inputs, kwargs = { startIndex: 0 }) {
throw new NotImplementedError('Not implemented yet.');
call(inputs, kwargs) {
return tidy(() => {
var _a;
kwargs.startIndex = (_a = kwargs.startIndex) !== null && _a !== void 0 ? _a : 0;
const shape = getExactlyOneTensor(inputs).shape;
const featureLength = shape[shape.length - 1];
const sequenceLength = shape[shape.length - 2];
// trim to match the length of the input sequence, which might be less
// than the sequence_length of the layer.
const positionEmbeddings = this.positionEmbeddings.read().slice([kwargs.startIndex, 0], [sequenceLength, featureLength]);
return positionEmbeddings.broadcastTo(shape);
});
}
computeOutputShape(inputShape) {
return inputShape;
}
}

@@ -78,2 +105,2 @@ /** @nocollapse */

serialization.registerClass(PositionEmbedding);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25fZW1iZWRkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9ubHAvbW9kZWxpbmcvcG9zaXRpb25fZW1iZWRkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOztHQUVHO0FBRUgsc0VBQXNFO0FBQ3RFLE9BQU8sRUFBOEIsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHbEYsT0FBTyxFQUFFLEtBQUssRUFBYSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBd0J0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFJMUMsWUFBWSxJQUEyQjtRQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFWixNQUFNLElBQUksbUJBQW1CLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRVEsU0FBUztRQUNoQixNQUFNLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRVEsS0FBSyxDQUFDLFVBQTJCO1FBQ3hDLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUSxJQUFJLENBQ1gsTUFBdUIsRUFDdkIsU0FBaUMsRUFBQyxVQUFVLEVBQUUsQ0FBQyxFQUFDO1FBRWhELE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBdEJELGtCQUFrQjtBQUNGLDJCQUFTLEdBQUcsbUJBQW1CLENBQUM7U0FGckMsaUJBQWlCO0FBeUI5QixhQUFhLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIFBvc2l0aW9uIGVtYmVkZGluZyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBgdGYubGF5ZXJzLkxheWVyYC5cbiAqL1xuXG4vKiBPcmlnaW5hbCBzb3VyY2U6IGtlcmFzX25scC9sYXllcnMvbW9kZWxpbmcvcG9zaXRpb25fZW1iZWRkaW5nLnB5ICovXG5pbXBvcnQgeyBUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRCwgc2VyaWFsaXphdGlvbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vLi4vLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQgeyBMYXllciwgTGF5ZXJBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7IE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6ZXJJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vaW5pdGlhbGl6ZXJzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBvc2l0aW9uRW1iZWRkaW5nQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBJbnRlZ2VyLiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGR5bmFtaWMgc2VxdWVuY2UuXG4gICAqL1xuICBzZXF1ZW5jZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbGl6ZXIgdG8gdXNlIGZvciB0aGUgZW1iZWRkaW5nIHdlaWdodHMuXG4gICAqIERlZmF1bHRzIHRvIGBcImdsb3JvdFVuaWZvcm1cImAuXG4gICAqL1xuICBpbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBvc2l0aW9uRW1iZWRkaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJbnRlZ2VyLiBJbmRleCB0byBzdGFydCB0aGUgcG9zaXRpb24gZW1iZWRkaW5ncyBhdC5cbiAgICogRGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBsYXllciB3aGljaCBsZWFybnMgYSBwb3NpdGlvbiBlbWJlZGRpbmcgZm9yIGlucHV0IHNlcXVlbmNlcy5cbiAqXG4gKiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhhdCBpbiB0aGUgaW5wdXQgdGVuc29yLCB0aGUgbGFzdCBkaW1lbnNpb24gY29ycmVzcG9uZHNcbiAqIHRvIHRoZSBmZWF0dXJlcywgYW5kIHRoZSBkaW1lbnNpb24gYmVmb3JlIHRoZSBsYXN0IGNvcnJlc3BvbmRzIHRvIHRoZVxuICogc2VxdWVuY2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogQ2FsbGVkIGRpcmVjdGx5IG9uIGlucHV0LlxuICogYGBganNcbiAqIGNvbnN0IGxheWVyID0gbmV3IFBvc2l0aW9uRW1iZWRkaW5nKHtzZXF1ZW5jZUxlbmd0aD0xMH0pO1xuICogbGF5ZXIuY2FsbCh0Zi56ZXJvcyhbOCwgMTAsIDE2XSkpO1xuICogYGBgXG4gKlxuICogQ29tYmluZSB3aXRoIGEgdG9rZW4gZW1iZWRkaW5nLlxuICogYGBganNcbiAqIGNvbnN0IHNlcUxlbmd0aCA9IDUwO1xuICogY29uc3Qgdm9jYWJTaXplID0gNTAwMDtcbiAqIGNvbnN0IGVtYmVkRGltID0gMTI4O1xuICogY29uc3QgaW5wdXRzID0gdGYuaW5wdXQoe3NoYXBlOiBbc2VxTGVuZ3RoXX0pO1xuICogY29uc3QgdG9rZW5FbWJlZGRpbmdzID0gdGYubGF5ZXJzLmVtYmVkZGluZyh7XG4gKiAgICAgaW5wdXREaW09dm9jYWJTaXplLCBvdXRwdXREaW09ZW1iZWREaW1cbiAqIH0pLmFwcGx5KGlucHV0cyk7XG4gKiBjb25zdCBwb3NpdGlvbkVtYmVkZGluZ3MgPSBuZXcgUG9zaXRpb25FbWJlZGRpbmcoe1xuICogICAgIHNlcXVlbmNlTGVuZ3RoOiBzZXFMZW5ndGhcbiAqIH0pLmFwcGx5KHRva2VuRW1iZWRkaW5ncyk7XG4gKiBjb25zdCBvdXRwdXRzID0gdGYuYWRkKHRva2VuRW1iZWRkaW5ncywgcG9zaXRpb25FbWJlZGRpbmdzKTtcbiAqIGBgYFxuICpcbiAqIFJlZmVyZW5jZTpcbiAqICAtIFtEZXZsaW4gZXQgYWwuLCAyMDE5XShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTgxMC4wNDgwNSlcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc2l0aW9uRW1iZWRkaW5nIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdQb3NpdGlvbkVtYmVkZGluZyc7XG5cbiAgY29uc3RydWN0b3IoYXJnczogUG9zaXRpb25FbWJlZGRpbmdBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignUG9zaXRpb25FbWJlZGRpbmcgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0LicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGUgfCBTaGFwZVtdKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBjYWxsKFxuICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdLFxuICAgIGt3YXJnczogUG9zaXRpb25FbWJlZGRpbmdPcHRpb25zPXtzdGFydEluZGV4OiAwfVxuICApOiBUZW5zb3IxRHxUZW5zb3IyRCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhQb3NpdGlvbkVtYmVkZGluZyk7XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25fZW1iZWRkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9ubHAvbW9kZWxpbmcvcG9zaXRpb25fZW1iZWRkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOztHQUVHO0FBRUgsc0VBQXNFO0FBQ3RFLE9BQU8sRUFBVSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHcEUsT0FBTyxFQUFFLEtBQUssRUFBYSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNDLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBd0JqRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7SUFPMUMsWUFBWSxJQUEyQjtRQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxVQUFVLENBQ2xCLHVEQUF1RCxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRVEsU0FBUztRQUNoQixNQUFNLE1BQU0sR0FBRztZQUNiLGdCQUFnQixFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ3JDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3RELENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVRLEtBQUssQ0FBQyxVQUFpQjtRQUM5QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDdEMsWUFBWSxFQUNaLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsRUFDbEMsSUFBSSxFQUNKLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksRUFDSixJQUFJLENBQ0wsQ0FBQztRQUNGLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVRLElBQUksQ0FDWCxNQUF1QixFQUN2QixNQUFpQztRQUVqQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7O1lBQ2YsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFBLE1BQU0sQ0FBQyxVQUFVLG1DQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDaEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0Msc0VBQXNFO1lBQ3RFLHlDQUF5QztZQUN6QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQzdELENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sa0JBQWtCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLGtCQUFrQixDQUFDLFVBQWlCO1FBQzNDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7O0FBMURELGtCQUFrQjtBQUNGLDJCQUFTLEdBQUcsbUJBQW1CLENBQUM7U0FGckMsaUJBQWlCO0FBNkQ5QixhQUFhLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIFBvc2l0aW9uIGVtYmVkZGluZyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBgdGYubGF5ZXJzLkxheWVyYC5cbiAqL1xuXG4vKiBPcmlnaW5hbCBzb3VyY2U6IGtlcmFzX25scC9sYXllcnMvbW9kZWxpbmcvcG9zaXRpb25fZW1iZWRkaW5nLnB5ICovXG5pbXBvcnQgeyBUZW5zb3IsIHNlcmlhbGl6YXRpb24sIHRpZHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4uLy4uLy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHsgTGF5ZXIsIExheWVyQXJncyB9IGZyb20gJy4uLy4uLy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IEluaXRpYWxpemVyLCBJbml0aWFsaXplcklkZW50aWZpZXIsIGdldEluaXRpYWxpemVyLCBzZXJpYWxpemVJbml0aWFsaXplciB9IGZyb20gJy4uLy4uLy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQgeyBnZXRFeGFjdGx5T25lVGVuc29yIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0IHsgTGF5ZXJWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb3NpdGlvbkVtYmVkZGluZ0FyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlci4gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkeW5hbWljIHNlcXVlbmNlLlxuICAgKi9cbiAgc2VxdWVuY2VMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWxpemVyIHRvIHVzZSBmb3IgdGhlIGVtYmVkZGluZyB3ZWlnaHRzLlxuICAgKiBEZWZhdWx0cyB0byBgXCJnbG9yb3RVbmlmb3JtXCJgLlxuICAgKi9cbiAgaW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcnxJbml0aWFsaXplcklkZW50aWZpZXI7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb3NpdGlvbkVtYmVkZGluZ09wdGlvbnMge1xuICAvKipcbiAgICogSW50ZWdlci4gSW5kZXggdG8gc3RhcnQgdGhlIHBvc2l0aW9uIGVtYmVkZGluZ3MgYXQuXG4gICAqIERlZmF1bHRzIHRvIDAuXG4gICAqL1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgbGF5ZXIgd2hpY2ggbGVhcm5zIGEgcG9zaXRpb24gZW1iZWRkaW5nIGZvciBpbnB1dCBzZXF1ZW5jZXMuXG4gKlxuICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgaW4gdGhlIGlucHV0IHRlbnNvciwgdGhlIGxhc3QgZGltZW5zaW9uIGNvcnJlc3BvbmRzXG4gKiB0byB0aGUgZmVhdHVyZXMsIGFuZCB0aGUgZGltZW5zaW9uIGJlZm9yZSB0aGUgbGFzdCBjb3JyZXNwb25kcyB0byB0aGVcbiAqIHNlcXVlbmNlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIENhbGxlZCBkaXJlY3RseSBvbiBpbnB1dC5cbiAqIGBgYGpzXG4gKiBjb25zdCBsYXllciA9IG5ldyBQb3NpdGlvbkVtYmVkZGluZyh7c2VxdWVuY2VMZW5ndGg9MTB9KTtcbiAqIGxheWVyLmNhbGwodGYuemVyb3MoWzgsIDEwLCAxNl0pKTtcbiAqIGBgYFxuICpcbiAqIENvbWJpbmUgd2l0aCBhIHRva2VuIGVtYmVkZGluZy5cbiAqIGBgYGpzXG4gKiBjb25zdCBzZXFMZW5ndGggPSA1MDtcbiAqIGNvbnN0IHZvY2FiU2l6ZSA9IDUwMDA7XG4gKiBjb25zdCBlbWJlZERpbSA9IDEyODtcbiAqIGNvbnN0IGlucHV0cyA9IHRmLmlucHV0KHtzaGFwZTogW3NlcUxlbmd0aF19KTtcbiAqIGNvbnN0IHRva2VuRW1iZWRkaW5ncyA9IHRmLmxheWVycy5lbWJlZGRpbmcoe1xuICogICAgIGlucHV0RGltPXZvY2FiU2l6ZSwgb3V0cHV0RGltPWVtYmVkRGltXG4gKiB9KS5hcHBseShpbnB1dHMpO1xuICogY29uc3QgcG9zaXRpb25FbWJlZGRpbmdzID0gbmV3IFBvc2l0aW9uRW1iZWRkaW5nKHtcbiAqICAgICBzZXF1ZW5jZUxlbmd0aDogc2VxTGVuZ3RoXG4gKiB9KS5hcHBseSh0b2tlbkVtYmVkZGluZ3MpO1xuICogY29uc3Qgb3V0cHV0cyA9IHRmLmFkZCh0b2tlbkVtYmVkZGluZ3MsIHBvc2l0aW9uRW1iZWRkaW5ncyk7XG4gKiBgYGBcbiAqXG4gKiBSZWZlcmVuY2U6XG4gKiAgLSBbRGV2bGluIGV0IGFsLiwgMjAxOV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE4MTAuMDQ4MDUpXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbkVtYmVkZGluZyBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnUG9zaXRpb25FbWJlZGRpbmcnO1xuICBwcml2YXRlIHNlcXVlbmNlTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgcG9zaXRpb25FbWJlZGRpbmdzOiBMYXllclZhcmlhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFBvc2l0aW9uRW1iZWRkaW5nQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIGlmIChhcmdzLnNlcXVlbmNlTGVuZ3RoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAnYHNlcXVlbmNlTGVuZ3RoYCBtdXN0IGJlIGFuIEludGVnZXIsIHJlY2VpdmVkIGBudWxsYC4nKTtcbiAgICB9XG4gICAgdGhpcy5zZXF1ZW5jZUxlbmd0aCA9IGFyZ3Muc2VxdWVuY2VMZW5ndGg7XG4gICAgdGhpcy5pbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKGFyZ3MuaW5pdGlhbGl6ZXIgfHwgJ2dsb3JvdFVuaWZvcm0nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICdzZXF1ZW5jZUxlbmd0aCc6IHRoaXMuc2VxdWVuY2VMZW5ndGgsXG4gICAgICAnaW5pdGlhbGl6ZXInOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmluaXRpYWxpemVyKSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIG92ZXJyaWRlIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZVNpemUgPSBpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5wb3NpdGlvbkVtYmVkZGluZ3MgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICdlbWJlZGRpbmdzJyxcbiAgICAgIFt0aGlzLnNlcXVlbmNlTGVuZ3RoLCBmZWF0dXJlU2l6ZV0sXG4gICAgICBudWxsLFxuICAgICAgdGhpcy5pbml0aWFsaXplcixcbiAgICAgIG51bGwsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBzdXBlci5idWlsZChpbnB1dFNoYXBlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoXG4gICAgaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sXG4gICAga3dhcmdzPzogUG9zaXRpb25FbWJlZGRpbmdPcHRpb25zXG4gICk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAga3dhcmdzLnN0YXJ0SW5kZXggPSBrd2FyZ3Muc3RhcnRJbmRleCA/PyAwO1xuICAgICAgY29uc3Qgc2hhcGUgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cykuc2hhcGU7XG4gICAgICBjb25zdCBmZWF0dXJlTGVuZ3RoID0gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBzZXF1ZW5jZUxlbmd0aCA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdO1xuICAgICAgLy8gdHJpbSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZSwgd2hpY2ggbWlnaHQgYmUgbGVzc1xuICAgICAgLy8gdGhhbiB0aGUgc2VxdWVuY2VfbGVuZ3RoIG9mIHRoZSBsYXllci5cbiAgICAgIGNvbnN0IHBvc2l0aW9uRW1iZWRkaW5ncyA9IHRoaXMucG9zaXRpb25FbWJlZGRpbmdzLnJlYWQoKS5zbGljZShcbiAgICAgICAgW2t3YXJncy5zdGFydEluZGV4LCAwXSwgW3NlcXVlbmNlTGVuZ3RoLCBmZWF0dXJlTGVuZ3RoXSk7XG4gICAgICByZXR1cm4gcG9zaXRpb25FbWJlZGRpbmdzLmJyb2FkY2FzdFRvKHNoYXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFBvc2l0aW9uRW1iZWRkaW5nKTtcbiJdfQ==

@@ -21,7 +21,11 @@ /**

*/
import { Tensor, Tensor1D, Tensor2D, serialization } from '@tensorflow/tfjs-core';
import { Layer, LayerArgs } from '../../../engine/topology';
import { InitializerIdentifier } from '../../../initializers';
import { Tensor, serialization } from '@tensorflow/tfjs-core';
import { Activation } from '../../../activations';
import { Layer, LayerArgs, SymbolicTensor } from '../../../engine/topology';
import { Initializer, InitializerIdentifier } from '../../../initializers';
import { ActivationIdentifier } from '../../../keras_format/activation_config';
import { Shape } from '../../../keras_format/common';
import { Dense, Dropout } from '../../core';
import { LayerNormalization } from '../../normalization';
import { CachedMultiHeadAttention } from './cached_multihead_attention';
export declare interface TransformerDecoderArgs extends LayerArgs {

@@ -45,3 +49,3 @@ /**

*/
activation?: ActivationIdentifier;
activation?: Activation | ActivationIdentifier;
/**

@@ -56,3 +60,3 @@ * The eps value in layer normalization components.

*/
kernelInitializer?: InitializerIdentifier;
kernelInitializer?: Initializer | InitializerIdentifier;
/**

@@ -62,3 +66,3 @@ * The bias initializer for the dense and multiheaded attention layers.

*/
biasInitializer?: InitializerIdentifier;
biasInitializer?: Initializer | InitializerIdentifier;
/**

@@ -71,3 +75,3 @@ * If true, the inputs to the attention layer(s) and the intermediate dense

*/
normalizeFirst: boolean;
normalizeFirst?: boolean;
}

@@ -83,3 +87,3 @@ export declare interface TransformerDecoderOptions {

*/
encoderSequence?: Tensor;
encoderSequence?: Tensor | SymbolicTensor;
/**

@@ -89,3 +93,3 @@ * A boolean Tensor, the padding mask of decoder sequence, must be of shape

*/
decoderPaddingMask: Tensor;
decoderPaddingMask?: Tensor | SymbolicTensor;
/**

@@ -116,3 +120,3 @@ * A boolean Tensor. Customized decoder sequence mask, must be of shape

*/
selfAttentionCacheUpdateIndex?: number | Tensor;
selfAttentionCacheUpdateIndex?: number;
/**

@@ -129,3 +133,3 @@ * A dense float Tensor. The cache of key/value pairs in the cross-attention

*/
crossAttentionCacheUpdateIndex?: number | Tensor;
crossAttentionCacheUpdateIndex?: number;
/**

@@ -188,2 +192,22 @@ * If true, a causal mask (masking out future input) is applied on the decoder

static readonly className = "TransformerDecoder";
protected intermediateDim: number;
protected numHeads: number;
protected dropout: number;
protected activation: Activation;
protected layerNormEpsilon: number;
protected kernelInitializer: Initializer;
protected biasInitializer: Initializer;
protected normalizeFirst: boolean;
protected decoderSequenceShape: Shape;
protected encoderSequenceShape: Shape;
protected selfAttentionLayer: CachedMultiHeadAttention;
protected selfAttentionLayernorm: LayerNormalization;
protected selfAttentionDropout: Dropout;
protected selfCrossAttentionLayer: CachedMultiHeadAttention;
protected selfCrossAttentionLayernorm: LayerNormalization;
protected selfCrossAttentionDropout: Dropout;
protected feedforwardIntermediateDense: Dense;
protected feedforwardOutputDense: Dense;
protected feedforwardLayernorm: LayerNormalization;
protected feedforwardDropout: Dropout;
constructor(args: TransformerDecoderArgs);

@@ -196,5 +220,7 @@ /**

build(inputShape: Shape | [Shape, Shape]): void;
apply(inputs: Tensor | Tensor[], kwargs?: TransformerDecoderOptions): Tensor | Tensor[];
call(decoderSequence: Tensor, kwargs: TransformerDecoderOptions): Tensor | Tensor[];
apply(decoderSequence: Tensor | SymbolicTensor, kwargs?: TransformerDecoderOptions): Tensor | SymbolicTensor;
call(decoderSequence: Tensor, kwargs: TransformerDecoderOptions): Tensor;
/**
* Forward pass of the TransformerDecoder.
*
* @returns One of three things, depending on call arguments:

@@ -208,3 +234,3 @@ * - `[outputs, null, null]`, if `selfAttentionCache` is `null`.

*/
callAndReturnCaches(decoderSequence: Tensor, kwargs: TransformerDecoderOptions): [Tensor1D | Tensor2D, Tensor1D | Tensor2D, Tensor1D | Tensor2D];
callAndReturnCaches(decoderSequence: Tensor, kwargs: TransformerDecoderOptions): [Tensor, Tensor, Tensor];
private computeSelfAttentionMask;

@@ -211,0 +237,0 @@ getConfig(): serialization.ConfigDict;

@@ -21,5 +21,11 @@ /**

/* Original source: keras_nlp/layers/modeling/transformer_decoder.py */
import { serialization } from '@tensorflow/tfjs-core';
import { add, serialization, tidy } from '@tensorflow/tfjs-core';
import { getActivation, serializeActivation } from '../../../activations';
import { Layer, } from '../../../engine/topology';
import { NotImplementedError } from '../../../errors';
import { ValueError } from '../../../errors';
import { getInitializer, serializeInitializer } from '../../../initializers';
import { Dense, Dropout } from '../../core';
import { LayerNormalization } from '../../normalization';
import { CachedMultiHeadAttention } from './cached_multihead_attention';
import { computeCausalMask, mergePaddingAndAttentionMask } from './transformer_layer_utils';
/**

@@ -74,4 +80,13 @@ * Transformer decoder.

constructor(args) {
var _a, _b, _c, _d, _e, _f;
super(args);
throw new NotImplementedError(`Not implemented yet.`);
this.intermediateDim = args.intermediateDim;
this.numHeads = args.numHeads;
this.dropout = (_a = args.dropout) !== null && _a !== void 0 ? _a : 0;
this.activation = getActivation((_b = args.activation) !== null && _b !== void 0 ? _b : 'relu');
this.layerNormEpsilon = (_c = args.layerNormEpsilon) !== null && _c !== void 0 ? _c : 1e-05;
this.kernelInitializer =
getInitializer((_d = args.kernelInitializer) !== null && _d !== void 0 ? _d : 'glorotUniform');
this.biasInitializer = getInitializer((_e = args.biasInitializer) !== null && _e !== void 0 ? _e : 'zeros');
this.normalizeFirst = (_f = args.normalizeFirst) !== null && _f !== void 0 ? _f : false;
}

@@ -84,6 +99,59 @@ /**

build(inputShape) {
throw new NotImplementedError(`Not implemented yet.`);
if (Array.isArray(inputShape[0])) {
// `inputShape` is of type [Shape, Shape].
[this.decoderSequenceShape, this.encoderSequenceShape] =
inputShape;
}
else {
this.decoderSequenceShape = inputShape;
}
// Infer the dimension of our hidden feature size from the build shape.
const hiddenDim = this.decoderSequenceShape[this.decoderSequenceShape.length - 1];
// Attention head size is `hiddenDim` over the number of heads.
const headDim = Math.floor(hiddenDim / this.numHeads);
// Self attention layers.
this.selfAttentionLayer = new CachedMultiHeadAttention({
numHeads: this.numHeads,
keyDim: headDim,
dropout: this.dropout,
kernelInitializer: getInitializer(this.kernelInitializer.getClassName()),
biasInitializer: getInitializer(this.biasInitializer.getClassName()),
});
this.selfAttentionLayer.buildFromSignature(this.decoderSequenceShape, this.decoderSequenceShape);
this.selfAttentionLayernorm =
new LayerNormalization({ epsilon: this.layerNormEpsilon });
this.selfAttentionLayernorm.build(this.decoderSequenceShape);
this.selfAttentionDropout = new Dropout({ rate: this.dropout });
// Cross attention layers are optional.
// TODO(pforderique): Add cross attention layers.
// Feedforward layers.
this.feedforwardIntermediateDense = new Dense({
units: this.intermediateDim,
activation: this.activation.getClassName(),
kernelInitializer: getInitializer(this.kernelInitializer.getClassName()),
biasInitializer: getInitializer(this.biasInitializer.getClassName()),
});
this.feedforwardIntermediateDense.build(this.decoderSequenceShape);
this.feedforwardOutputDense = new Dense({
units: hiddenDim,
kernelInitializer: getInitializer(this.kernelInitializer.getClassName()),
biasInitializer: getInitializer(this.biasInitializer.getClassName()),
});
const intermediateShape = this.decoderSequenceShape.slice();
intermediateShape[intermediateShape.length - 1] = this.intermediateDim;
this.feedforwardOutputDense.build(intermediateShape);
this.feedforwardLayernorm =
new LayerNormalization({ epsilon: this.layerNormEpsilon });
this.feedforwardLayernorm.build(this.decoderSequenceShape);
this.feedforwardDropout = new Dropout({ rate: this.dropout });
// Create layers based on input shape.
this.built = true;
}
apply(inputs, kwargs) {
throw new NotImplementedError(`Not implemented yet.`);
apply(decoderSequence, kwargs) {
if (!this.built) {
const decoderSequenceShape = decoderSequence.shape;
const encoderSequenceShape = kwargs && kwargs.encoderSequence ? kwargs.encoderSequence.shape : null;
this.build([decoderSequenceShape, encoderSequenceShape]);
}
return super.apply(decoderSequence, kwargs);
}

@@ -94,2 +162,4 @@ call(decoderSequence, kwargs) {

/**
* Forward pass of the TransformerDecoder.
*
* @returns One of three things, depending on call arguments:

@@ -104,12 +174,111 @@ * - `[outputs, null, null]`, if `selfAttentionCache` is `null`.

callAndReturnCaches(decoderSequence, kwargs) {
throw new NotImplementedError(`Not implemented yet. Uses ${this.computeSelfAttentionMask}`);
return tidy(() => {
const hasEncoderSequence = kwargs.encoderSequence != null;
const hasCrossAttention = this.selfCrossAttentionLayer != null;
if (!hasCrossAttention && hasEncoderSequence) {
throw new ValueError('The number of call arguments to `TransformerDecoder` should ' +
'not change. Use `layer.apply(decoderSequence, {encoderSequence})` ' +
'to build a layer with cross attention, or ' +
'`layer.apply (decoderSequence)` to build a layer without. ' +
'This layer has been built without cross attention, but ' +
'you are trying to call it with encoderSequence.');
}
else if (hasCrossAttention && !hasEncoderSequence) {
throw new ValueError('The number of call arguments to `TransformerDecoder` should not ' +
'change. Use `layer.apply(decoderSequence, {encoderSequence})` ' +
'to build a layer with cross attention, or ' +
'`layer.apply(decoderSequence)` to build a layer without. ' +
'This layer has been built with cross attention, but ' +
'you did not provide encoderSequence.');
}
const hasSelfAttentionCache = kwargs.selfAttentionCache != null;
const hasCrossAttentionCache = kwargs.crossAttentionCache != null;
if (hasCrossAttention && (hasSelfAttentionCache !== hasCrossAttentionCache)) {
throw new ValueError('When calling `TransformerDecoder` with cross-attention (with both ' +
'`encoderSequence` and `decoderSequence`), `selfAttentionCache` ' +
'and `crossAttentionCache` should both be set or both be `null`. ' +
'One cannot be `null` while the other is not. Received: ' +
`selfAttentionCache=${kwargs.selfAttentionCache}, ` +
`crossAttentionCache=${kwargs.crossAttentionCache}.`);
}
const selfAttentionMask = this.computeSelfAttentionMask(decoderSequence, kwargs.decoderPaddingMask, kwargs.decoderAttentionMask, kwargs.useCausalMask, kwargs.selfAttentionCache, kwargs.selfAttentionCacheUpdateIndex);
let x = decoderSequence; // Intermediate result.
let selfAttentionCache = kwargs.selfAttentionCache;
// Self attention block.
let residual = x;
if (this.normalizeFirst) {
x = this.selfAttentionLayernorm.apply(x);
}
[x, selfAttentionCache] = this.selfAttentionLayer.callAndReturnCache(x, {
value: x,
attentionMask: selfAttentionMask,
cache: selfAttentionCache,
cacheUpdateIndex: kwargs.selfAttentionCacheUpdateIndex,
});
x = this.selfAttentionDropout.apply(x);
x = add(x, residual);
if (!this.normalizeFirst) {
x = this.selfAttentionLayernorm.apply(x);
}
// Cross attention is optional.
// TODO(pforderique): Add cross attention logic for encoder-decoder arch.
// Feedforward block.
residual = x;
if (this.normalizeFirst) {
x = this.selfAttentionLayernorm.apply(x);
}
x = this.feedforwardIntermediateDense.apply(x);
x = this.feedforwardOutputDense.apply(x);
x = this.feedforwardDropout.apply(x);
x = add(x, residual);
if (!this.normalizeFirst) {
x = this.selfAttentionLayernorm.apply(x);
}
if (selfAttentionCache != null) {
if (hasCrossAttention) {
return [x, selfAttentionCache, kwargs.crossAttentionCache];
}
else {
return [x, selfAttentionCache, null];
}
}
return [x, null, null];
});
}
computeSelfAttentionMask(decoderSequence, decoderPaddingMask, decoderAttentionMask, useCasualMask, selfAttentionCache, selfAttentionCacheUpdateIndex) {
throw new NotImplementedError(`Not implemented yet.`);
const decoderMask = mergePaddingAndAttentionMask(decoderSequence, decoderPaddingMask, decoderAttentionMask);
if (useCasualMask) {
const batchSize = decoderSequence.shape[0];
let inputLength = decoderSequence.shape[1];
const outputLength = decoderSequence.shape[1];
// We need to handle a rectangular causal mask when doing cached
// decoding. For generative inference, `decoderSequence` will
// generally be length 1, and `cache` will be the full generation length.
if (selfAttentionCache != null) {
inputLength = selfAttentionCache.shape[2];
}
const causalMask = computeCausalMask(batchSize, inputLength, outputLength, selfAttentionCacheUpdateIndex !== null && selfAttentionCacheUpdateIndex !== void 0 ? selfAttentionCacheUpdateIndex : 0);
return decoderMask != null ? decoderMask.minimum(causalMask) : causalMask;
}
return decoderMask;
}
getConfig() {
throw new NotImplementedError(`Not implemented yet.`);
const config = {
'intermediateDim': this.intermediateDim,
'numHeads': this.numHeads,
'dropout': this.dropout,
'activation': serializeActivation(this.activation),
'layerNormEpsilon': this.layerNormEpsilon,
'kernelInitializer': serializeInitializer(this.kernelInitializer),
'biasInitializer': serializeInitializer(this.biasInitializer),
'normalizeFirst': this.normalizeFirst,
'decoderSequenceShape': this.decoderSequenceShape,
'encoderSequenceShape': this.encoderSequenceShape,
};
const baseConfig = super.getConfig();
Object.assign(config, baseConfig);
return config;
}
computeOutputShape(decoderSequenceShape) {
throw new NotImplementedError(`Not implemented yet.`);
return decoderSequenceShape;
}

@@ -121,2 +290,2 @@ }

serialization.registerClass(TransformerDecoder);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXJfZGVjb2Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvbmxwL21vZGVsaW5nL3RyYW5zZm9ybWVyX2RlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7O0dBRUc7QUFFSCx1RUFBdUU7QUFDdkUsT0FBTyxFQUE4QixhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRixPQUFPLEVBQUUsS0FBSyxHQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUErSHREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBSTNDLFlBQVksSUFBNEI7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osTUFBTSxJQUFJLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDTSxLQUFLLENBQUMsVUFBZ0M7UUFDN0MsTUFBTSxJQUFJLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVRLEtBQUssQ0FDWixNQUF1QixFQUFFLE1BQWtDO1FBRTNELE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUSxJQUFJLENBQ1gsZUFBdUIsRUFBRSxNQUFpQztRQUUxRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsbUJBQW1CLENBQ2pCLGVBQXVCLEVBQUUsTUFBaUM7UUFFMUQsTUFBTSxJQUFJLG1CQUFtQixDQUMzQiw2QkFBNkIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sd0JBQXdCLENBQzlCLGVBQXVCLEVBQ3ZCLGtCQUEwQixFQUMxQixvQkFBNEIsRUFDNUIsYUFBc0IsRUFDdEIsa0JBQTBCLEVBQzFCLDZCQUE0QztRQUU1QyxNQUFNLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRVEsU0FBUztRQUNoQixNQUFNLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRVEsa0JBQWtCLENBQUMsb0JBQTJCO1FBQ3JELE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBOURELGtCQUFrQjtBQUNGLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7U0FGdEMsa0JBQWtCO0FBaUUvQixhQUFhLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIFRyYW5zZm9ybWVyIGRlY29kZXIgYmxvY2sgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gVEZKUyBgTGF5ZXJgLlxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXNfbmxwL2xheWVycy9tb2RlbGluZy90cmFuc2Zvcm1lcl9kZWNvZGVyLnB5ICovXG5pbXBvcnQgeyBUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRCwgc2VyaWFsaXphdGlvbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IExheWVyLCBMYXllckFyZ3MsIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7IE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6ZXJJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7IEFjdGl2YXRpb25JZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4va2VyYXNfZm9ybWF0L2FjdGl2YXRpb25fY29uZmlnJztcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vLi4vLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBUcmFuc2Zvcm1lckRlY29kZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEludGVnZXIuIFRoZSBoaWRkZW4gc2l6ZSBvZiBmZWVkZm9yd2FyZCBuZXR3b3JrLlxuICAgKi9cbiAgaW50ZXJtZWRpYXRlRGltOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEludGVnZXIuIFRoZSBudW1iZXIgb2YgaGVhZHMgaW4gTXVsdGlIZWFkQXR0ZW50aW9uLlxuICAgKi9cbiAgbnVtSGVhZHM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRyb3BvdXQgdmFsdWUsIHNoYXJlZCBieSBNdWx0aUhlYWRBdHRlbnRpb24gYW5kIGZlZWRmb3J3YXJkIG5ldHdvcmsuXG4gICAqIERlZmF1bHRzIHRvIGAwLmAuXG4gICAqL1xuICBkcm9wb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aXZhdGlvbiBmdW5jdGlvbiBvZiBmZWVkZm9yd2FyZCBuZXR3b3JrLlxuICAgKiBEZWZhdWx0cyB0byBgXCJyZWx1XCJgLlxuICAgKi9cbiAgYWN0aXZhdGlvbj86IEFjdGl2YXRpb25JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZXBzIHZhbHVlIGluIGxheWVyIG5vcm1hbGl6YXRpb24gY29tcG9uZW50cy5cbiAgICogRGVmYXVsdHMgdG8gYDFlLTVgLlxuICAgKi9cbiAgbGF5ZXJOb3JtRXBzaWxvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtlcm5lbCBpbml0aWFsaXplciBmb3IgdGhlIGRlbnNlIGFuZCBtdWx0aWhlYWRlZCBhdHRlbnRpb24gbGF5ZXJzLlxuICAgKiBEZWZhdWx0cyB0byBgXCJnbG9yb3RVbmlmb3JtXCJgLlxuICAgKi9cbiAga2VybmVsSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBiaWFzIGluaXRpYWxpemVyIGZvciB0aGUgZGVuc2UgYW5kIG11bHRpaGVhZGVkIGF0dGVudGlvbiBsYXllcnMuXG4gICAqIERlZmF1bHRzIHRvIGBcInplcm9zXCJgLlxuICAgKi9cbiAgYmlhc0luaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgaW5wdXRzIHRvIHRoZSBhdHRlbnRpb24gbGF5ZXIocykgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZGVuc2VcbiAgICogbGF5ZXIgYXJlIG5vcm1hbGl6ZWQgKHNpbWlsYXIgdG8gR1BULTIpLiBJZiBzZXQgdG8gZmFsc2UsIG91dHB1dHMgb2ZcbiAgICogYXR0ZW50aW9uIGxheWVyIGFuZCBpbnRlcm1lZGlhdGUgZGVuc2UgbGF5ZXIgYXJlIG5vcm1hbGl6ZWRcbiAgICogKHNpbWlsYXIgdG8gQkVSVCkuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBub3JtYWxpemVGaXJzdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFRyYW5zZm9ybWVyRGVjb2Rlck9wdGlvbnMge1xuICAvKipcbiAgICogZGVjb2RlclNlcXVlbmNlOiBUaGUgZGVjb2RlIGlucHV0IHNlcXVlbmNlLlxuICAgKi9cblxuICAvKipcbiAgICogVGhlIGVuY29kZXIgaW5wdXQgc2VxdWVuY2UuIEZvciBkZWNvZGVyIG9ubHkgbW9kZWxzIChsaWtlIEdQVDIpLCB0aGlzXG4gICAqIHNob3VsZCBiZSBsZWZ0IGBudWxsYC4gT25jZSB0aGUgbW9kZWwgaXMgY2FsbGVkIHdpdGhvdXQgYW4gZW5jb2RlclNlcXVlbmNlLFxuICAgKiB5b3UgY2Fubm90IGNhbGwgaXQgYWdhaW4gd2l0aCBlbmNvZGVyU2VxdWVuY2UuXG4gICAqL1xuICBlbmNvZGVyU2VxdWVuY2U/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBUZW5zb3IsIHRoZSBwYWRkaW5nIG1hc2sgb2YgZGVjb2RlciBzZXF1ZW5jZSwgbXVzdCBiZSBvZiBzaGFwZVxuICAgKiBgW2JhdGNoU2l6ZSwgZGVjb2RlclNlcXVlbmNlTGVuZ3RoXWAuXG4gICAqL1xuICBkZWNvZGVyUGFkZGluZ01hc2s6IFRlbnNvcjtcblxuICAvKipcbiAgICogQSBib29sZWFuIFRlbnNvci4gQ3VzdG9taXplZCBkZWNvZGVyIHNlcXVlbmNlIG1hc2ssIG11c3QgYmUgb2Ygc2hhcGVcbiAgICogYFtiYXRjaFNpemUsIGRlY29kZXJTZXF1ZW5jZUxlbmd0aCwgZGVjb2RlclNlcXVlbmNlTGVuZ3RoXWAuXG4gICAqL1xuICBkZWNvZGVyQXR0ZW50aW9uTWFzaz86IFRlbnNvcjtcblxuICAvKipcbiAgICogQSBib29sZWFuIFRlbnNvciwgdGhlIHBhZGRpbmcgbWFzayBvZiBlbmNvZGVyIHNlcXVlbmNlLCBtdXN0IGJlIG9mIHNoYXBlXG4gICAqIGBbYmF0Y2hTaXplLCBlbmNvZGVyU2VxdWVuY2VMZW5ndGhdYC5cbiAgICovXG4gIGVuY29kZXJQYWRkaW5nTWFzaz86IFRlbnNvcjtcblxuICAvKipcbiAgICogQSBib29sZWFuIFRlbnNvci4gQ3VzdG9taXplZCBlbmNvZGVyIHNlcXVlbmNlIG1hc2ssIG11c3QgYmUgb2Ygc2hhcGVcbiAgICogYFtiYXRjaFNpemUsIGVuY29kZXJTZXF1ZW5jZUxlbmd0aCwgZW5jb2RlclNlcXVlbmNlTGVuZ3RoXWAuXG4gICAqL1xuICBlbmNvZGVyQXR0ZW50aW9uTWFzaz86IFRlbnNvcjtcblxuICAvKipcbiAgICogQSBkZW5zZSBmbG9hdCBUZW5zb3IuIFRoZSBjYWNoZSBvZiBrZXkvdmFsdWVzIHBhaXJzIGluIHRoZSBzZWxmLWF0dGVudGlvblxuICAgKiBsYXllci4gSGFzIHNoYXBlIGBbYmF0Y2hTaXplLCAyLCBtYXhTZXFMZW4sIG51bUhlYWRzLCBrZXlEaW1zXWAuXG4gICAqL1xuICBzZWxmQXR0ZW50aW9uQ2FjaGU/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEludGVnZXIgb3IgSW50ZWdlciBUZW5zb3IuIFRoZSBpbmRleCBhdCB3aGljaCB0byB1cGRhdGUgdGhlXG4gICAqIGBzZWxmQXR0ZW50aW9uQ2FjaGVgLiBVc3VhbGx5LCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlblxuICAgKiBiZWluZyBwcm9jZXNzZWQgZHVyaW5nIGRlY29kaW5nLlxuICAgKi9cbiAgc2VsZkF0dGVudGlvbkNhY2hlVXBkYXRlSW5kZXg/OiBudW1iZXJ8VGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGRlbnNlIGZsb2F0IFRlbnNvci4gVGhlIGNhY2hlIG9mIGtleS92YWx1ZSBwYWlycyBpbiB0aGUgY3Jvc3MtYXR0ZW50aW9uXG4gICAqIGxheWVyLiBIYXMgc2hhcGUgYFtiYXRjaFNpemUsIDIsIFMsIG51bUhlYWRzLCBrZXlEaW1zXWAuXG4gICAqL1xuICBjcm9zc0F0dGVudGlvbkNhY2hlPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIG9yIEludGVnZXIgVGVuc29yLiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gdXBkYXRlIHRoZVxuICAgKiBgY3Jvc3NBdHRlbnRpb25DYWNoZWAuIFVzdWFsbHksIHRoaXMgaXMgZWl0aGVyIGAwYCAoY29tcHV0ZSB0aGUgZW50aXJlXG4gICAqIGBjcm9zc0F0dGVudGlvbkNhY2hlYCksIG9yIGBudWxsYCAocmV1c2UgYSBwcmV2aW91c2x5IGNvbXB1dGVkXG4gICAqIGBjcm9zc0F0dGVudGlvbkNhY2hlYCkuXG4gICAqL1xuICBjcm9zc0F0dGVudGlvbkNhY2hlVXBkYXRlSW5kZXg/OiBudW1iZXJ8VGVuc29yO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhIGNhdXNhbCBtYXNrIChtYXNraW5nIG91dCBmdXR1cmUgaW5wdXQpIGlzIGFwcGxpZWQgb24gdGhlIGRlY29kZXJcbiAgICogc2VxdWVuY2UuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHVzZUNhdXNhbE1hc2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybWVyIGRlY29kZXIuXG4gKlxuICogVGhpcyBjbGFzcyBmb2xsb3dzIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHRyYW5zZm9ybWVyIGRlY29kZXIgbGF5ZXIgaW4gdGhlXG4gKiBwYXBlciBbQXR0ZW50aW9uIGlzIEFsbCBZb3UgTmVlZF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDM3NjIpLiBVc2Vyc1xuICogY2FuIGluc3RhbnRpYXRlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvIHN0YWNrIHVwIGEgZGVjb2Rlci5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGlzIGxheWVyIHdpbGwgYXBwbHkgYSBjYXVzYWwgbWFzayB0byB0aGUgZGVjb2RlciBhdHRlbnRpb25cbiAqIGxheWVyLiBUaGlzIGxheWVyIHdpbGwgY29ycmVjdGx5IGNvbXB1dGUgYW4gYXR0ZW50aW9uIG1hc2sgZnJvbSBhbiBpbXBsaWNpdFxuICogcGFkZGluZyBtYXNrIChmb3IgZXhhbXBsZSwgYnkgcGFzc2luZyBgbWFza1plcm89dHJ1ZWAgdG8gYVxuICogYHRmLmxheWVycy5lbWJlZGRpbmdgIGxheWVyKS4gU2VlIHRoZSBNYXNraW5nIGFuZCBQYWRkaW5nXG4gKiBbZ3VpZGVdKGh0dHBzOi8va2VyYXMuaW8vZ3VpZGVzL3VuZGVyc3RhbmRpbmdfbWFza2luZ19hbmRfcGFkZGluZy8pXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoaXMgbGF5ZXIgY2FuIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBvbmUgb3IgdHdvIGlucHV0cy4gVGhlIG51bWJlciBvZiBpbnB1dHNcbiAqIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIGNhbGxzLiBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czpcbiAqICAgIGBsYXllci5jYWxsKGRlY29kZXJTZXF1ZW5jZSlgOiBubyBjcm9zcy1hdHRlbnRpb24gd2lsbCBiZSBidWlsdCBpbnRvIHRoZVxuICogICAgICAgICBkZWNvZGVyIGJsb2NrLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGEgXCJkZWNvZGVyLW9ubHlcIlxuICogICAgICAgICB0cmFuc2Zvcm1lciBzdWNoIGFzIEdQVC0yLlxuICogICAgYGxheWVyLmNhbGwoZGVjb2RlclNlcXVlbmNlLCB7ZW5jb2RlclNlcXVlbmNlfSlgOiBjcm9zcy1hdHRlbnRpb24gd2lsbCBiZVxuICogICAgICAgICBidWlsdCBpbnRvIHRoZSBkZWNvZGVyIGJsb2NrLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGFuXG4gKiAgICAgICAgIFwiZW5jb2Rlci1kZWNvZGVyXCIgdHJhbnNmb3JtZXIsIHN1Y2ggYXMgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIG1vZGVsIGRlc2NyaWJlZCBpbiBBdHRlbnRpb24gaXMgQWxsIFlvdSBOZWVkLlxuICpcbiAqIEV4YW1wbGVzOlxuICogYGBganNcbiAqIC8vIENyZWF0ZSBhIHNpbmdsZSB0cmFuc2Zvcm1lciBkZWNvZGVyIGxheWVyLlxuICogY29uc3QgZGVjb2RlciA9IG5ldyBUcmFuc2Zvcm1lckRlY29kZXIoe2ludGVybWVkaWF0ZURpbTogNjQsIG51bUhlYWRzOiA4fSk7XG4gKlxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGRlY29kZXIuXG4gKiBjb25zdCBkZWNvZGVySW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMCwgNjRdfSk7XG4gKiBjb25zdCBlbmNvZGVySW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IHtbMTAsIDY0XX0pO1xuICogY29uc3Qgb3V0cHV0ID0gZGVjb2Rlci5jYWxsKGRlY29kZXJJbnB1dCwge2VuY29kZXJJbnB1dH0pO1xuICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7XG4gKiAgICAgaW5wdXRzOiBbZGVjb2RlcklucHV0LCBlbmNvZGVySW5wdXRdLFxuICogICAgIG91dHB1dHM6IG91dHB1dCxcbiAqICk7XG4gKlxuICogLy8gQ2FsbCBkZWNvZGVyIG9uIHRoZSBpbnB1dHMuXG4gKiBjb25zdCBkZWNvZGVySW5wdXREYXRhID0gdGYucmFuZG9tVW5pZm9ybShbMiwgMTAsIDY0XSk7XG4gKiBjb25zdCBlbmNvZGVySW5wdXREYXRhID0gdGYucmFuZG9tVW5pZm9ybShbMiwgMTAsIDY0XSk7XG4gKiBjb25zdCBkZWNvZGVyT3V0cHV0ID0gbW9kZWwucHJlZGljdChbZGVjb2RlcklucHV0RGF0YSwgZW5jb2RlcklucHV0RGF0YV0pO1xuICogYGBgXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAtIFtWYXN3YW5pIGV0IGFsLiwgMjAxN10oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDM3NjIpXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1lckRlY29kZXIgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ1RyYW5zZm9ybWVyRGVjb2Rlcic7XG5cbiAgY29uc3RydWN0b3IoYXJnczogVHJhbnNmb3JtZXJEZWNvZGVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgeWV0LmApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlIGRlY29kZXJTZXF1ZW5jZVNoYXBlIG9yXG4gICAqICBbZGVjb2RlclNlcXVlbmNlU2hhcGUsIGVuY29kZXJTZXF1ZW5jZVNoYXBlXVxuICAgKi9cbiAgb3ZlcnJpZGUgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8W1NoYXBlLCBTaGFwZV0pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgTm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFwcGx5KFxuICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M/OiBUcmFuc2Zvcm1lckRlY29kZXJPcHRpb25zXG4gICk6IFRlbnNvciB8IFRlbnNvcltdIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgTm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoXG4gICAgZGVjb2RlclNlcXVlbmNlOiBUZW5zb3IsIGt3YXJnczogVHJhbnNmb3JtZXJEZWNvZGVyT3B0aW9uc1xuICApOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aGlzLmNhbGxBbmRSZXR1cm5DYWNoZXMoZGVjb2RlclNlcXVlbmNlLCBrd2FyZ3MpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIE9uZSBvZiB0aHJlZSB0aGluZ3MsIGRlcGVuZGluZyBvbiBjYWxsIGFyZ3VtZW50czpcbiAgICogICAtIGBbb3V0cHV0cywgbnVsbCwgbnVsbF1gLCBpZiBgc2VsZkF0dGVudGlvbkNhY2hlYCBpcyBgbnVsbGAuXG4gICAqICAgLSBgW291dHB1dHMsIHNlbGZBdHRlbnRpb25DYWNoZSwgbnVsbF1gLCBpZiBgc2VsZkF0dGVudGlvbkNhY2hlYCBpc1xuICAgKiAgICAgc2V0IGFuZCB0aGUgbGF5ZXIgaGFzIG5vIGNyb3NzLWF0dGVudGlvbi5cbiAgICogICAtIGBbb3V0cHV0cywgc2VsZkF0dGVudGlvbkNhY2hlLCBjcm9zc0F0dGVudGlvbkNhY2hlXWAsIGlmXG4gICAqICAgICBgc2VsZkF0dGVudGlvbkNhY2hlYCBhbmQgYGNyb3NzQXR0ZW50aW9uQ2FjaGVgIGFyZSBzZXQgYW5kXG4gICAqICAgICB0aGUgbGF5ZXIgaGFzIGNyb3NzLWF0dGVudGlvbi5cbiAgICovXG4gIGNhbGxBbmRSZXR1cm5DYWNoZXMoXG4gICAgZGVjb2RlclNlcXVlbmNlOiBUZW5zb3IsIGt3YXJnczogVHJhbnNmb3JtZXJEZWNvZGVyT3B0aW9uc1xuICApOiBbVGVuc29yMUR8VGVuc29yMkQsIFRlbnNvcjFEfFRlbnNvcjJELCBUZW5zb3IxRHxUZW5zb3IyRF0ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgYE5vdCBpbXBsZW1lbnRlZCB5ZXQuIFVzZXMgJHt0aGlzLmNvbXB1dGVTZWxmQXR0ZW50aW9uTWFza31gKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVNlbGZBdHRlbnRpb25NYXNrKFxuICAgIGRlY29kZXJTZXF1ZW5jZTogVGVuc29yLFxuICAgIGRlY29kZXJQYWRkaW5nTWFzazogVGVuc29yLFxuICAgIGRlY29kZXJBdHRlbnRpb25NYXNrOiBUZW5zb3IsXG4gICAgdXNlQ2FzdWFsTWFzazogYm9vbGVhbixcbiAgICBzZWxmQXR0ZW50aW9uQ2FjaGU6IFRlbnNvcixcbiAgICBzZWxmQXR0ZW50aW9uQ2FjaGVVcGRhdGVJbmRleDogbnVtYmVyfFRlbnNvclxuICApOiBUZW5zb3Ige1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgeWV0LmApO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYE5vdCBpbXBsZW1lbnRlZCB5ZXQuYCk7XG4gIH1cblxuICBvdmVycmlkZSBjb21wdXRlT3V0cHV0U2hhcGUoZGVjb2RlclNlcXVlbmNlU2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgeWV0LmApO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVHJhbnNmb3JtZXJEZWNvZGVyKTtcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXJfZGVjb2Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvbmxwL21vZGVsaW5nL3RyYW5zZm9ybWVyX2RlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7O0dBRUc7QUFFSCx1RUFBdUU7QUFDdkUsT0FBTyxFQUFVLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekUsT0FBTyxFQUFjLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxLQUFLLEdBQThCLE1BQU0sMEJBQTBCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBc0MsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHakgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUE0SDVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBNEIzQyxZQUFZLElBQTRCOztRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENB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QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3ZCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2xELGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDekMsbUJBQW1CLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ2pFLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDN0QsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDckMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtZQUNqRCxzQkFBc0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1NBQ2xELENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVRLGtCQUFrQixDQUFDLG9CQUEyQjtRQUNyRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7O0FBN1JELGtCQUFrQjtBQUNGLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7U0FGdEMsa0JBQWtCO0FBZ1MvQixhQUFhLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIFRyYW5zZm9ybWVyIGRlY29kZXIgYmxvY2sgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gVEZKUyBgTGF5ZXJgLlxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXNfbmxwL2xheWVycy9tb2RlbGluZy90cmFuc2Zvcm1lcl9kZWNvZGVyLnB5ICovXG5pbXBvcnQgeyBUZW5zb3IsIGFkZCwgc2VyaWFsaXphdGlvbiwgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IEFjdGl2YXRpb24sIGdldEFjdGl2YXRpb24sIHNlcmlhbGl6ZUFjdGl2YXRpb24gfSBmcm9tICcuLi8uLi8uLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQgeyBMYXllciwgTGF5ZXJBcmdzLCBTeW1ib2xpY1RlbnNvciwgfSBmcm9tICcuLi8uLi8uLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uLy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBnZXRJbml0aWFsaXplciwgc2VyaWFsaXplSW5pdGlhbGl6ZXIgfSBmcm9tICcuLi8uLi8uLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHsgQWN0aXZhdGlvbklkZW50aWZpZXIgfSBmcm9tICcuLi8uLi8uLi9rZXJhc19mb3JtYXQvYWN0aXZhdGlvbl9jb25maWcnO1xuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi8uLi8uLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7IERlbnNlLCBEcm9wb3V0IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBMYXllck5vcm1hbGl6YXRpb24gfSBmcm9tICcuLi8uLi9ub3JtYWxpemF0aW9uJztcblxuaW1wb3J0IHsgQ2FjaGVkTXVsdGlIZWFkQXR0ZW50aW9uIH0gZnJvbSAnLi9jYWNoZWRfbXVsdGloZWFkX2F0dGVudGlvbic7XG5pbXBvcnQgeyBjb21wdXRlQ2F1c2FsTWFzaywgbWVyZ2VQYWRkaW5nQW5kQXR0ZW50aW9uTWFzayB9IGZyb20gJy4vdHJhbnNmb3JtZXJfbGF5ZXJfdXRpbHMnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVHJhbnNmb3JtZXJEZWNvZGVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBJbnRlZ2VyLiBUaGUgaGlkZGVuIHNpemUgb2YgZmVlZGZvcndhcmQgbmV0d29yay5cbiAgICovXG4gIGludGVybWVkaWF0ZURpbTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyLiBUaGUgbnVtYmVyIG9mIGhlYWRzIGluIE11bHRpSGVhZEF0dGVudGlvbi5cbiAgICovXG4gIG51bUhlYWRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkcm9wb3V0IHZhbHVlLCBzaGFyZWQgYnkgTXVsdGlIZWFkQXR0ZW50aW9uIGFuZCBmZWVkZm9yd2FyZCBuZXR3b3JrLlxuICAgKiBEZWZhdWx0cyB0byBgMC5gLlxuICAgKi9cbiAgZHJvcG91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFjdGl2YXRpb24gZnVuY3Rpb24gb2YgZmVlZGZvcndhcmQgbmV0d29yay5cbiAgICogRGVmYXVsdHMgdG8gYFwicmVsdVwiYC5cbiAgICovXG4gIGFjdGl2YXRpb24/OiBBY3RpdmF0aW9ufEFjdGl2YXRpb25JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZXBzIHZhbHVlIGluIGxheWVyIG5vcm1hbGl6YXRpb24gY29tcG9uZW50cy5cbiAgICogRGVmYXVsdHMgdG8gYDFlLTVgLlxuICAgKi9cbiAgbGF5ZXJOb3JtRXBzaWxvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtlcm5lbCBpbml0aWFsaXplciBmb3IgdGhlIGRlbnNlIGFuZCBtdWx0aWhlYWRlZCBhdHRlbnRpb24gbGF5ZXJzLlxuICAgKiBEZWZhdWx0cyB0byBgXCJnbG9yb3RVbmlmb3JtXCJgLlxuICAgKi9cbiAga2VybmVsSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcnxJbml0aWFsaXplcklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBiaWFzIGluaXRpYWxpemVyIGZvciB0aGUgZGVuc2UgYW5kIG11bHRpaGVhZGVkIGF0dGVudGlvbiBsYXllcnMuXG4gICAqIERlZmF1bHRzIHRvIGBcInplcm9zXCJgLlxuICAgKi9cbiAgYmlhc0luaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJ8SW5pdGlhbGl6ZXJJZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgaW5wdXRzIHRvIHRoZSBhdHRlbnRpb24gbGF5ZXIocykgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZGVuc2VcbiAgICogbGF5ZXIgYXJlIG5vcm1hbGl6ZWQgKHNpbWlsYXIgdG8gR1BULTIpLiBJZiBzZXQgdG8gZmFsc2UsIG91dHB1dHMgb2ZcbiAgICogYXR0ZW50aW9uIGxheWVyIGFuZCBpbnRlcm1lZGlhdGUgZGVuc2UgbGF5ZXIgYXJlIG5vcm1hbGl6ZWRcbiAgICogKHNpbWlsYXIgdG8gQkVSVCkuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBub3JtYWxpemVGaXJzdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBUcmFuc2Zvcm1lckRlY29kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIGRlY29kZXJTZXF1ZW5jZTogVGhlIGRlY29kZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICovXG5cbiAgLyoqXG4gICAqIFRoZSBlbmNvZGVyIGlucHV0IHNlcXVlbmNlLiBGb3IgZGVjb2RlciBvbmx5IG1vZGVscyAobGlrZSBHUFQyKSwgdGhpc1xuICAgKiBzaG91bGQgYmUgbGVmdCBgbnVsbGAuIE9uY2UgdGhlIG1vZGVsIGlzIGNhbGxlZCB3aXRob3V0IGFuIGVuY29kZXJTZXF1ZW5jZSxcbiAgICogeW91IGNhbm5vdCBjYWxsIGl0IGFnYWluIHdpdGggZW5jb2RlclNlcXVlbmNlLlxuICAgKi9cbiAgZW5jb2RlclNlcXVlbmNlPzogVGVuc29yfFN5bWJvbGljVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gVGVuc29yLCB0aGUgcGFkZGluZyBtYXNrIG9mIGRlY29kZXIgc2VxdWVuY2UsIG11c3QgYmUgb2Ygc2hhcGVcbiAgICogYFtiYXRjaFNpemUsIGRlY29kZXJTZXF1ZW5jZUxlbmd0aF1gLlxuICAgKi9cbiAgZGVjb2RlclBhZGRpbmdNYXNrPzogVGVuc29yfFN5bWJvbGljVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gVGVuc29yLiBDdXN0b21pemVkIGRlY29kZXIgc2VxdWVuY2UgbWFzaywgbXVzdCBiZSBvZiBzaGFwZVxuICAgKiBgW2JhdGNoU2l6ZSwgZGVjb2RlclNlcXVlbmNlTGVuZ3RoLCBkZWNvZGVyU2VxdWVuY2VMZW5ndGhdYC5cbiAgICovXG4gIGRlY29kZXJBdHRlbnRpb25NYXNrPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gVGVuc29yLCB0aGUgcGFkZGluZyBtYXNrIG9mIGVuY29kZXIgc2VxdWVuY2UsIG11c3QgYmUgb2Ygc2hhcGVcbiAgICogYFtiYXRjaFNpemUsIGVuY29kZXJTZXF1ZW5jZUxlbmd0aF1gLlxuICAgKi9cbiAgZW5jb2RlclBhZGRpbmdNYXNrPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gVGVuc29yLiBDdXN0b21pemVkIGVuY29kZXIgc2VxdWVuY2UgbWFzaywgbXVzdCBiZSBvZiBzaGFwZVxuICAgKiBgW2JhdGNoU2l6ZSwgZW5jb2RlclNlcXVlbmNlTGVuZ3RoLCBlbmNvZGVyU2VxdWVuY2VMZW5ndGhdYC5cbiAgICovXG4gIGVuY29kZXJBdHRlbnRpb25NYXNrPzogVGVuc29yO1xuXG4gIC8qKlxuICAgKiBBIGRlbnNlIGZsb2F0IFRlbnNvci4gVGhlIGNhY2hlIG9mIGtleS92YWx1ZXMgcGFpcnMgaW4gdGhlIHNlbGYtYXR0ZW50aW9uXG4gICAqIGxheWVyLiBIYXMgc2hhcGUgYFtiYXRjaFNpemUsIDIsIG1heFNlcUxlbiwgbnVtSGVhZHMsIGtleURpbXNdYC5cbiAgICovXG4gIHNlbGZBdHRlbnRpb25DYWNoZT86IFRlbnNvcjtcblxuICAvKipcbiAgICogSW50ZWdlciBvciBJbnRlZ2VyIFRlbnNvci4gVGhlIGluZGV4IGF0IHdoaWNoIHRvIHVwZGF0ZSB0aGVcbiAgICogYHNlbGZBdHRlbnRpb25DYWNoZWAuIFVzdWFsbHksIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHRva2VuXG4gICAqIGJlaW5nIHByb2Nlc3NlZCBkdXJpbmcgZGVjb2RpbmcuXG4gICAqL1xuICBzZWxmQXR0ZW50aW9uQ2FjaGVVcGRhdGVJbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBkZW5zZSBmbG9hdCBUZW5zb3IuIFRoZSBjYWNoZSBvZiBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlIGNyb3NzLWF0dGVudGlvblxuICAgKiBsYXllci4gSGFzIHNoYXBlIGBbYmF0Y2hTaXplLCAyLCBTLCBudW1IZWFkcywga2V5RGltc11gLlxuICAgKi9cbiAgY3Jvc3NBdHRlbnRpb25DYWNoZT86IFRlbnNvcjtcblxuICAvKipcbiAgICogSW50ZWdlciBvciBJbnRlZ2VyIFRlbnNvci4gVGhlIGluZGV4IGF0IHdoaWNoIHRvIHVwZGF0ZSB0aGVcbiAgICogYGNyb3NzQXR0ZW50aW9uQ2FjaGVgLiBVc3VhbGx5LCB0aGlzIGlzIGVpdGhlciBgMGAgKGNvbXB1dGUgdGhlIGVudGlyZVxuICAgKiBgY3Jvc3NBdHRlbnRpb25DYWNoZWApLCBvciBgbnVsbGAgKHJldXNlIGEgcHJldmlvdXNseSBjb21wdXRlZFxuICAgKiBgY3Jvc3NBdHRlbnRpb25DYWNoZWApLlxuICAgKi9cbiAgY3Jvc3NBdHRlbnRpb25DYWNoZVVwZGF0ZUluZGV4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhIGNhdXNhbCBtYXNrIChtYXNraW5nIG91dCBmdXR1cmUgaW5wdXQpIGlzIGFwcGxpZWQgb24gdGhlIGRlY29kZXJcbiAgICogc2VxdWVuY2UuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHVzZUNhdXNhbE1hc2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybWVyIGRlY29kZXIuXG4gKlxuICogVGhpcyBjbGFzcyBmb2xsb3dzIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHRyYW5zZm9ybWVyIGRlY29kZXIgbGF5ZXIgaW4gdGhlXG4gKiBwYXBlciBbQXR0ZW50aW9uIGlzIEFsbCBZb3UgTmVlZF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDM3NjIpLiBVc2Vyc1xuICogY2FuIGluc3RhbnRpYXRlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvIHN0YWNrIHVwIGEgZGVjb2Rlci5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGlzIGxheWVyIHdpbGwgYXBwbHkgYSBjYXVzYWwgbWFzayB0byB0aGUgZGVjb2RlciBhdHRlbnRpb25cbiAqIGxheWVyLiBUaGlzIGxheWVyIHdpbGwgY29ycmVjdGx5IGNvbXB1dGUgYW4gYXR0ZW50aW9uIG1hc2sgZnJvbSBhbiBpbXBsaWNpdFxuICogcGFkZGluZyBtYXNrIChmb3IgZXhhbXBsZSwgYnkgcGFzc2luZyBgbWFza1plcm89dHJ1ZWAgdG8gYVxuICogYHRmLmxheWVycy5lbWJlZGRpbmdgIGxheWVyKS4gU2VlIHRoZSBNYXNraW5nIGFuZCBQYWRkaW5nXG4gKiBbZ3VpZGVdKGh0dHBzOi8va2VyYXMuaW8vZ3VpZGVzL3VuZGVyc3RhbmRpbmdfbWFza2luZ19hbmRfcGFkZGluZy8pXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoaXMgbGF5ZXIgY2FuIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBvbmUgb3IgdHdvIGlucHV0cy4gVGhlIG51bWJlciBvZiBpbnB1dHNcbiAqIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIGNhbGxzLiBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czpcbiAqICAgIGBsYXllci5jYWxsKGRlY29kZXJTZXF1ZW5jZSlgOiBubyBjcm9zcy1hdHRlbnRpb24gd2lsbCBiZSBidWlsdCBpbnRvIHRoZVxuICogICAgICAgICBkZWNvZGVyIGJsb2NrLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGEgXCJkZWNvZGVyLW9ubHlcIlxuICogICAgICAgICB0cmFuc2Zvcm1lciBzdWNoIGFzIEdQVC0yLlxuICogICAgYGxheWVyLmNhbGwoZGVjb2RlclNlcXVlbmNlLCB7ZW5jb2RlclNlcXVlbmNlfSlgOiBjcm9zcy1hdHRlbnRpb24gd2lsbCBiZVxuICogICAgICAgICBidWlsdCBpbnRvIHRoZSBkZWNvZGVyIGJsb2NrLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGFuXG4gKiAgICAgICAgIFwiZW5jb2Rlci1kZWNvZGVyXCIgdHJhbnNmb3JtZXIsIHN1Y2ggYXMgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIG1vZGVsIGRlc2NyaWJlZCBpbiBBdHRlbnRpb24gaXMgQWxsIFlvdSBOZWVkLlxuICpcbiAqIEV4YW1wbGVzOlxuICogYGBganNcbiAqIC8vIENyZWF0ZSBhIHNpbmdsZSB0cmFuc2Zvcm1lciBkZWNvZGVyIGxheWVyLlxuICogY29uc3QgZGVjb2RlciA9IG5ldyBUcmFuc2Zvcm1lckRlY29kZXIoe2ludGVybWVkaWF0ZURpbTogNjQsIG51bUhlYWRzOiA4fSk7XG4gKlxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGRlY29kZXIuXG4gKiBjb25zdCBkZWNvZGVySW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMCwgNjRdfSk7XG4gKiBjb25zdCBlbmNvZGVySW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IHtbMTAsIDY0XX0pO1xuICogY29uc3Qgb3V0cHV0ID0gZGVjb2Rlci5jYWxsKGRlY29kZXJJbnB1dCwge2VuY29kZXJJbnB1dH0pO1xuICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7XG4gKiAgICAgaW5wdXRzOiBbZGVjb2RlcklucHV0LCBlbmNvZGVySW5wdXRdLFxuICogICAgIG91dHB1dHM6IG91dHB1dCxcbiAqICk7XG4gKlxuICogLy8gQ2FsbCBkZWNvZGVyIG9uIHRoZSBpbnB1dHMuXG4gKiBjb25zdCBkZWNvZGVySW5wdXREYXRhID0gdGYucmFuZG9tVW5pZm9ybShbMiwgMTAsIDY0XSk7XG4gKiBjb25zdCBlbmNvZGVySW5wdXREYXRhID0gdGYucmFuZG9tVW5pZm9ybShbMiwgMTAsIDY0XSk7XG4gKiBjb25zdCBkZWNvZGVyT3V0cHV0ID0gbW9kZWwucHJlZGljdChbZGVjb2RlcklucHV0RGF0YSwgZW5jb2RlcklucHV0RGF0YV0pO1xuICogYGBgXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAtIFtWYXN3YW5pIGV0IGFsLiwgMjAxN10oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDM3NjIpXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1lckRlY29kZXIgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ1RyYW5zZm9ybWVyRGVjb2Rlcic7XG5cbiAgcHJvdGVjdGVkIGludGVybWVkaWF0ZURpbTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbnVtSGVhZHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRyb3BvdXQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFjdGl2YXRpb246IEFjdGl2YXRpb247XG4gIHByb3RlY3RlZCBsYXllck5vcm1FcHNpbG9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBrZXJuZWxJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByb3RlY3RlZCBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgbm9ybWFsaXplRmlyc3Q6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBkZWNvZGVyU2VxdWVuY2VTaGFwZTogU2hhcGU7XG4gIHByb3RlY3RlZCBlbmNvZGVyU2VxdWVuY2VTaGFwZTogU2hhcGU7XG5cbiAgcHJvdGVjdGVkIHNlbGZBdHRlbnRpb25MYXllcjogQ2FjaGVkTXVsdGlIZWFkQXR0ZW50aW9uO1xuICBwcm90ZWN0ZWQgc2VsZkF0dGVudGlvbkxheWVybm9ybTogTGF5ZXJOb3JtYWxpemF0aW9uO1xuICBwcm90ZWN0ZWQgc2VsZkF0dGVudGlvbkRyb3BvdXQ6IERyb3BvdXQ7XG5cbiAgcHJvdGVjdGVkIHNlbGZDcm9zc0F0dGVudGlvbkxheWVyOiBDYWNoZWRNdWx0aUhlYWRBdHRlbnRpb247XG4gIHByb3RlY3RlZCBzZWxmQ3Jvc3NBdHRlbnRpb25MYXllcm5vcm06IExheWVyTm9ybWFsaXphdGlvbjtcbiAgcHJvdGVjdGVkIHNlbGZDcm9zc0F0dGVudGlvbkRyb3BvdXQ6IERyb3BvdXQ7XG5cbiAgcHJvdGVjdGVkIGZlZWRmb3J3YXJkSW50ZXJtZWRpYXRlRGVuc2U6IERlbnNlO1xuICBwcm90ZWN0ZWQgZmVlZGZvcndhcmRPdXRwdXREZW5zZTogRGVuc2U7XG4gIHByb3RlY3RlZCBmZWVkZm9yd2FyZExheWVybm9ybTogTGF5ZXJOb3JtYWxpemF0aW9uO1xuICBwcm90ZWN0ZWQgZmVlZGZvcndhcmREcm9wb3V0OiBEcm9wb3V0O1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFRyYW5zZm9ybWVyRGVjb2RlckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmludGVybWVkaWF0ZURpbSA9IGFyZ3MuaW50ZXJtZWRpYXRlRGltO1xuICAgIHRoaXMubnVtSGVhZHMgPSBhcmdzLm51bUhlYWRzO1xuICAgIHRoaXMuZHJvcG91dCA9IGFyZ3MuZHJvcG91dCA/PyAwO1xuICAgIHRoaXMuYWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oYXJncy5hY3RpdmF0aW9uID8/ICdyZWx1Jyk7XG4gICAgdGhpcy5sYXllck5vcm1FcHNpbG9uID0gYXJncy5sYXllck5vcm1FcHNpbG9uID8/IDFlLTA1O1xuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPVxuICAgICAgZ2V0SW5pdGlhbGl6ZXIoYXJncy5rZXJuZWxJbml0aWFsaXplciA/PyAnZ2xvcm90VW5pZm9ybScpO1xuICAgIHRoaXMuYmlhc0luaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoYXJncy5iaWFzSW5pdGlhbGl6ZXIgPz8gJ3plcm9zJyk7XG4gICAgdGhpcy5ub3JtYWxpemVGaXJzdCA9IGFyZ3Mubm9ybWFsaXplRmlyc3QgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGlucHV0U2hhcGUgZGVjb2RlclNlcXVlbmNlU2hhcGUgb3JcbiAgICogIFtkZWNvZGVyU2VxdWVuY2VTaGFwZSwgZW5jb2RlclNlcXVlbmNlU2hhcGVdXG4gICAqL1xuICBvdmVycmlkZSBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxbU2hhcGUsIFNoYXBlXSk6IHZvaWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pKSB7XG4gICAgICAvLyBgaW5wdXRTaGFwZWAgaXMgb2YgdHlwZSBbU2hhcGUsIFNoYXBlXS5cbiAgICAgIFt0aGlzLmRlY29kZXJTZXF1ZW5jZVNoYXBlLCB0aGlzLmVuY29kZXJTZXF1ZW5jZVNoYXBlXSA9XG4gICAgICAgIGlucHV0U2hhcGUgYXMgW1NoYXBlLCBTaGFwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVjb2RlclNlcXVlbmNlU2hhcGUgPSBpbnB1dFNoYXBlIGFzIFNoYXBlO1xuICAgIH1cbiAgICAvLyBJbmZlciB0aGUgZGltZW5zaW9uIG9mIG91ciBoaWRkZW4gZmVhdHVyZSBzaXplIGZyb20gdGhlIGJ1aWxkIHNoYXBlLlxuICAgIGNvbnN0IGhpZGRlbkRpbSA9XG4gICAgICB0aGlzLmRlY29kZXJTZXF1ZW5jZVNoYXBlW3RoaXMuZGVjb2RlclNlcXVlbmNlU2hhcGUubGVuZ3RoIC0gMV07XG4gICAgLy8gQXR0ZW50aW9uIGhlYWQgc2l6ZSBpcyBgaGlkZGVuRGltYCBvdmVyIHRoZSBudW1iZXIgb2YgaGVhZHMuXG4gICAgY29uc3QgaGVhZERpbSA9IE1hdGguZmxvb3IoaGlkZGVuRGltIC8gdGhpcy5udW1IZWFkcyk7XG5cbiAgICAvLyBTZWxmIGF0dGVudGlvbiBsYXllcnMuXG4gICAgdGhpcy5zZWxmQXR0ZW50aW9uTGF5ZXIgPSBuZXcgQ2FjaGVkTXVsdGlIZWFkQXR0ZW50aW9uKHtcbiAgICAgIG51bUhlYWRzOiB0aGlzLm51bUhlYWRzLFxuICAgICAga2V5RGltOiBoZWFkRGltLFxuICAgICAgZHJvcG91dDogdGhpcy5kcm9wb3V0LFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IGdldEluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIuZ2V0Q2xhc3NOYW1lKCkpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBnZXRJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplci5nZXRDbGFzc05hbWUoKSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGZBdHRlbnRpb25MYXllci5idWlsZEZyb21TaWduYXR1cmUoXG4gICAgICB0aGlzLmRlY29kZXJTZXF1ZW5jZVNoYXBlLCB0aGlzLmRlY29kZXJTZXF1ZW5jZVNoYXBlKTtcblxuICAgIHRoaXMuc2VsZkF0dGVudGlvbkxheWVybm9ybSA9XG4gICAgICBuZXcgTGF5ZXJOb3JtYWxpemF0aW9uKHtlcHNpbG9uOiB0aGlzLmxheWVyTm9ybUVwc2lsb259KTtcblxuICAgIHRoaXMuc2VsZkF0dGVudGlvbkxheWVybm9ybS5idWlsZCh0aGlzLmRlY29kZXJTZXF1ZW5jZVNoYXBlKTtcbiAgICB0aGlzLnNlbGZBdHRlbnRpb25Ecm9wb3V0ID0gbmV3IERyb3BvdXQoe3JhdGU6IHRoaXMuZHJvcG91dH0pO1xuXG4gICAgLy8gQ3Jvc3MgYXR0ZW50aW9uIGxheWVycyBhcmUgb3B0aW9uYWwuXG4gICAgLy8gVE9ETyhwZm9yZGVyaXF1ZSk6IEFkZCBjcm9zcyBhdHRlbnRpb24gbGF5ZXJzLlxuXG4gICAgLy8gRmVlZGZvcndhcmQgbGF5ZXJzLlxuICAgIHRoaXMuZmVlZGZvcndhcmRJbnRlcm1lZGlhdGVEZW5zZSA9IG5ldyBEZW5zZSh7XG4gICAgICB1bml0czogdGhpcy5pbnRlcm1lZGlhdGVEaW0sXG4gICAgICBhY3RpdmF0aW9uOiB0aGlzLmFjdGl2YXRpb24uZ2V0Q2xhc3NOYW1lKCkgYXMgQWN0aXZhdGlvbklkZW50aWZpZXIsXG4gICAgICBrZXJuZWxJbml0aWFsaXplcjogZ2V0SW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplci5nZXRDbGFzc05hbWUoKSksXG4gICAgICBiaWFzSW5pdGlhbGl6ZXI6IGdldEluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyLmdldENsYXNzTmFtZSgpKSxcbiAgICB9KTtcbiAgICB0aGlzLmZlZWRmb3J3YXJkSW50ZXJtZWRpYXRlRGVuc2UuYnVpbGQodGhpcy5kZWNvZGVyU2VxdWVuY2VTaGFwZSk7XG4gICAgdGhpcy5mZWVkZm9yd2FyZE91dHB1dERlbnNlID0gbmV3IERlbnNlKHtcbiAgICAgIHVuaXRzOiBoaWRkZW5EaW0sXG4gICAgICBrZXJuZWxJbml0aWFsaXplcjogZ2V0SW5pdGlhbGl6ZXIodGhpcy5rZXJuZWxJbml0aWFsaXplci5nZXRDbGFzc05hbWUoKSksXG4gICAgICBiaWFzSW5pdGlhbGl6ZXI6IGdldEluaXRpYWxpemVyKHRoaXMuYmlhc0luaXRpYWxpemVyLmdldENsYXNzTmFtZSgpKSxcbiAgICB9KTtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVTaGFwZSA9IHRoaXMuZGVjb2RlclNlcXVlbmNlU2hhcGUuc2xpY2UoKTtcbiAgICBpbnRlcm1lZGlhdGVTaGFwZVtpbnRlcm1lZGlhdGVTaGFwZS5sZW5ndGggLSAxXSA9IHRoaXMuaW50ZXJtZWRpYXRlRGltO1xuICAgIHRoaXMuZmVlZGZvcndhcmRPdXRwdXREZW5zZS5idWlsZChpbnRlcm1lZGlhdGVTaGFwZSk7XG4gICAgdGhpcy5mZWVkZm9yd2FyZExheWVybm9ybSA9XG4gICAgICBuZXcgTGF5ZXJOb3JtYWxpemF0aW9uKHtlcHNpbG9uOiB0aGlzLmxheWVyTm9ybUVwc2lsb259KTtcbiAgICB0aGlzLmZlZWRmb3J3YXJkTGF5ZXJub3JtLmJ1aWxkKHRoaXMuZGVjb2RlclNlcXVlbmNlU2hhcGUpO1xuICAgIHRoaXMuZmVlZGZvcndhcmREcm9wb3V0ID0gbmV3IERyb3BvdXQoe3JhdGU6IHRoaXMuZHJvcG91dH0pO1xuICAgIC8vIENyZWF0ZSBsYXllcnMgYmFzZWQgb24gaW5wdXQgc2hhcGUuXG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBvdmVycmlkZSBhcHBseShcbiAgICAgIGRlY29kZXJTZXF1ZW5jZTogVGVuc29yfFN5bWJvbGljVGVuc29yLFxuICAgICAga3dhcmdzPzogVHJhbnNmb3JtZXJEZWNvZGVyT3B0aW9ucyk6IFRlbnNvcnxTeW1ib2xpY1RlbnNvciB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICBjb25zdCBkZWNvZGVyU2VxdWVuY2VTaGFwZSA9IGRlY29kZXJTZXF1ZW5jZS5zaGFwZTtcbiAgICAgIGNvbnN0IGVuY29kZXJTZXF1ZW5jZVNoYXBlID1cbiAgICAgICAga3dhcmdzICYmIGt3YXJncy5lbmNvZGVyU2VxdWVuY2UgPyBrd2FyZ3MuZW5jb2RlclNlcXVlbmNlLnNoYXBlIDogbnVsbDtcbiAgICAgIHRoaXMuYnVpbGQoW2RlY29kZXJTZXF1ZW5jZVNoYXBlLCBlbmNvZGVyU2VxdWVuY2VTaGFwZV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuYXBwbHkoZGVjb2RlclNlcXVlbmNlLCBrd2FyZ3MpIGFzIFRlbnNvcnxTeW1ib2xpY1RlbnNvcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhbGwoXG4gICAgICBkZWNvZGVyU2VxdWVuY2U6IFRlbnNvciwga3dhcmdzOiBUcmFuc2Zvcm1lckRlY29kZXJPcHRpb25zKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsQW5kUmV0dXJuQ2FjaGVzKGRlY29kZXJTZXF1ZW5jZSwga3dhcmdzKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkIHBhc3Mgb2YgdGhlIFRyYW5zZm9ybWVyRGVjb2Rlci5cbiAgICpcbiAgICogQHJldHVybnMgT25lIG9mIHRocmVlIHRoaW5ncywgZGVwZW5kaW5nIG9uIGNhbGwgYXJndW1lbnRzOlxuICAgKiAgIC0gYFtvdXRwdXRzLCBudWxsLCBudWxsXWAsIGlmIGBzZWxmQXR0ZW50aW9uQ2FjaGVgIGlzIGBudWxsYC5cbiAgICogICAtIGBbb3V0cHV0cywgc2VsZkF0dGVudGlvbkNhY2hlLCBudWxsXWAsIGlmIGBzZWxmQXR0ZW50aW9uQ2FjaGVgIGlzXG4gICAqICAgICBzZXQgYW5kIHRoZSBsYXllciBoYXMgbm8gY3Jvc3MtYXR0ZW50aW9uLlxuICAgKiAgIC0gYFtvdXRwdXRzLCBzZWxmQXR0ZW50aW9uQ2FjaGUsIGNyb3NzQXR0ZW50aW9uQ2FjaGVdYCwgaWZcbiAgICogICAgIGBzZWxmQXR0ZW50aW9uQ2FjaGVgIGFuZCBgY3Jvc3NBdHRlbnRpb25DYWNoZWAgYXJlIHNldCBhbmRcbiAgICogICAgIHRoZSBsYXllciBoYXMgY3Jvc3MtYXR0ZW50aW9uLlxuICAgKi9cbiAgY2FsbEFuZFJldHVybkNhY2hlcyhcbiAgICBkZWNvZGVyU2VxdWVuY2U6IFRlbnNvciwga3dhcmdzOiBUcmFuc2Zvcm1lckRlY29kZXJPcHRpb25zXG4gICk6IFtUZW5zb3IsIFRlbnNvciwgVGVuc29yXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgaGFzRW5jb2RlclNlcXVlbmNlID0ga3dhcmdzLmVuY29kZXJTZXF1ZW5jZSAhPSBudWxsO1xuICAgICAgY29uc3QgaGFzQ3Jvc3NBdHRlbnRpb24gPSB0aGlzLnNlbGZDcm9zc0F0dGVudGlvbkxheWVyICE9IG51bGw7XG5cbiAgICAgIGlmICghaGFzQ3Jvc3NBdHRlbnRpb24gJiYgaGFzRW5jb2RlclNlcXVlbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdUaGUgbnVtYmVyIG9mIGNhbGwgYXJndW1lbnRzIHRvIGBUcmFuc2Zvcm1lckRlY29kZXJgIHNob3VsZCAnICtcbiAgICAgICAgICAnbm90IGNoYW5nZS4gVXNlIGBsYXllci5hcHBseShkZWNvZGVyU2VxdWVuY2UsIHtlbmNvZGVyU2VxdWVuY2V9KWAgJyArXG4gICAgICAgICAgJ3RvIGJ1aWxkIGEgbGF5ZXIgd2l0aCBjcm9zcyBhdHRlbnRpb24sIG9yICcgK1xuICAgICAgICAgICdgbGF5ZXIuYXBwbHkgKGRlY29kZXJTZXF1ZW5jZSlgIHRvIGJ1aWxkIGEgbGF5ZXIgd2l0aG91dC4gJyArXG4gICAgICAgICAgJ1RoaXMgbGF5ZXIgaGFzIGJlZW4gYnVpbHQgd2l0aG91dCBjcm9zcyBhdHRlbnRpb24sIGJ1dCAnICtcbiAgICAgICAgICAneW91IGFyZSB0cnlpbmcgdG8gY2FsbCBpdCB3aXRoIGVuY29kZXJTZXF1ZW5jZS4nXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhhc0Nyb3NzQXR0ZW50aW9uICYmICFoYXNFbmNvZGVyU2VxdWVuY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ1RoZSBudW1iZXIgb2YgY2FsbCBhcmd1bWVudHMgdG8gYFRyYW5zZm9ybWVyRGVjb2RlcmAgc2hvdWxkIG5vdCAnICtcbiAgICAgICAgICAnY2hhbmdlLiBVc2UgYGxheWVyLmFwcGx5KGRlY29kZXJTZXF1ZW5jZSwge2VuY29kZXJTZXF1ZW5jZX0pYCAnICtcbiAgICAgICAgICAndG8gYnVpbGQgYSBsYXllciB3aXRoIGNyb3NzIGF0dGVudGlvbiwgb3IgJyArXG4gICAgICAgICAgJ2BsYXllci5hcHBseShkZWNvZGVyU2VxdWVuY2UpYCB0byBidWlsZCBhIGxheWVyIHdpdGhvdXQuICcgK1xuICAgICAgICAgICdUaGlzIGxheWVyIGhhcyBiZWVuIGJ1aWx0IHdpdGggY3Jvc3MgYXR0ZW50aW9uLCBidXQgJyArXG4gICAgICAgICAgJ3lvdSBkaWQgbm90IHByb3ZpZGUgZW5jb2RlclNlcXVlbmNlLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzU2VsZkF0dGVudGlvbkNhY2hlID0ga3dhcmdzLnNlbGZBdHRlbnRpb25DYWNoZSAhPSBudWxsO1xuICAgICAgY29uc3QgaGFzQ3Jvc3NBdHRlbnRpb25DYWNoZSA9IGt3YXJncy5jcm9zc0F0dGVudGlvbkNhY2hlICE9IG51bGw7XG4gICAgICBpZiAoaGFzQ3Jvc3NBdHRlbnRpb24gJiYgKFxuICAgICAgICBoYXNTZWxmQXR0ZW50aW9uQ2FjaGUgIT09IGhhc0Nyb3NzQXR0ZW50aW9uQ2FjaGVcbiAgICAgICkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ1doZW4gY2FsbGluZyBgVHJhbnNmb3JtZXJEZWNvZGVyYCB3aXRoIGNyb3NzLWF0dGVudGlvbiAod2l0aCBib3RoICcgK1xuICAgICAgICAgICdgZW5jb2RlclNlcXVlbmNlYCBhbmQgYGRlY29kZXJTZXF1ZW5jZWApLCBgc2VsZkF0dGVudGlvbkNhY2hlYCAnICtcbiAgICAgICAgICAnYW5kIGBjcm9zc0F0dGVudGlvbkNhY2hlYCBzaG91bGQgYm90aCBiZSBzZXQgb3IgYm90aCBiZSBgbnVsbGAuICAnICtcbiAgICAgICAgICAnT25lIGNhbm5vdCBiZSBgbnVsbGAgd2hpbGUgdGhlIG90aGVyIGlzIG5vdC4gUmVjZWl2ZWQ6ICcgK1xuICAgICAgICAgIGBzZWxmQXR0ZW50aW9uQ2FjaGU9JHtrd2FyZ3Muc2VsZkF0dGVudGlvbkNhY2hlfSwgYCArXG4gICAgICAgICAgYGNyb3NzQXR0ZW50aW9uQ2FjaGU9JHtrd2FyZ3MuY3Jvc3NBdHRlbnRpb25DYWNoZX0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxmQXR0ZW50aW9uTWFzayA9IHRoaXMuY29tcHV0ZVNlbGZBdHRlbnRpb25NYXNrKFxuICAgICAgICBkZWNvZGVyU2VxdWVuY2UsXG4gICAgICAgIGt3YXJncy5kZWNvZGVyUGFkZGluZ01hc2sgYXMgVGVuc29yLFxuICAgICAgICBrd2FyZ3MuZGVjb2RlckF0dGVudGlvbk1hc2ssXG4gICAgICAgIGt3YXJncy51c2VDYXVzYWxNYXNrLFxuICAgICAgICBrd2FyZ3Muc2VsZkF0dGVudGlvbkNhY2hlLFxuICAgICAgICBrd2FyZ3Muc2VsZkF0dGVudGlvbkNhY2hlVXBkYXRlSW5kZXgsXG4gICAgICApO1xuXG4gICAgICBsZXQgeCA9IGRlY29kZXJTZXF1ZW5jZTsgLy8gSW50ZXJtZWRpYXRlIHJlc3VsdC5cbiAgICAgIGxldCBzZWxmQXR0ZW50aW9uQ2FjaGUgPSBrd2FyZ3Muc2VsZkF0dGVudGlvbkNhY2hlO1xuXG4gICAgICAvLyBTZWxmIGF0dGVudGlvbiBibG9jay5cbiAgICAgIGxldCByZXNpZHVhbCA9IHg7XG4gICAgICBpZiAodGhpcy5ub3JtYWxpemVGaXJzdCkge1xuICAgICAgICB4ID0gdGhpcy5zZWxmQXR0ZW50aW9uTGF5ZXJub3JtLmFwcGx5KHgpIGFzIFRlbnNvcjtcbiAgICAgIH1cbiAgICAgIFt4LCBzZWxmQXR0ZW50aW9uQ2FjaGVdID0gdGhpcy5zZWxmQXR0ZW50aW9uTGF5ZXIuY2FsbEFuZFJldHVybkNhY2hlKFxuICAgICAgICB4LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHgsXG4gICAgICAgICAgYXR0ZW50aW9uTWFzazogc2VsZkF0dGVudGlvbk1hc2ssXG4gICAgICAgICAgY2FjaGU6IHNlbGZBdHRlbnRpb25DYWNoZSxcbiAgICAgICAgICBjYWNoZVVwZGF0ZUluZGV4OiBrd2FyZ3Muc2VsZkF0dGVudGlvbkNhY2hlVXBkYXRlSW5kZXgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB4ID0gdGhpcy5zZWxmQXR0ZW50aW9uRHJvcG91dC5hcHBseSh4KSBhcyBUZW5zb3I7XG4gICAgICB4ID0gYWRkKHgsIHJlc2lkdWFsKTtcbiAgICAgIGlmICghdGhpcy5ub3JtYWxpemVGaXJzdCkge1xuICAgICAgICB4ID0gdGhpcy5zZWxmQXR0ZW50aW9uTGF5ZXJub3JtLmFwcGx5KHgpIGFzIFRlbnNvcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ3Jvc3MgYXR0ZW50aW9uIGlzIG9wdGlvbmFsLlxuICAgICAgLy8gVE9ETyhwZm9yZGVyaXF1ZSk6IEFkZCBjcm9zcyBhdHRlbnRpb24gbG9naWMgZm9yIGVuY29kZXItZGVjb2RlciBhcmNoLlxuXG4gICAgICAvLyBGZWVkZm9yd2FyZCBibG9jay5cbiAgICAgIHJlc2lkdWFsID0geDtcbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZUZpcnN0KSB7XG4gICAgICAgIHggPSB0aGlzLnNlbGZBdHRlbnRpb25MYXllcm5vcm0uYXBwbHkoeCkgYXMgVGVuc29yO1xuICAgICAgfVxuICAgICAgeCA9IHRoaXMuZmVlZGZvcndhcmRJbnRlcm1lZGlhdGVEZW5zZS5hcHBseSh4KSBhcyBUZW5zb3I7XG4gICAgICB4ID0gdGhpcy5mZWVkZm9yd2FyZE91dHB1dERlbnNlLmFwcGx5KHgpIGFzIFRlbnNvcjtcbiAgICAgIHggPSB0aGlzLmZlZWRmb3J3YXJkRHJvcG91dC5hcHBseSh4KSBhcyBUZW5zb3I7XG4gICAgICB4ID0gYWRkKHgsIHJlc2lkdWFsKTtcbiAgICAgIGlmICghdGhpcy5ub3JtYWxpemVGaXJzdCkge1xuICAgICAgICB4ID0gdGhpcy5zZWxmQXR0ZW50aW9uTGF5ZXJub3JtLmFwcGx5KHgpIGFzIFRlbnNvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGZBdHRlbnRpb25DYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChoYXNDcm9zc0F0dGVudGlvbikge1xuICAgICAgICAgIHJldHVybiBbeCwgc2VsZkF0dGVudGlvbkNhY2hlLCBrd2FyZ3MuY3Jvc3NBdHRlbnRpb25DYWNoZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFt4LCBzZWxmQXR0ZW50aW9uQ2FjaGUsIG51bGxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3gsIG51bGwsIG51bGxdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlU2VsZkF0dGVudGlvbk1hc2soXG4gICAgZGVjb2RlclNlcXVlbmNlOiBUZW5zb3IsXG4gICAgZGVjb2RlclBhZGRpbmdNYXNrOiBUZW5zb3IsXG4gICAgZGVjb2RlckF0dGVudGlvbk1hc2s6IFRlbnNvcixcbiAgICB1c2VDYXN1YWxNYXNrOiBib29sZWFuLFxuICAgIHNlbGZBdHRlbnRpb25DYWNoZTogVGVuc29yLFxuICAgIHNlbGZBdHRlbnRpb25DYWNoZVVwZGF0ZUluZGV4OiBudW1iZXJcbiAgKTogVGVuc29yIHtcbiAgICBjb25zdCBkZWNvZGVyTWFzayA9IG1lcmdlUGFkZGluZ0FuZEF0dGVudGlvbk1hc2soXG4gICAgICBkZWNvZGVyU2VxdWVuY2UsIGRlY29kZXJQYWRkaW5nTWFzaywgZGVjb2RlckF0dGVudGlvbk1hc2spO1xuICAgIGlmKHVzZUNhc3VhbE1hc2spIHtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGRlY29kZXJTZXF1ZW5jZS5zaGFwZVswXTtcbiAgICAgIGxldCBpbnB1dExlbmd0aCA9IGRlY29kZXJTZXF1ZW5jZS5zaGFwZVsxXTtcbiAgICAgIGNvbnN0IG91dHB1dExlbmd0aCA9IGRlY29kZXJTZXF1ZW5jZS5zaGFwZVsxXTtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaGFuZGxlIGEgcmVjdGFuZ3VsYXIgY2F1c2FsIG1hc2sgd2hlbiBkb2luZyBjYWNoZWRcbiAgICAgIC8vIGRlY29kaW5nLiBGb3IgZ2VuZXJhdGl2ZSBpbmZlcmVuY2UsIGBkZWNvZGVyU2VxdWVuY2VgIHdpbGxcbiAgICAgIC8vIGdlbmVyYWxseSBiZSBsZW5ndGggMSwgYW5kIGBjYWNoZWAgd2lsbCBiZSB0aGUgZnVsbCBnZW5lcmF0aW9uIGxlbmd0aC5cbiAgICAgIGlmKHNlbGZBdHRlbnRpb25DYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIGlucHV0TGVuZ3RoID0gc2VsZkF0dGVudGlvbkNhY2hlLnNoYXBlWzJdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXVzYWxNYXNrID0gY29tcHV0ZUNhdXNhbE1hc2soXG4gICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgaW5wdXRMZW5ndGgsXG4gICAgICAgIG91dHB1dExlbmd0aCxcbiAgICAgICAgc2VsZkF0dGVudGlvbkNhY2hlVXBkYXRlSW5kZXggPz8gMFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZWNvZGVyTWFzayAhPSBudWxsID8gZGVjb2Rlck1hc2subWluaW11bShjYXVzYWxNYXNrKSA6IGNhdXNhbE1hc2s7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVyTWFzaztcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICdpbnRlcm1lZGlhdGVEaW0nOiB0aGlzLmludGVybWVkaWF0ZURpbSxcbiAgICAgICdudW1IZWFkcyc6IHRoaXMubnVtSGVhZHMsXG4gICAgICAnZHJvcG91dCc6IHRoaXMuZHJvcG91dCxcbiAgICAgICdhY3RpdmF0aW9uJzogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgJ2xheWVyTm9ybUVwc2lsb24nOiB0aGlzLmxheWVyTm9ybUVwc2lsb24sXG4gICAgICAna2VybmVsSW5pdGlhbGl6ZXInOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmtlcm5lbEluaXRpYWxpemVyKSxcbiAgICAgICdiaWFzSW5pdGlhbGl6ZXInOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICAnbm9ybWFsaXplRmlyc3QnOiB0aGlzLm5vcm1hbGl6ZUZpcnN0LFxuICAgICAgJ2RlY29kZXJTZXF1ZW5jZVNoYXBlJzogdGhpcy5kZWNvZGVyU2VxdWVuY2VTaGFwZSxcbiAgICAgICdlbmNvZGVyU2VxdWVuY2VTaGFwZSc6IHRoaXMuZW5jb2RlclNlcXVlbmNlU2hhcGUsXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBvdmVycmlkZSBjb21wdXRlT3V0cHV0U2hhcGUoZGVjb2RlclNlcXVlbmNlU2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIHJldHVybiBkZWNvZGVyU2VxdWVuY2VTaGFwZTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRyYW5zZm9ybWVyRGVjb2Rlcik7XG4iXX0=

@@ -24,3 +24,6 @@ /**

import { LayersModel } from '../../../engine/training';
import { Embedding } from '../../embeddings';
export declare class Backbone extends LayersModel {
/** @nocollapse */
static className: string;
constructor(args: ContainerArgs);

@@ -30,5 +33,5 @@ /**

*/
get tokenEmbedding(): void;
get tokenEmbedding(): Embedding;
getConfig(): serialization.ConfigDict;
static fromConfig<T extends serialization.Serializable>(cls: serialization.SerializableConstructor<T>, config: serialization.ConfigDict): T;
}

@@ -24,3 +24,3 @@ /**

import { NotImplementedError } from '../../../errors';
export class Backbone extends LayersModel {
class Backbone extends LayersModel {
constructor(args) {

@@ -45,3 +45,6 @@ super(args);

}
/** @nocollapse */
Backbone.className = 'Backbone';
export { Backbone };
serialization.registerClass(Backbone);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JvbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbHMvYmFja2JvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7O0dBRUc7QUFFSCxtREFBbUQ7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxNQUFNLE9BQU8sUUFBUyxTQUFRLFdBQVc7SUFFdkMsWUFBWSxJQUFtQjtRQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVRLFNBQVM7UUFDaEIsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBVSxVQUFVLENBQ3hCLEdBQTZDLEVBQzdDLE1BQWdDO1FBRWhDLE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBQ0QsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTEMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiAgQmFzZSBjbGFzcyBmb3IgQmFja2JvbmUgbW9kZWxzLlxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXNfbmxwL21vZGVscy9iYWNrYm9uZS5weSAqL1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IENvbnRhaW5lckFyZ3MgfSBmcm9tICcuLi8uLi8uLi9lbmdpbmUvY29udGFpbmVyJztcbmltcG9ydCB7IExheWVyc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL3RyYWluaW5nJztcbmltcG9ydCB7IE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgQmFja2JvbmUgZXh0ZW5kcyBMYXllcnNNb2RlbCB7XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ29udGFpbmVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgYHRmLmxheWVycy5lbWJlZGRpbmdgIGluc3RhbmNlIGZvciBlbWJlZGRpbmcgdG9rZW4gaWRzLlxuICAgKi9cbiAgZ2V0IHRva2VuRW1iZWRkaW5nKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdHJhaW5hYmxlOiB0aGlzLnRyYWluYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpOiBUIHtcblxuICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhCYWNrYm9uZSk7XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JvbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbHMvYmFja2JvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7O0dBRUc7QUFFSCxtREFBbUQ7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd0RCxNQUFhLFFBQVMsU0FBUSxXQUFXO0lBSXZDLFlBQVksSUFBbUI7UUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFUSxTQUFTO1FBQ2hCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQVUsVUFBVSxDQUN4QixHQUE2QyxFQUM3QyxNQUFnQztRQUVoQyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7O0FBMUJELGtCQUFrQjtBQUNGLGtCQUFTLEdBQUcsVUFBVSxDQUFDO1NBRjVCLFFBQVE7QUE2QnJCLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIEJhc2UgY2xhc3MgZm9yIEJhY2tib25lIG1vZGVscy5cbiAqL1xuXG4vKiBPcmlnaW5hbCBzb3VyY2U6IGtlcmFzX25scC9tb2RlbHMvYmFja2JvbmUucHkgKi9cbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgeyBDb250YWluZXJBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBMYXllcnNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2VuZ2luZS90cmFpbmluZyc7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IEVtYmVkZGluZyB9IGZyb20gJy4uLy4uL2VtYmVkZGluZ3MnO1xuXG5leHBvcnQgY2xhc3MgQmFja2JvbmUgZXh0ZW5kcyBMYXllcnNNb2RlbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgY2xhc3NOYW1lID0gJ0JhY2tib25lJztcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBDb250YWluZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQSBgdGYubGF5ZXJzLmVtYmVkZGluZ2AgaW5zdGFuY2UgZm9yIGVtYmVkZGluZyB0b2tlbiBpZHMuXG4gICAqL1xuICBnZXQgdG9rZW5FbWJlZGRpbmcoKTogRW1iZWRkaW5nIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHRyYWluYWJsZTogdGhpcy50cmFpbmFibGUsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG5cbiAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQmFja2JvbmUpO1xuIl19

@@ -21,6 +21,7 @@ /**

*/
import { Tensor, Tensor2D, serialization } from '@tensorflow/tfjs-core';
import { NamedTensorMap, Tensor, serialization } from '@tensorflow/tfjs-core';
import { LayerArgs } from '../../../../engine/topology';
import { Preprocessor } from '../preprocessor';
import { GPT2Tokenizer } from './gpt2_tokenizer';
import { StartEndPacker } from '../../preprocessing/start_end_packer';
export declare interface GPT2PreprocessorArgs extends LayerArgs {

@@ -63,6 +64,3 @@ /**

}
export declare interface PreprocessorOutputs {
tokenIds: Tensor2D;
paddingMask: Tensor2D;
}
export declare function packXYSampleWeight(x: NamedTensorMap, y?: Tensor, sampleWeight?: Tensor): NamedTensorMap | [NamedTensorMap, Tensor] | [NamedTensorMap, Tensor, Tensor];
/**

@@ -105,6 +103,8 @@ * GPT2 preprocessing layer which tokenizes and packs inputs.

export declare class GPT2Preprocessor extends Preprocessor {
private readonly sequenceLength;
private readonly addStartToken;
private readonly addEndToken;
private readonly packer;
/** @nocollapse */
static className: string;
protected readonly sequenceLength: number;
protected readonly addStartToken: boolean;
protected readonly addEndToken: boolean;
protected readonly packer: StartEndPacker;
constructor(args: GPT2PreprocessorArgs);

@@ -118,4 +118,4 @@ getConfig(): serialization.ConfigDict;

*/
callAndPackArgs(inputs: Tensor | Tensor[], kwargs: GPT2PreprocessorOptions): PreprocessorOutputs | [PreprocessorOutputs, Tensor] | [PreprocessorOutputs, Tensor, Tensor];
callAndPackArgs(inputs: Tensor | Tensor[], kwargs: GPT2PreprocessorOptions): NamedTensorMap | [NamedTensorMap, Tensor] | [NamedTensorMap, Tensor, Tensor];
static tokenizerCls<T extends serialization.Serializable>(cls: serialization.SerializableConstructor<T>): typeof GPT2Tokenizer;
}

@@ -26,3 +26,3 @@ /**

import { ValueError } from '../../../../errors';
function packXYSampleWeight(x, y, sampleWeight) {
export function packXYSampleWeight(x, y, sampleWeight) {
if (y === undefined) {

@@ -74,3 +74,3 @@ return x;

*/
export class GPT2Preprocessor extends Preprocessor {
class GPT2Preprocessor extends Preprocessor {
constructor(args) {

@@ -140,3 +140,6 @@ var _a, _b, _c;

}
/** @nocollapse */
GPT2Preprocessor.className = 'GPT2Preprocessor';
export { GPT2Preprocessor };
serialization.registerClass(GPT2Preprocessor);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3B0Ml9wcmVwcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbHMvZ3B0Mi9ncHQyX3ByZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7R0FFRztBQUVILGlFQUFpRTtBQUNqRSxPQUFPLEVBQW9CLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFtRGhELFNBQVMsa0JBQWtCLENBQ3pCLENBQXNCLEVBQUUsQ0FBVSxFQUFFLFlBQXFCO0lBS3pELElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNuQixPQUFPLENBQUMsQ0FBQztLQUNWO1NBQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDZjtTQUFNO1FBQ0wsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFlBQVk7SUFNaEQsWUFBWSxJQUEwQjs7UUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxj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ICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIEdQVC0yIHByZXByb2Nlc3NvciBsYXllci5cbiAqL1xuXG4vKiBPcmlnaW5hbCBzb3VyY2U6IGtlcmFzLW5scC9tb2RlbHMvZ3B0Mi9ncHQyX3ByZXByb2Nlc3Nvci5weSAqL1xuaW1wb3J0IHsgVGVuc29yLCBUZW5zb3IyRCwgc2VyaWFsaXphdGlvbiwgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7IExheWVyQXJncyB9IGZyb20gJy4uLy4uLy4uLy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQgeyBQcmVwcm9jZXNzb3IgfSBmcm9tICcuLi9wcmVwcm9jZXNzb3InO1xuaW1wb3J0IHsgR1BUMlRva2VuaXplciB9IGZyb20gJy4vZ3B0Ml90b2tlbml6ZXInO1xuaW1wb3J0IHsgU3RhcnRFbmRQYWNrZXIgfSBmcm9tICcuLi8uLi9wcmVwcm9jZXNzaW5nL3N0YXJ0X2VuZF9wYWNrZXInO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBHUFQyUHJlcHJvY2Vzc29yQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBIEdQVDJUb2tlbml6ZXIgaW5zdGFuY2UuXG4gICAqL1xuICB0b2tlbml6ZXI6IEdQVDJUb2tlbml6ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsZW5ndGggb2YgdGhlIHBhY2tlZCBpbnB1dHMuXG4gICAqIERlZmF1bHRzIHRvIDEwMjQuXG4gICAqL1xuICBzZXF1ZW5jZUxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgcHJlcHJvY2Vzc29yIHdpbGwgcHJlcGVuZCB0aGUgdG9rZW5pemVyIHN0YXJ0IHRva2VuIHRvIGVhY2hcbiAgICogaW5wdXQgc2VxdWVuY2UuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFkZFN0YXJ0VG9rZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBwcmVwcm9jZXNzb3Igd2lsbCBwcmVwZW5kIHRoZSB0b2tlbml6ZXIgZW5kIHRva2VuIHRvIGVhY2hcbiAgICogaW5wdXQgc2VxdWVuY2UuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFkZEVuZFRva2VuPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEdQVDJQcmVwcm9jZXNzb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFueSBsYWJlbCBkYXRhLiBXaWxsIGJlIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC5cbiAgICovXG4gIHk/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEFueSBsYWJlbCB3ZWlnaHQgZGF0YS4gV2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB1bmFsdGVyZWQuXG4gICAqL1xuICBzYW1wbGVXZWlnaHQ/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIFBhc3MgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyZWQgYHNlcXVlbmNlTGVuZ3RoYCBvZiB0aGUgbGF5ZXIuXG4gICAqL1xuICBzZXF1ZW5jZUxlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFByZXByb2Nlc3Nvck91dHB1dHMge1xuICB0b2tlbklkczogVGVuc29yMkQ7XG4gIHBhZGRpbmdNYXNrOiBUZW5zb3IyRDtcbn1cblxuZnVuY3Rpb24gcGFja1hZU2FtcGxlV2VpZ2h0KFxuICB4OiBQcmVwcm9jZXNzb3JPdXRwdXRzLCB5PzogVGVuc29yLCBzYW1wbGVXZWlnaHQ/OiBUZW5zb3IpOlxuICBQcmVwcm9jZXNzb3JPdXRwdXRzXG4gIHwgW1ByZXByb2Nlc3Nvck91dHB1dHMsIFRlbnNvcl1cbiAgfCBbUHJlcHJvY2Vzc29yT3V0cHV0cywgVGVuc29yLCBUZW5zb3JdIHtcblxuICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHg7XG4gIH0gZWxzZSBpZiAoc2FtcGxlV2VpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gW3gsIHldO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbeCwgeSwgc2FtcGxlV2VpZ2h0XTtcbiAgfVxufVxuXG4vKipcbiAqIEdQVDIgcHJlcHJvY2Vzc2luZyBsYXllciB3aGljaCB0b2tlbml6ZXMgYW5kIHBhY2tzIGlucHV0cy5cbiAqXG4gKiBUaGlzIHByZXByb2Nlc3NpbmcgbGF5ZXIgd2lsbCBkbyAyIHRoaW5nczpcbiAqXG4gKiAtIFRva2VuaXplIHRoZSBpbnB1dHMgdXNpbmcgdGhlIGB0b2tlbml6ZXJgLlxuICogLSBDb25zdHJ1Y3QgYSBkaWN0aW9uYXJ5IHdpdGgga2V5cyBgXCJ0b2tlbklkc1wiYCwgYFwicGFkZGluZ01hc2tcImAsIHRoYXQgY2FuXG4gKiAgICAgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIGEgYEdQVDJCYWNrYm9uZWAuXG4gKlxuICogVGhlIGNhbGwgbWV0aG9kIG9mIHRoaXMgbGF5ZXIgYWNjZXB0cyB0aHJlZSBhcmd1bWVudHMsIGB4YCwgYHlgLCBhbmRcbiAqIGBzYW1wbGVXZWlnaHRgLiBgeGAgY2FuIGJlIGEgc3RyaW5nIG9yIHRlbnNvciByZXByZXNlbnRpbmcgYSBzaW5nbGVcbiAqIHNlZ21lbnQsIGEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBhIGJhdGNoIG9mIHNpbmdsZSBzZWdtZW50cyxcbiAqIG9yIGEgbGlzdCBvZiB0ZW5zb3JzIHJlcHJlc2VudGluZyBtdWx0aXBsZSBzZWdtZW50cyB0byBiZSBwYWNrZWQgdG9nZXRoZXIuXG4gKiBgeWAgYW5kIGBzYW1wbGVXZWlnaHRgIGFyZSBib3RoIG9wdGlvbmFsLCBjYW4gaGF2ZSBhbnkgZm9ybWF0LCBhbmQgd2lsbCBiZVxuICogcGFzc2VkIHRocm91Z2ggdW5hbHRlcmVkLlxuICpcbiAqIGBHUFQyUHJlcHJvY2Vzc29yYCBmb3JjZXMgdGhlIGlucHV0IHRvIGhhdmUgb25seSBvbmUgc2VnbWVudCwgYXMgR1BUMiBpc1xuICogbWFpbmx5IHVzZWQgZm9yIGdlbmVyYXRpb24gdGFza3MuIEZvciB0YXNrcyBoYXZpbmcgbXVsdGktc2VnbWVudCBpbnB1dHNcbiAqIGxpa2UgXCJnbHVlL21ubGlcIiwgcGxlYXNlIHVzZSBhIG1vZGVsIGRlc2lnbmVkIGZvciBjbGFzc2lmaWNhdGlvbiBwdXJwb3Nlc1xuICogc3VjaCBhcyBCRVJUIG9yIFJvQkVSVGEuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogRGlyZWN0bHkgY2FsbGluZyB0aGUgbGF5ZXIgb24gZGF0YS5cbiAqIGBgYGpzXG4gKiBjb25zdCBmZWF0dXJlcyA9ICBbJ2EgcXVpY2sgZm94LicsICdhIGZveCBxdWljay4nXTtcbiAqIGNvbnN0IHZvY2FidWxhcnkgPVxuICogICAgbmV3IE1hcChbWyc8fGVuZG9mdGV4dHw+JywgMF0sIFsnYScsIDRdLCBbJ8SgcXVpY2snLCA1XSwgWyfEoGZveCcsIDZdXSk7XG4gKiBjb25zdCBtZXJnZXMgPVxuICogICAgWyfEoCBxJywgJ3UgaScsICdjIGsnLCAndWkgY2snLCAnxKBxIHVpY2snLCAnxKAgZicsICdvIHgnLCAnxKBmIG94J107XG4gKiBjb25zdCB0b2tlbml6ZXIgPSBHUFQyVG9rZW5pemVyKHt2b2NhYnVsYXJ5LCBtZXJnZXN9KTtcbiAqXG4gKiBjb25zdCBwcmVwcm9jZXNzb3IgPSBHUFQyUHJlcHJvY2Vzc29yKHt0b2tlbml6ZXJ9KTtcbiAqIHByZXByb2Nlc3Nvci5jYWxsKHRlbnNvcihbJ3RoZSBxdWljayBicm93biBmb3gganVtcGVkLiddKSlbMF0ucHJpbnQoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgR1BUMlByZXByb2Nlc3NvciBleHRlbmRzIFByZXByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VxdWVuY2VMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRTdGFydFRva2VuOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZEVuZFRva2VuOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhY2tlcjogU3RhcnRFbmRQYWNrZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogR1BUMlByZXByb2Nlc3NvckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnRva2VuaXplciA9IGFyZ3MudG9rZW5pemVyO1xuICAgIHRoaXMuc2VxdWVuY2VMZW5ndGggPSBhcmdzLnNlcXVlbmNlTGVuZ3RoID8/IDEwMjQ7XG4gICAgdGhpcy5hZGRTdGFydFRva2VuID0gYXJncy5hZGRTdGFydFRva2VuID8/IHRydWU7XG4gICAgdGhpcy5hZGRFbmRUb2tlbiA9IGFyZ3MuYWRkRW5kVG9rZW4gPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGdwdDJUb2tlbml6ZXIgPSB0aGlzLnRva2VuaXplciBhcyBHUFQyVG9rZW5pemVyO1xuICAgIHRoaXMucGFja2VyID0gbmV3IFN0YXJ0RW5kUGFja2VyKHtcbiAgICAgIHN0YXJ0VmFsdWU6IGdwdDJUb2tlbml6ZXIuc3RhcnRUb2tlbklkLFxuICAgICAgZW5kVmFsdWU6IGdwdDJUb2tlbml6ZXIuZW5kVG9rZW5JZCxcbiAgICAgIHBhZFZhbHVlOiBncHQyVG9rZW5pemVyLnBhZFRva2VuSWQsXG4gICAgICBzZXF1ZW5jZUxlbmd0aDogdGhpcy5zZXF1ZW5jZUxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlcXVlbmNlTGVuZ3RoOiB0aGlzLnNlcXVlbmNlTGVuZ3RoLFxuICAgICAgYWRkU3RhcnRUb2tlbjogdGhpcy5hZGRTdGFydFRva2VuLFxuICAgICAgYWRkRW5kVG9rZW46IHRoaXMuYWRkRW5kVG9rZW4sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBvdmVycmlkZSBjYWxsKFxuICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEdQVDJQcmVwcm9jZXNzb3JPcHRpb25zKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsQW5kUmV0dXJuUGFkZGluZ01hc2soaW5wdXRzLCBrd2FyZ3MpLnRva2VuSWRzO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxsQW5kUmV0dXJuUGFkZGluZ01hc2soXG4gICAgaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sXG4gICAga3dhcmdzOiBHUFQyUHJlcHJvY2Vzc29yT3B0aW9uc1xuICApOiBQcmVwcm9jZXNzb3JPdXRwdXRzIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAoaW5wdXRzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdHUFQyIHJlcXVpcmVzIGVhY2ggaW5wdXQgZmVhdHVyZSB0byBjb250YWluIG9ubHkgJyArXG4gICAgICAgICAgICBgb25lIHNlZ21lbnQsIGJ1dCByZWNlaXZlZCAke2lucHV0cy5sZW5ndGh9LiBJZiB5b3UgYXJlIHVzaW5nIGAgK1xuICAgICAgICAgICAgJ0dQVDIgZm9yIGEgbXVsdGktc2VnbWVudCBjbGFzc2lmaWNhdGlvbiB0YXNrLCBwbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICAgICAnY2xhc3NpZmljYXRpb24gbW9kZWxzIGxpa2UgQkVSVCBvciBSb0JFUlRhLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0cyA9IGlucHV0c1swXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VxdWVuY2VMZW5ndGggPSBrd2FyZ3Muc2VxdWVuY2VMZW5ndGggPz8gdGhpcy5zZXF1ZW5jZUxlbmd0aDtcbiAgICAgIGNvbnN0IFt0b2tlbklkcywgcGFkZGluZ01hc2tdID0gdGhpcy5wYWNrZXIuY2FsbEFuZFJldHVyblBhZGRpbmdNYXNrKFxuICAgICAgICB0aGlzLnRva2VuaXplci5jYWxsKGlucHV0cyksXG4gICAgICAgIHtcbiAgICAgICAgICBzZXF1ZW5jZUxlbmd0aCxcbiAgICAgICAgICBhZGRTdGFydFZhbHVlOiB0aGlzLmFkZFN0YXJ0VG9rZW4sXG4gICAgICAgICAgYWRkRW5kVmFsdWU6IHRoaXMuYWRkRW5kVG9rZW5cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5JZHM6IHRva2VuSWRzIGFzIFRlbnNvcjJELFxuICAgICAgICBwYWRkaW5nTWFzazogcGFkZGluZ01hc2sgYXMgVGVuc29yMkRcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIGxheWVyIGFuZCByZXR1cm5zIGV4dHJhIGluZm9ybWF0aW9uIGxpa2UgdGhlIHBhZGRpbmdNYXNrIHVzZWQgdG9cbiAgICogcGFjayB0aGUgc2VxdWVuY2UsIHRoZSBsYWJlbCBkYXRhLCBhbmQgdGhlIHNhbXBsZSB3ZWlnaHRzIHVzZWQuXG4gICAqL1xuICBjYWxsQW5kUGFja0FyZ3MoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogR1BUMlByZXByb2Nlc3Nvck9wdGlvbnMpOlxuICAgIFByZXByb2Nlc3Nvck91dHB1dHNcbiAgICB8IFtQcmVwcm9jZXNzb3JPdXRwdXRzLCBUZW5zb3JdXG4gICAgfCBbUHJlcHJvY2Vzc29yT3V0cHV0cywgVGVuc29yLCBUZW5zb3JdIHtcbiAgICBjb25zdCB4ID0gdGhpcy5jYWxsQW5kUmV0dXJuUGFkZGluZ01hc2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgIHJldHVybiBwYWNrWFlTYW1wbGVXZWlnaHQoeCwga3dhcmdzLnksIGt3YXJncy5zYW1wbGVXZWlnaHQpO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHRva2VuaXplckNsczxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPikge1xuICAgIHJldHVybiBHUFQyVG9rZW5pemVyO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1BUMlByZXByb2Nlc3Nvcik7XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3B0Ml9wcmVwcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC9tb2RlbHMvZ3B0Mi9ncHQyX3ByZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7R0FFRztBQUVILGlFQUFpRTtBQUNqRSxPQUFPLEVBQW9DLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUE4Q2hELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsQ0FBaUIsRUFBRSxDQUFVLEVBQUUsWUFBcUI7SUFLcEQsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7U0FBTSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDckMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztLQUM3QjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLFlBQVk7SUFTaEQsWUFBWSxJQUEwQjs7UUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxj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QWdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTEMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBHUFQtMiBwcmVwcm9jZXNzb3IgbGF5ZXIuXG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy1ubHAvbW9kZWxzL2dwdDIvZ3B0Ml9wcmVwcm9jZXNzb3IucHkgKi9cbmltcG9ydCB7IE5hbWVkVGVuc29yTWFwLCBUZW5zb3IsIFRlbnNvcjJELCBzZXJpYWxpemF0aW9uLCB0aWR5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHsgTGF5ZXJBcmdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7IFByZXByb2Nlc3NvciB9IGZyb20gJy4uL3ByZXByb2Nlc3Nvcic7XG5pbXBvcnQgeyBHUFQyVG9rZW5pemVyIH0gZnJvbSAnLi9ncHQyX3Rva2VuaXplcic7XG5pbXBvcnQgeyBTdGFydEVuZFBhY2tlciB9IGZyb20gJy4uLy4uL3ByZXByb2Nlc3Npbmcvc3RhcnRfZW5kX3BhY2tlcic7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vZXJyb3JzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEdQVDJQcmVwcm9jZXNzb3JBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIEEgR1BUMlRva2VuaXplciBpbnN0YW5jZS5cbiAgICovXG4gIHRva2VuaXplcjogR1BUMlRva2VuaXplcjtcblxuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgcGFja2VkIGlucHV0cy5cbiAgICogRGVmYXVsdHMgdG8gMTAyNC5cbiAgICovXG4gIHNlcXVlbmNlTGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBwcmVwcm9jZXNzb3Igd2lsbCBwcmVwZW5kIHRoZSB0b2tlbml6ZXIgc3RhcnQgdG9rZW4gdG8gZWFjaFxuICAgKiBpbnB1dCBzZXF1ZW5jZS5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgYWRkU3RhcnRUb2tlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIHByZXByb2Nlc3NvciB3aWxsIHByZXBlbmQgdGhlIHRva2VuaXplciBlbmQgdG9rZW4gdG8gZWFjaFxuICAgKiBpbnB1dCBzZXF1ZW5jZS5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgYWRkRW5kVG9rZW4/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgR1BUMlByZXByb2Nlc3Nvck9wdGlvbnMge1xuICAvKipcbiAgICogQW55IGxhYmVsIGRhdGEuIFdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdW5hbHRlcmVkLlxuICAgKi9cbiAgeT86IFRlbnNvcjtcblxuICAvKipcbiAgICogQW55IGxhYmVsIHdlaWdodCBkYXRhLiBXaWxsIGJlIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC5cbiAgICovXG4gIHNhbXBsZVdlaWdodD86IFRlbnNvcjtcblxuICAvKipcbiAgICogUGFzcyB0byBvdmVycmlkZSB0aGUgY29uZmlndXJlZCBgc2VxdWVuY2VMZW5ndGhgIG9mIHRoZSBsYXllci5cbiAgICovXG4gIHNlcXVlbmNlTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja1hZU2FtcGxlV2VpZ2h0KFxuICB4OiBOYW1lZFRlbnNvck1hcCwgeT86IFRlbnNvciwgc2FtcGxlV2VpZ2h0PzogVGVuc29yKTpcbiAgTmFtZWRUZW5zb3JNYXBcbiAgfCBbTmFtZWRUZW5zb3JNYXAsIFRlbnNvcl1cbiAgfCBbTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgVGVuc29yXSB7XG5cbiAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB4O1xuICB9IGVsc2UgaWYgKHNhbXBsZVdlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFt4LCB5XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3gsIHksIHNhbXBsZVdlaWdodF07XG4gIH1cbn1cblxuLyoqXG4gKiBHUFQyIHByZXByb2Nlc3NpbmcgbGF5ZXIgd2hpY2ggdG9rZW5pemVzIGFuZCBwYWNrcyBpbnB1dHMuXG4gKlxuICogVGhpcyBwcmVwcm9jZXNzaW5nIGxheWVyIHdpbGwgZG8gMiB0aGluZ3M6XG4gKlxuICogLSBUb2tlbml6ZSB0aGUgaW5wdXRzIHVzaW5nIHRoZSBgdG9rZW5pemVyYC5cbiAqIC0gQ29uc3RydWN0IGEgZGljdGlvbmFyeSB3aXRoIGtleXMgYFwidG9rZW5JZHNcImAsIGBcInBhZGRpbmdNYXNrXCJgLCB0aGF0IGNhblxuICogICAgIGJlIHBhc3NlZCBkaXJlY3RseSB0byBhIGBHUFQyQmFja2JvbmVgLlxuICpcbiAqIFRoZSBjYWxsIG1ldGhvZCBvZiB0aGlzIGxheWVyIGFjY2VwdHMgdGhyZWUgYXJndW1lbnRzLCBgeGAsIGB5YCwgYW5kXG4gKiBgc2FtcGxlV2VpZ2h0YC4gYHhgIGNhbiBiZSBhIHN0cmluZyBvciB0ZW5zb3IgcmVwcmVzZW50aW5nIGEgc2luZ2xlXG4gKiBzZWdtZW50LCBhIGxpc3Qgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgYSBiYXRjaCBvZiBzaW5nbGUgc2VnbWVudHMsXG4gKiBvciBhIGxpc3Qgb2YgdGVuc29ycyByZXByZXNlbnRpbmcgbXVsdGlwbGUgc2VnbWVudHMgdG8gYmUgcGFja2VkIHRvZ2V0aGVyLlxuICogYHlgIGFuZCBgc2FtcGxlV2VpZ2h0YCBhcmUgYm90aCBvcHRpb25hbCwgY2FuIGhhdmUgYW55IGZvcm1hdCwgYW5kIHdpbGwgYmVcbiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC5cbiAqXG4gKiBgR1BUMlByZXByb2Nlc3NvcmAgZm9yY2VzIHRoZSBpbnB1dCB0byBoYXZlIG9ubHkgb25lIHNlZ21lbnQsIGFzIEdQVDIgaXNcbiAqIG1haW5seSB1c2VkIGZvciBnZW5lcmF0aW9uIHRhc2tzLiBGb3IgdGFza3MgaGF2aW5nIG11bHRpLXNlZ21lbnQgaW5wdXRzXG4gKiBsaWtlIFwiZ2x1ZS9tbmxpXCIsIHBsZWFzZSB1c2UgYSBtb2RlbCBkZXNpZ25lZCBmb3IgY2xhc3NpZmljYXRpb24gcHVycG9zZXNcbiAqIHN1Y2ggYXMgQkVSVCBvciBSb0JFUlRhLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIERpcmVjdGx5IGNhbGxpbmcgdGhlIGxheWVyIG9uIGRhdGEuXG4gKiBgYGBqc1xuICogY29uc3QgZmVhdHVyZXMgPSAgWydhIHF1aWNrIGZveC4nLCAnYSBmb3ggcXVpY2suJ107XG4gKiBjb25zdCB2b2NhYnVsYXJ5ID1cbiAqICAgIG5ldyBNYXAoW1snPHxlbmRvZnRleHR8PicsIDBdLCBbJ2EnLCA0XSwgWyfEoHF1aWNrJywgNV0sIFsnxKBmb3gnLCA2XV0pO1xuICogY29uc3QgbWVyZ2VzID1cbiAqICAgIFsnxKAgcScsICd1IGknLCAnYyBrJywgJ3VpIGNrJywgJ8SgcSB1aWNrJywgJ8SgIGYnLCAnbyB4JywgJ8SgZiBveCddO1xuICogY29uc3QgdG9rZW5pemVyID0gR1BUMlRva2VuaXplcih7dm9jYWJ1bGFyeSwgbWVyZ2VzfSk7XG4gKlxuICogY29uc3QgcHJlcHJvY2Vzc29yID0gR1BUMlByZXByb2Nlc3Nvcih7dG9rZW5pemVyfSk7XG4gKiBwcmVwcm9jZXNzb3IuY2FsbCh0ZW5zb3IoWyd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZC4nXSkpWzBdLnByaW50KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEdQVDJQcmVwcm9jZXNzb3IgZXh0ZW5kcyBQcmVwcm9jZXNzb3Ige1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGNsYXNzTmFtZSA9ICdHUFQyUHJlcHJvY2Vzc29yJztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VxdWVuY2VMZW5ndGg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZFN0YXJ0VG9rZW46IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBhZGRFbmRUb2tlbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhY2tlcjogU3RhcnRFbmRQYWNrZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogR1BUMlByZXByb2Nlc3NvckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnRva2VuaXplciA9IGFyZ3MudG9rZW5pemVyO1xuICAgIHRoaXMuc2VxdWVuY2VMZW5ndGggPSBhcmdzLnNlcXVlbmNlTGVuZ3RoID8/IDEwMjQ7XG4gICAgdGhpcy5hZGRTdGFydFRva2VuID0gYXJncy5hZGRTdGFydFRva2VuID8/IHRydWU7XG4gICAgdGhpcy5hZGRFbmRUb2tlbiA9IGFyZ3MuYWRkRW5kVG9rZW4gPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGdwdDJUb2tlbml6ZXIgPSB0aGlzLnRva2VuaXplciBhcyBHUFQyVG9rZW5pemVyO1xuICAgIHRoaXMucGFja2VyID0gbmV3IFN0YXJ0RW5kUGFja2VyKHtcbiAgICAgIHN0YXJ0VmFsdWU6IGdwdDJUb2tlbml6ZXIuc3RhcnRUb2tlbklkLFxuICAgICAgZW5kVmFsdWU6IGdwdDJUb2tlbml6ZXIuZW5kVG9rZW5JZCxcbiAgICAgIHBhZFZhbHVlOiBncHQyVG9rZW5pemVyLnBhZFRva2VuSWQsXG4gICAgICBzZXF1ZW5jZUxlbmd0aDogdGhpcy5zZXF1ZW5jZUxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlcXVlbmNlTGVuZ3RoOiB0aGlzLnNlcXVlbmNlTGVuZ3RoLFxuICAgICAgYWRkU3RhcnRUb2tlbjogdGhpcy5hZGRTdGFydFRva2VuLFxuICAgICAgYWRkRW5kVG9rZW46IHRoaXMuYWRkRW5kVG9rZW4sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBvdmVycmlkZSBjYWxsKFxuICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEdQVDJQcmVwcm9jZXNzb3JPcHRpb25zKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsQW5kUmV0dXJuUGFkZGluZ01hc2soaW5wdXRzLCBrd2FyZ3MpLnRva2VuSWRzO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxsQW5kUmV0dXJuUGFkZGluZ01hc2soXG4gICAgaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sXG4gICAga3dhcmdzOiBHUFQyUHJlcHJvY2Vzc29yT3B0aW9uc1xuICApOiBOYW1lZFRlbnNvck1hcCB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKGlucHV0cyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnR1BUMiByZXF1aXJlcyBlYWNoIGlucHV0IGZlYXR1cmUgdG8gY29udGFpbiBvbmx5ICcgK1xuICAgICAgICAgICAgYG9uZSBzZWdtZW50LCBidXQgcmVjZWl2ZWQgJHtpbnB1dHMubGVuZ3RofS4gSWYgeW91IGFyZSB1c2luZyBgICtcbiAgICAgICAgICAgICdHUFQyIGZvciBhIG11bHRpLXNlZ21lbnQgY2xhc3NpZmljYXRpb24gdGFzaywgcGxlYXNlIHJlZmVyIHRvICcgK1xuICAgICAgICAgICAgJ2NsYXNzaWZpY2F0aW9uIG1vZGVscyBsaWtlIEJFUlQgb3IgUm9CRVJUYS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dHMgPSBpbnB1dHNbMF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcXVlbmNlTGVuZ3RoID0ga3dhcmdzLnNlcXVlbmNlTGVuZ3RoID8/IHRoaXMuc2VxdWVuY2VMZW5ndGg7XG4gICAgICBjb25zdCBbdG9rZW5JZHMsIHBhZGRpbmdNYXNrXSA9IHRoaXMucGFja2VyLmNhbGxBbmRSZXR1cm5QYWRkaW5nTWFzayhcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuY2FsbChpbnB1dHMpLFxuICAgICAgICB7XG4gICAgICAgICAgc2VxdWVuY2VMZW5ndGgsXG4gICAgICAgICAgYWRkU3RhcnRWYWx1ZTogdGhpcy5hZGRTdGFydFRva2VuLFxuICAgICAgICAgIGFkZEVuZFZhbHVlOiB0aGlzLmFkZEVuZFRva2VuXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuSWRzOiB0b2tlbklkcyBhcyBUZW5zb3IyRCxcbiAgICAgICAgcGFkZGluZ01hc2s6IHBhZGRpbmdNYXNrIGFzIFRlbnNvcjJEXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBsYXllciBhbmQgcmV0dXJucyBleHRyYSBpbmZvcm1hdGlvbiBsaWtlIHRoZSBwYWRkaW5nTWFzayB1c2VkIHRvXG4gICAqIHBhY2sgdGhlIHNlcXVlbmNlLCB0aGUgbGFiZWwgZGF0YSwgYW5kIHRoZSBzYW1wbGUgd2VpZ2h0cyB1c2VkLlxuICAgKi9cbiAgY2FsbEFuZFBhY2tBcmdzKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEdQVDJQcmVwcm9jZXNzb3JPcHRpb25zKTpcbiAgICBOYW1lZFRlbnNvck1hcFxuICAgIHwgW05hbWVkVGVuc29yTWFwLCBUZW5zb3JdXG4gICAgfCBbTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgVGVuc29yXSB7XG4gICAgY29uc3QgeCA9IHRoaXMuY2FsbEFuZFJldHVyblBhZGRpbmdNYXNrKGlucHV0cywga3dhcmdzKTtcbiAgICByZXR1cm4gcGFja1hZU2FtcGxlV2VpZ2h0KHgsIGt3YXJncy55LCBrd2FyZ3Muc2FtcGxlV2VpZ2h0KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSB0b2tlbml6ZXJDbHM8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4pIHtcbiAgICByZXR1cm4gR1BUMlRva2VuaXplcjtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEdQVDJQcmVwcm9jZXNzb3IpO1xuIl19

@@ -26,3 +26,3 @@ /**

/** @nocollapse */
static readonly className = "Preprocessor";
static className: string;
private _tokenizer;

@@ -29,0 +29,0 @@ constructor(args: LayerArgs);

@@ -57,2 +57,2 @@ /**

serialization.registerClass(Preprocessor);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9ubHAvbW9kZWxzL3ByZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxLQUFLLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTVGOztHQUVHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsS0FBSztJQU1yQyxZQUFZLElBQWU7UUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFnQjtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRVEsU0FBUztRQUNoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBVSxVQUFVLENBQ3hCLEdBQTZDLEVBQzdDLE1BQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUFXLE1BQU0sQ0FBQztRQUU5QixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQ3hFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFNBQXFDLENBQUM7WUFFekUsTUFBTSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FDdkMsbUJBQW1CLEVBQ25CLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQ3BELEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2pCLEdBQTZDLElBQUcsQ0FBQzs7QUE1Q25ELGtCQUFrQjtBQUNGLHNCQUFTLEdBQUcsY0FBYyxDQUFDO1NBRmhDLFlBQVk7QUErQ3pCLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMtbmxwL21vZGVscy9wcmVwcm9jZXNzb3IucHkgKi9cbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgeyBMYXllciwgTGF5ZXJBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7IFRva2VuaXplciB9IGZyb20gJy4uL3Rva2VuaXplcnMnO1xuaW1wb3J0IHsgS3dhcmdzIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVzZXJpYWxpemVLZXJhc09iamVjdCwgc2VyaWFsaXplS2VyYXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtb2RlbCBQcmVwcm9jZXNzb3JzLlxuICovXG5leHBvcnQgY2xhc3MgUHJlcHJvY2Vzc29yIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdQcmVwcm9jZXNzb3InO1xuXG4gIHByaXZhdGUgX3Rva2VuaXplcjogVG9rZW5pemVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b2tlbml6ZXIgdXNlZCB0byB0b2tlbml6ZSBzdHJpbmdzLlxuICAgKi9cbiAgZ2V0IHRva2VuaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW5pemVyO1xuICB9XG5cbiAgc2V0IHRva2VuaXplcih2YWx1ZTogVG9rZW5pemVyKSB7XG4gICAgdGhpcy5fdG9rZW5pemVyID0gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBjb25maWcudG9rZW5pemVyID0gc2VyaWFsaXplS2VyYXNPYmplY3QodGhpcy50b2tlbml6ZXIpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFxuICApOiBUIHtcbiAgICBjb25zdCBrd2FyZ3M6IEt3YXJncyA9IGNvbmZpZztcblxuICAgIGlmIChjb25maWcudG9rZW5pemVyICE9IG51bGwgJiYgIShjb25maWcudG9rZW5pemVyIGluc3RhbmNlb2YgVG9rZW5pemVyKSkge1xuICAgICAgY29uc3QgdG9rZW5pemVyQ29uZmlnRGljdCA9IGNvbmZpZy50b2tlbml6ZXIgYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuXG4gICAgICBrd2FyZ3MudG9rZW5pemVyID0gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgICAgdG9rZW5pemVyQ29uZmlnRGljdCxcbiAgICAgICAgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgICAge30sICdwcmVwcm9jZXNzb3InKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoa3dhcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyB0b2tlbml6ZXJDbHM8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4pIHt9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUHJlcHJvY2Vzc29yKTtcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9ubHAvbW9kZWxzL3ByZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxLQUFLLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTVGOztHQUVHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsS0FBSztJQU1yQyxZQUFZLElBQWU7UUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFnQjtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRVEsU0FBUztRQUNoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBVSxVQUFVLENBQ3hCLEdBQTZDLEVBQzdDLE1BQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUFXLE1BQU0sQ0FBQztRQUU5QixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQ3hFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFNBQXFDLENBQUM7WUFFekUsTUFBTSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FDdkMsbUJBQW1CLEVBQ25CLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQ3BELEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2pCLEdBQTZDLElBQUcsQ0FBQzs7QUE1Q25ELGtCQUFrQjtBQUNYLHNCQUFTLEdBQUcsY0FBYyxDQUFDO1NBRnZCLFlBQVk7QUErQ3pCLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMtbmxwL21vZGVscy9wcmVwcm9jZXNzb3IucHkgKi9cbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgeyBMYXllciwgTGF5ZXJBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7IFRva2VuaXplciB9IGZyb20gJy4uL3Rva2VuaXplcnMnO1xuaW1wb3J0IHsgS3dhcmdzIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVzZXJpYWxpemVLZXJhc09iamVjdCwgc2VyaWFsaXplS2VyYXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtb2RlbCBQcmVwcm9jZXNzb3JzLlxuICovXG5leHBvcnQgY2xhc3MgUHJlcHJvY2Vzc29yIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdQcmVwcm9jZXNzb3InO1xuXG4gIHByaXZhdGUgX3Rva2VuaXplcjogVG9rZW5pemVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b2tlbml6ZXIgdXNlZCB0byB0b2tlbml6ZSBzdHJpbmdzLlxuICAgKi9cbiAgZ2V0IHRva2VuaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW5pemVyO1xuICB9XG5cbiAgc2V0IHRva2VuaXplcih2YWx1ZTogVG9rZW5pemVyKSB7XG4gICAgdGhpcy5fdG9rZW5pemVyID0gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBjb25maWcudG9rZW5pemVyID0gc2VyaWFsaXplS2VyYXNPYmplY3QodGhpcy50b2tlbml6ZXIpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFxuICApOiBUIHtcbiAgICBjb25zdCBrd2FyZ3M6IEt3YXJncyA9IGNvbmZpZztcblxuICAgIGlmIChjb25maWcudG9rZW5pemVyICE9IG51bGwgJiYgIShjb25maWcudG9rZW5pemVyIGluc3RhbmNlb2YgVG9rZW5pemVyKSkge1xuICAgICAgY29uc3QgdG9rZW5pemVyQ29uZmlnRGljdCA9IGNvbmZpZy50b2tlbml6ZXIgYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuXG4gICAgICBrd2FyZ3MudG9rZW5pemVyID0gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgICAgdG9rZW5pemVyQ29uZmlnRGljdCxcbiAgICAgICAgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgICAge30sICdwcmVwcm9jZXNzb3InKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoa3dhcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyB0b2tlbml6ZXJDbHM8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4pIHt9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUHJlcHJvY2Vzc29yKTtcbiJdfQ==

@@ -21,8 +21,12 @@ /**

*/
import { Tensor, Tensor1D, Tensor2D, serialization } from '@tensorflow/tfjs-core';
import { ConstraintIdentifier } from '../../constraints';
import { Layer, LayerArgs } from '../../engine/topology';
import { InitializerIdentifier } from '../../initializers';
import { Tensor, serialization } from '@tensorflow/tfjs-core';
import { Constraint, ConstraintIdentifier } from '../../constraints';
import { Layer, LayerArgs, SymbolicTensor } from '../../engine/topology';
import { Initializer, InitializerIdentifier } from '../../initializers';
import { Shape } from '../../keras_format/common';
import { RegularizerIdentifier } from '../../regularizers';
import { Regularizer, RegularizerIdentifier } from '../../regularizers';
import { Kwargs } from '../../types';
import { Softmax } from '../advanced_activations';
import { Dropout } from '../core';
import { EinsumDense } from './einsum_dense';
export declare interface MultiHeadAttentionArgs extends LayerArgs {

@@ -62,3 +66,3 @@ /**

*/
attentionAxes: number[];
attentionAxes?: number[] | number;
/**

@@ -68,3 +72,3 @@ * Initializer for dense layer kernels.

*/
kernelInitializer?: InitializerIdentifier;
kernelInitializer?: Initializer | InitializerIdentifier;
/**

@@ -74,23 +78,23 @@ * Initializer for dense layer biases.

*/
biasInitializer?: InitializerIdentifier;
biasInitializer?: Initializer | InitializerIdentifier;
/**
* Regularizer for dense layer kernels.
*/
kernelRegularizer?: RegularizerIdentifier;
kernelRegularizer?: Regularizer | RegularizerIdentifier;
/**
* Regularizer for dense layer biases.
*/
biasRegularizer?: RegularizerIdentifier;
biasRegularizer?: Regularizer | RegularizerIdentifier;
/**
* Regularizer for dense layer activity.
*/
activityRegularizer?: RegularizerIdentifier;
activityRegularizer?: Regularizer | RegularizerIdentifier;
/**
* Constraint for dense layer kernels.
*/
kernelConstraint?: ConstraintIdentifier;
kernelConstraint?: Constraint | ConstraintIdentifier;
/**
* Constraint for dense layer kernels.
*/
biasConstraint?: ConstraintIdentifier;
biasConstraint?: Constraint | ConstraintIdentifier;
}

@@ -165,2 +169,3 @@ export declare interface MultiHeadAttentionOptions {

*
* ```js
* const layer = new MultiHeadAttention({numHeads: 2, keyDim: 2});

@@ -173,5 +178,7 @@ * const target = tf.input({shape: [8, 16]});

* console.log(weights.shape); // [null, 2, 8, 4]
* ```
*
* Performs 2D self-attention over a 5D input tensor on axes 2 and 3.
*
* ```js
* const layer = new MultiHeadAttention({

@@ -182,2 +189,3 @@ * numHeads: 2, keyDim: 2, attentionAxes: [2, 3]});

* console.log(outputTensor.shape); // [null, 5, 3, 4, 16]
* ```
*

@@ -195,3 +203,44 @@ * Returns:

static readonly className = "MultiHeadAttention";
protected readonly numHeads: number;
protected readonly keyDim: number;
protected readonly valueDim: number;
protected readonly dropout: number;
protected readonly useBias: boolean;
protected readonly _outputShape: Shape;
protected readonly kernelInitializer: Initializer;
protected readonly biasInitializer: Initializer;
protected readonly kernelRegularizer: Regularizer;
protected readonly biasRegularizer: Regularizer;
protected readonly kernelConstraint: Constraint;
protected readonly biasConstraint: Constraint;
protected dotProductEquation: string;
protected combineEquation: string;
protected attentionAxes: number[];
protected builtFromSignature: boolean;
protected softmax: Softmax;
protected dropoutLayer: Dropout;
protected queryShape: Shape;
protected keyShape: Shape;
protected valueShape: Shape;
protected queryDense: EinsumDense;
protected keyDense: EinsumDense;
protected valueDense: EinsumDense;
protected outputDense: EinsumDense;
constructor(args: MultiHeadAttentionArgs);
/**
* Should be used for testing purposes only.
*/
get _queryDense(): EinsumDense;
/**
* Should be used for testing purposes only.
*/
get _keyDense(): EinsumDense;
/**
* Should be used for testing purposes only.
*/
get _valueDense(): EinsumDense;
/**
* Should be used for testing purposes only.
*/
get _outputDense(): EinsumDense;
getConfig(): serialization.ConfigDict;

@@ -204,3 +253,3 @@ static fromConfig<T extends serialization.Serializable>(cls: serialization.SerializableConstructor<T>, config: serialization.ConfigDict): T;

*/
private buildFromSignature;
buildFromSignature(queryShape: Shape, valueShape: Shape, keyShape?: Shape): void;
private getCommonKwargsForSublayer;

@@ -219,3 +268,3 @@ /**

*
* This function builds attributes necessary for `_compute_attention` to
* This function builds attributes necessary for `computeAttention` to
* customize attention computation to replace the default dot-product

@@ -226,4 +275,4 @@ * attention.

*/
private buildAttention;
private maskedSoftmax;
protected buildAttention(rank: number): void;
protected maskedSoftmax(attentionScores: Tensor, attentionMask?: Tensor): Tensor;
/**

@@ -236,5 +285,5 @@ * Applies Dot-product attention with query, key, value tensors.

*
* @param query Projected query `Tensor` of shape `(B, T, N, key_dim)`.
* @param key Projected key `Tensor` of shape `(B, S, N, key_dim)`.
* @param value Projected value `Tensor` of shape `(B, S, N, value_dim)`.
* @param query Projected query `Tensor` of shape `(B, T, N, keyDim)`.
* @param key Projected key `Tensor` of shape `(B, S, N, keyDim)`.
* @param value Projected value `Tensor` of shape `(B, S, N, valueDim)`.
* @param attentionMask A boolean mask of shape `(B, T, S)`, that prevents

@@ -249,8 +298,9 @@ * attention to certain positions. It is generally not needed if

*/
private computeAttention;
call(query: Tensor, kwargs: MultiHeadAttentionOptions): Tensor | Tensor2D;
protected computeAttention(query: Tensor, key: Tensor, value: Tensor, attentionMask?: Tensor, training?: boolean): [Tensor, Tensor];
apply(inputs: Tensor | SymbolicTensor, kwargs?: Kwargs): Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[];
call(query: Tensor, kwargs: MultiHeadAttentionOptions): Tensor;
/**
* Exactly like `call` except also returns the attention scores.
*/
callAndReturnAttentionScores(query: Tensor, kwargs: MultiHeadAttentionOptions): [Tensor1D | Tensor2D, Tensor1D | Tensor2D];
callAndReturnAttentionScores(query: Tensor, { value, key, useCausalMask, attentionMask, training }: MultiHeadAttentionOptions): [Tensor, Tensor];
/**

@@ -271,5 +321,5 @@ * Computes the attention mask.

*
* @param query Projected query `Tensor` of shape `(B, T, N, key_dim)`.
* @param key Projected key `Tensor` of shape `(B, S, N, key_dim)`.
* @param value Projected value `Tensor` of shape `(B, S, N, value_dim)`.
* @param query Projected query `Tensor` of shape `(B, T, N, keyDim)`.
* @param key Projected key `Tensor` of shape `(B, S, N, keyDim)`.
* @param value Projected value `Tensor` of shape `(B, S, N, valueDim)`.
* @param attentionMask A boolean mask of shape `(B, T, S)`, that prevents

@@ -304,3 +354,3 @@ * attention to certain positions.

*/
private computeCasualMask;
private computeCausalMask;
/**

@@ -312,3 +362,3 @@ *

*/
computeOutputShape(inputShapes: [Shape, Shape] | [Shape, Shape, Shape]): Shape;
computeOutputShape(inputShapes: [Shape, Shape, Shape | null]): Shape;
}

@@ -18,3 +18,7 @@ /**

/// <amd-module name="@tensorflow/tfjs-layers/dist/layers/nlp/utils" />
import { Tensor } from '@tensorflow/tfjs-core';
import { ModelPredictConfig, Scalar, Tensor } from '@tensorflow/tfjs-core';
import { History } from '../../base_callbacks';
import { ContainerArgs } from '../../engine/container';
import { LayersModel, ModelEvaluateArgs } from '../../engine/training';
import { ModelFitArgs } from '../../engine/training_tensors';
export declare function tensorToArr(input: Tensor): unknown[];

@@ -33,1 +37,41 @@ export declare function tensorArrTo2DArr(inputs: Tensor[]): unknown[][];

export declare function sliceUpdate(inputs: Tensor, startIndices: number[], updates: Tensor): Tensor;
/**
* A model which allows automatically applying preprocessing.
*/
export interface PipelineModelArgs extends ContainerArgs {
/**
* Defaults to true.
*/
includePreprocessing?: boolean;
}
export declare class PipelineModel extends LayersModel {
/** @nocollapse */
static className: string;
protected includePreprocessing: boolean;
constructor(args: PipelineModelArgs);
/**
* An overridable function which preprocesses features.
*/
preprocessFeatures(x: Tensor): Tensor<import("@tensorflow/tfjs-core").Rank>;
/**
* An overridable function which preprocesses labels.
*/
preprocessLabels(y: Tensor): Tensor<import("@tensorflow/tfjs-core").Rank>;
/**
* An overridable function which preprocesses entire samples.
*/
preprocessSamples(x: Tensor, y?: Tensor, sampleWeight?: Tensor): Tensor | [Tensor, Tensor] | [Tensor, Tensor, Tensor];
fit(x: Tensor | Tensor[] | {
[inputName: string]: Tensor;
}, y: Tensor | Tensor[] | {
[inputName: string]: Tensor;
}, args?: ModelFitArgs): Promise<History>;
evaluate(x: Tensor | Tensor[], y: Tensor | Tensor[], args?: ModelEvaluateArgs): Scalar | Scalar[];
predict(x: Tensor | Tensor[], args?: ModelPredictConfig): Tensor | Tensor[];
trainOnBatch(x: Tensor | Tensor[] | {
[inputName: string]: Tensor;
}, y: Tensor | Tensor[] | {
[inputName: string]: Tensor;
}, sampleWeight?: Tensor): Promise<number | number[]>;
predictOnBatch(x: Tensor | Tensor[]): Tensor | Tensor[];
}

@@ -18,2 +18,4 @@ /**

import { tensorScatterUpdate, tidy } from '@tensorflow/tfjs-core';
import { LayersModel } from '../../engine/training';
import { NotImplementedError } from '../../errors';
export function tensorToArr(input) {

@@ -61,2 +63,62 @@ return Array.from(input.dataSync());

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQVUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQXlCLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFnQjtJQUMvQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDdkIsTUFBYyxFQUFFLFlBQXNCLEVBQUUsT0FBZTtJQUN6RCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7UUFDL0I7OztXQUdHO1FBQ0gsU0FBUyxhQUFhLENBQUMsR0FBVyxFQUFFLElBQWM7WUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzNCLE9BQU87YUFDUjtZQUNELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNiLGFBQWEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDWjtRQUNILENBQUM7UUFDRCxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLDZEQUE2RDtRQUM3RCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7IFRlbnNvciwgdGVuc29yU2NhdHRlclVwZGF0ZSwgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3JUb0FycihpbnB1dDogVGVuc29yKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oaW5wdXQuZGF0YVN5bmMoKSkgYXMgdW5rbm93biBhcyB1bmtub3duW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3JBcnJUbzJEQXJyKGlucHV0czogVGVuc29yW10pOiB1bmtub3duW11bXSB7XG4gIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+IHRlbnNvclRvQXJyKGlucHV0KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBUZW5zb3Igd2l0aCBgdXBkYXRlc2AgaW5zZXJ0ZWQgaW50byBgaW5wdXRzYCBzdGFydGluZyBhdCB0aGVcbiAqIGluZGV4IGBzdGFydEluZGljZXNgLlxuICpcbiAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIHRvIFwibW9kaWZ5XCJcbiAqIEBwYXJhbSBzdGFydEluZGljZXMgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIGluc2VydCB0aGUgc2xpY2UuXG4gKiAgTGVuZ3RoIG11c3QgYmUgZXF1YWwgdG8gYGlucHV0cy5yYW5rYDtcbiAqIEBwYXJhbSB1cGRhdGVzIHRoZSB1cGRhdGUgdGVuc29yLiBTaGFwZSBtdXN0IGZpdCB3aXRoaW4gYGlucHV0c2Agc2hhcGUuXG4gKiBAcmV0dXJucyBhIG5ldyB0ZW5zb3Igd2l0aCB0aGUgbW9kaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VVcGRhdGUoXG4gICAgaW5wdXRzOiBUZW5zb3IsIHN0YXJ0SW5kaWNlczogbnVtYmVyW10sIHVwZGF0ZXM6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBpbmRpY2VzOiBudW1iZXJbXVtdID0gW107XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIHVwZGF0ZSBpbmRpY2VzIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpbmRpY2VzIGZyb21cbiAgICAgKiBgc3RhcnRJbmRpY2VzYCB0byBgc3RhcnRJbmRpY2VzICsgdXBkYXRlcy5zaGFwZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5kaWNlcyhpZHg6IG51bWJlciwgY3VycjogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAgIGlmIChjdXJyLmxlbmd0aCA9PT0gc3RhcnRJbmRpY2VzLmxlbmd0aCkge1xuICAgICAgICBpbmRpY2VzLnB1c2goY3Vyci5zbGljZSgpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydEluZGljZXNbaWR4XTtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdXBkYXRlcy5zaGFwZVtpZHhdO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgY3Vyci5wdXNoKGkpO1xuICAgICAgICBjcmVhdGVJbmRpY2VzKGlkeCArIDEsIGN1cnIpO1xuICAgICAgICBjdXJyLnBvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVJbmRpY2VzKDAsIFtdKTtcbiAgICAvLyBGbGF0dGVuIHRoZSB1cGRhdGVzIHRvIG1hdGNoIGxlbmd0aCBvZiBpdHMgdXBkYXRlIGluZGljZXMuXG4gICAgdXBkYXRlcyA9IHVwZGF0ZXMucmVzaGFwZShbdXBkYXRlcy5zaXplXSk7XG4gICAgcmV0dXJuIHRlbnNvclNjYXR0ZXJVcGRhdGUoaW5wdXRzLCBpbmRpY2VzLCB1cGRhdGVzKTtcbiAgfSk7XG59XG4iXX0=
function packXYSampleWeight(x, y, sampleWeight) {
throw new NotImplementedError();
}
function unPackXYSampleWeight(data) {
throw new NotImplementedError();
}
// TODO(pforderique): Figure out a workaround for `tf.data.Dataset`.
function convertInputsToDataset(x, y, sampleWeight, batchSize) {
throw new NotImplementedError();
}
function trainValidationSplit(arrays, validationSplit) {
throw new NotImplementedError();
}
class PipelineModel extends LayersModel {
constructor(args) {
var _a;
super(args);
this.includePreprocessing = (_a = args.includePreprocessing) !== null && _a !== void 0 ? _a : true;
}
/**
* An overridable function which preprocesses features.
*/
preprocessFeatures(x) {
return x;
}
/**
* An overridable function which preprocesses labels.
*/
preprocessLabels(y) {
return y;
}
/**
* An overridable function which preprocesses entire samples.
*/
preprocessSamples(x, y, sampleWeight) {
throw new NotImplementedError();
}
// ---------------------------------------------------------------------------
// Below are overrides to LayersModel methods to apply the functions above.
// ---------------------------------------------------------------------------
fit(x, y, args = {}) {
throw new NotImplementedError(`Uses ${convertInputsToDataset}, ${trainValidationSplit} ` +
`${packXYSampleWeight}, and ${unPackXYSampleWeight}`);
}
evaluate(x, y, args) {
throw new NotImplementedError();
}
predict(x, args) {
throw new NotImplementedError();
}
trainOnBatch(x, y, sampleWeight) {
throw new NotImplementedError();
}
predictOnBatch(x) {
throw new NotImplementedError();
}
}
/** @nocollapse */
PipelineModel.className = 'PipelineModel';
export { PipelineModel };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25scC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXNDLG1CQUFtQixFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXRHLE9BQU8sRUFBRSxXQUFXLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRW5ELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUF5QixDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBZ0I7SUFDL0MsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLE1BQWMsRUFBRSxZQUFzQixFQUFFLE9BQWU7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxPQUFPLEdBQWUsRUFBRSxDQUFDO1FBQy9COzs7V0FHRztRQUNILFNBQVMsYUFBYSxDQUFDLEdBQVcsRUFBRSxJQUFjO1lBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFO2dCQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQixPQUFPO2FBQ1I7WUFDRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFH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Q29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7IE1vZGVsUHJlZGljdENvbmZpZywgU2NhbGFyLCBUZW5zb3IsIHRlbnNvclNjYXR0ZXJVcGRhdGUsIHRpZHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgeyBIaXN0b3J5IH0gZnJvbSAnLi4vLi4vYmFzZV9jYWxsYmFja3MnO1xuaW1wb3J0IHsgQ29udGFpbmVyQXJncyB9IGZyb20gJy4uLy4uL2VuZ2luZS9jb250YWluZXInO1xuaW1wb3J0IHsgTGF5ZXJzTW9kZWwsIE1vZGVsRXZhbHVhdGVBcmdzIH0gZnJvbSAnLi4vLi4vZW5naW5lL3RyYWluaW5nJztcbmltcG9ydCB7IE1vZGVsRml0QXJncyB9IGZyb20gJy4uLy4uL2VuZ2luZS90cmFpbmluZ190ZW5zb3JzJztcbmltcG9ydCB7IE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yVG9BcnIoaW5wdXQ6IFRlbnNvcik6IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGlucHV0LmRhdGFTeW5jKCkpIGFzIHVua25vd24gYXMgdW5rbm93bltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yQXJyVG8yREFycihpbnB1dHM6IFRlbnNvcltdKTogdW5rbm93bltdW10ge1xuICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiB0ZW5zb3JUb0FycihpbnB1dCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgVGVuc29yIHdpdGggYHVwZGF0ZXNgIGluc2VydGVkIGludG8gYGlucHV0c2Agc3RhcnRpbmcgYXQgdGhlXG4gKiBpbmRleCBgc3RhcnRJbmRpY2VzYC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRzIFRlbnNvciB0byBcIm1vZGlmeVwiXG4gKiBAcGFyYW0gc3RhcnRJbmRpY2VzIHRoZSBzdGFydGluZyBpbmRleCB0byBpbnNlcnQgdGhlIHNsaWNlLlxuICogIExlbmd0aCBtdXN0IGJlIGVxdWFsIHRvIGBpbnB1dHMucmFua2A7XG4gKiBAcGFyYW0gdXBkYXRlcyB0aGUgdXBkYXRlIHRlbnNvci4gU2hhcGUgbXVzdCBmaXQgd2l0aGluIGBpbnB1dHNgIHNoYXBlLlxuICogQHJldHVybnMgYSBuZXcgdGVuc29yIHdpdGggdGhlIG1vZGlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlVXBkYXRlKFxuICAgIGlucHV0czogVGVuc29yLCBzdGFydEluZGljZXM6IG51bWJlcltdLCB1cGRhdGVzOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW11bXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSB1cGRhdGUgaW5kaWNlcyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgaW5kaWNlcyBmcm9tXG4gICAgICogYHN0YXJ0SW5kaWNlc2AgdG8gYHN0YXJ0SW5kaWNlcyArIHVwZGF0ZXMuc2hhcGVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUluZGljZXMoaWR4OiBudW1iZXIsIGN1cnI6IG51bWJlcltdKTogdm9pZCB7XG4gICAgICBpZiAoY3Vyci5sZW5ndGggPT09IHN0YXJ0SW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgaW5kaWNlcy5wdXNoKGN1cnIuc2xpY2UoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRJbmRpY2VzW2lkeF07XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHVwZGF0ZXMuc2hhcGVbaWR4XTtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGN1cnIucHVzaChpKTtcbiAgICAgICAgY3JlYXRlSW5kaWNlcyhpZHggKyAxLCBjdXJyKTtcbiAgICAgICAgY3Vyci5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlSW5kaWNlcygwLCBbXSk7XG4gICAgLy8gRmxhdHRlbiB0aGUgdXBkYXRlcyB0byBtYXRjaCBsZW5ndGggb2YgaXRzIHVwZGF0ZSBpbmRpY2VzLlxuICAgIHVwZGF0ZXMgPSB1cGRhdGVzLnJlc2hhcGUoW3VwZGF0ZXMuc2l6ZV0pO1xuICAgIHJldHVybiB0ZW5zb3JTY2F0dGVyVXBkYXRlKGlucHV0cywgaW5kaWNlcywgdXBkYXRlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYWNrWFlTYW1wbGVXZWlnaHQoeDogVGVuc29yLCB5PzogVGVuc29yLCBzYW1wbGVXZWlnaHQ/OiBUZW5zb3IpOlxuICBUZW5zb3JcbiAgfCBbVGVuc29yLCBUZW5zb3JdXG4gIHwgW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gdW5QYWNrWFlTYW1wbGVXZWlnaHQoXG4gIGRhdGE6IFtUZW5zb3JdfFtUZW5zb3IsIFRlbnNvcl18W1RlbnNvciwgVGVuc29yLCBUZW5zb3JdXG4pIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuLy8gVE9ETyhwZm9yZGVyaXF1ZSk6IEZpZ3VyZSBvdXQgYSB3b3JrYXJvdW5kIGZvciBgdGYuZGF0YS5EYXRhc2V0YC5cbmZ1bmN0aW9uIGNvbnZlcnRJbnB1dHNUb0RhdGFzZXQoXG4gIHg/OiBUZW5zb3IsIHk/OiBUZW5zb3IsIHNhbXBsZVdlaWdodD86IFRlbnNvciwgYmF0Y2hTaXplPzogbnVtYmVyXG4pIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gdHJhaW5WYWxpZGF0aW9uU3BsaXQoYXJyYXlzOiBUZW5zb3JbXSwgdmFsaWRhdGlvblNwbGl0OiBudW1iZXIpIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuLyoqXG4gKiBBIG1vZGVsIHdoaWNoIGFsbG93cyBhdXRvbWF0aWNhbGx5IGFwcGx5aW5nIHByZXByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVNb2RlbEFyZ3MgZXh0ZW5kcyBDb250YWluZXJBcmdzIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBpbmNsdWRlUHJlcHJvY2Vzc2luZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQaXBlbGluZU1vZGVsIGV4dGVuZHMgTGF5ZXJzTW9kZWwge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGNsYXNzTmFtZSA9ICdQaXBlbGluZU1vZGVsJztcblxuICBwcm90ZWN0ZWQgaW5jbHVkZVByZXByb2Nlc3Npbmc6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXJnczogUGlwZWxpbmVNb2RlbEFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmluY2x1ZGVQcmVwcm9jZXNzaW5nID0gYXJncy5pbmNsdWRlUHJlcHJvY2Vzc2luZyA/PyB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIHdoaWNoIHByZXByb2Nlc3NlcyBmZWF0dXJlcy5cbiAgICovXG4gIHByZXByb2Nlc3NGZWF0dXJlcyh4OiBUZW5zb3IpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvdmVycmlkYWJsZSBmdW5jdGlvbiB3aGljaCBwcmVwcm9jZXNzZXMgbGFiZWxzLlxuICAgKi9cbiAgcHJlcHJvY2Vzc0xhYmVscyh5OiBUZW5zb3IpIHtcbiAgICByZXR1cm4geTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvdmVycmlkYWJsZSBmdW5jdGlvbiB3aGljaCBwcmVwcm9jZXNzZXMgZW50aXJlIHNhbXBsZXMuXG4gICAqL1xuICBwcmVwcm9jZXNzU2FtcGxlcyh4OiBUZW5zb3IsIHk/OiBUZW5zb3IsIHNhbXBsZVdlaWdodD86IFRlbnNvcik6XG4gICAgVGVuc29yXG4gICAgfCBbVGVuc29yLCBUZW5zb3JdXG4gICAgfCBbVGVuc29yLCBUZW5zb3IsIFRlbnNvcl0ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQmVsb3cgYXJlIG92ZXJyaWRlcyB0byBMYXllcnNNb2RlbCBtZXRob2RzIHRvIGFwcGx5IHRoZSBmdW5jdGlvbnMgYWJvdmUuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBvdmVycmlkZSBmaXQoXG4gICAgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHk6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSxcbiAgICBhcmdzOiBNb2RlbEZpdEFyZ3MgPSB7fVxuICApOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgIGBVc2VzICR7Y29udmVydElucHV0c1RvRGF0YXNldH0sICR7dHJhaW5WYWxpZGF0aW9uU3BsaXR9IGAgK1xuICAgICAgYCR7cGFja1hZU2FtcGxlV2VpZ2h0fSwgYW5kICR7dW5QYWNrWFlTYW1wbGVXZWlnaHR9YCk7XG4gIH1cblxuICBvdmVycmlkZSBldmFsdWF0ZShcbiAgICB4OiBUZW5zb3J8VGVuc29yW10sXG4gICAgeTogVGVuc29yfFRlbnNvcltdLFxuICAgIGFyZ3M/OiBNb2RlbEV2YWx1YXRlQXJnc1xuICApOiBTY2FsYXIgfCBTY2FsYXJbXSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHByZWRpY3QoXG4gICAgeDogVGVuc29yIHwgVGVuc29yW10sXG4gICAgYXJncz86IE1vZGVsUHJlZGljdENvbmZpZ1xuICApOiBUZW5zb3IgfCBUZW5zb3JbXSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYWluT25CYXRjaChcbiAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgeTogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHNhbXBsZVdlaWdodD86IFRlbnNvclxuICApOiBQcm9taXNlPG51bWJlcnxudW1iZXJbXT4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBvdmVycmlkZSBwcmVkaWN0T25CYXRjaCh4OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cbiJdfQ==

@@ -36,3 +36,3 @@ /**

*/
export declare function toList(x: any): any[];
export declare function toList<T>(x: T | T[]): T[];
/**

@@ -39,0 +39,0 @@ * Generate a UID for a list

@@ -517,2 +517,2 @@ /**

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY191dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9nZW5lcmljX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsNkNBQTZDO0FBRTdDLE9BQU8sRUFBaUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFckQsZ0JBQWdCO0FBRWhCOzs7R0FHRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtJQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsa0NBQWtDO1FBQ2xDLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDakI7U0FBTTtRQUNMLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFJLEtBQVUsRUFBRSxR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QyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNO2FBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFvQixDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZTogdXRpbHMvZ2VuZXJpY191dGlscy5weSAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBmdXNlZCwgc2VyaWFsaXphdGlvbiwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gdHNsaW50OmVuYWJsZVxuXG4vKipcbiAqIElmIGB2YWx1ZWAgaXMgYW4gQXJyYXksIGVxdWl2YWxlbnQgdG8gUHl0aG9uJ3MgYHZhbHVlICogbnVtVmFsdWVzYC5cbiAqIElmIGB2YWx1ZWAgaXMgbm90IGFuIEFycmF5LCBlcXVpdmFsZW50IHRvIFB5dGhvbidzIGBbdmFsdWVdICogbnVtVmFsdWVzYFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcHlMaXN0UmVwZWF0KHZhbHVlOiBhbnksIG51bVZhbHVlczogbnVtYmVyKTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbGV0IG5ld0FycmF5OiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkuY29uY2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KG51bVZhbHVlcyk7XG4gICAgbmV3QXJyYXkuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodmFsOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdmFsKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgYGFycmF5YCB0aGF0IGFyZSBlcXVhbCB0byBgcmVmZXJlbmNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50PFQ+KGFycmF5OiBUW10sIHJlZmVybmNlOiBUKSB7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgaWYgKGl0ZW0gPT09IHJlZmVybmNlKSB7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudGVyO1xufVxuXG4vKipcbiAqIElmIGFuIGFycmF5IGlzIG9mIGxlbmd0aCAxLCBqdXN0IHJldHVybiB0aGUgZmlyc3QgZWxlbWVudC4gT3RoZXJ3aXNlLCByZXR1cm5cbiAqIHRoZSBmdWxsIGFycmF5LlxuICogQHBhcmFtIHRlbnNvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbk9yQXJyYXk8VD4oeHM6IFRbXSk6IFR8VFtdIHtcbiAgaWYgKHhzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB4c1swXTtcbiAgfVxuICByZXR1cm4geHM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGxpc3QvdGVuc29yIGludG8gYSBsaXN0LlxuICpcbiAqIElmIGEgdGVuc29yIGlzIHBhc3NlZCwgd2UgcmV0dXJuXG4gKiBhIGxpc3Qgb2Ygc2l6ZSAxIGNvbnRhaW5pbmcgdGhlIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCB0YXJnZXQgb2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiB0b0xpc3QoeDogYW55KTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiB4O1xuICB9XG4gIHJldHVybiBbeF07XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBVSUQgZm9yIGEgbGlzdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TGlzdFVpZChvYmpzOiBhbnl8YW55W10pOiBzdHJpbmcge1xuICBjb25zdCBvYmplY3RMaXN0ID0gdG9MaXN0KG9ianMpO1xuICBsZXQgcmV0VmFsID0gJyc7XG4gIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdExpc3QpIHtcbiAgICBpZiAob2JqLmlkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBPYmplY3QgJHtvYmp9IHBhc3NlZCB0byBvYmplY3RMaXN0VWlkIHdpdGhvdXQgYW4gaWRgKTtcbiAgICB9XG4gICAgaWYgKHJldFZhbCAhPT0gJycpIHtcbiAgICAgIHJldFZhbCA9IHJldFZhbCArICcsICc7XG4gICAgfVxuICAgIHJldFZhbCA9IGAke3JldFZhbH0ke01hdGguYWJzKG9iai5pZCl9YDtcbiAgfVxuICByZXR1cm4gcmV0VmFsO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gc25ha2UtY2FzZS5cbiAqIEBwYXJhbSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnRlcm1lZGlhdGUgPSBuYW1lLnJlcGxhY2UoLyguKShbQS1aXVthLXowLTldKykvZywgJyQxXyQyJyk7XG4gIGNvbnN0IGluc2VjdXJlID1cbiAgICAgIGludGVybWVkaWF0ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xuICAvKlxuICAgSWYgdGhlIGNsYXNzIGlzIHByaXZhdGUgdGhlIG5hbWUgc3RhcnRzIHdpdGggXCJfXCIgd2hpY2ggaXMgbm90IHNlY3VyZVxuICAgZm9yIGNyZWF0aW5nIHNjb3Blcy4gV2UgcHJlZml4IHRoZSBuYW1lIHdpdGggXCJwcml2YXRlXCIgaW4gdGhpcyBjYXNlLlxuICAgKi9cbiAgaWYgKGluc2VjdXJlWzBdICE9PSAnXycpIHtcbiAgICByZXR1cm4gaW5zZWN1cmU7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJyArIGluc2VjdXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gcXVpY2sgcmV0dXJuIGZvciBlbXB0eSBzdHJpbmcgb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzXG4gIGlmIChpZGVudGlmaWVyLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIHRoZSB1bmRlcnNjb3JlIGluZGljYXRpbmcgc25ha2VfY2FzZVxuICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCdfJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZSgvW19dKyhcXHd8JCkvZywgKG0sIHAxKSA9PiBwMS50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVLZXJhc09iamVjdChpbnN0YW5jZTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSA9IHt9O1xuICBkaWN0WydjbGFzc05hbWUnXSA9IGluc3RhbmNlLmdldENsYXNzTmFtZSgpO1xuICBkaWN0Wydjb25maWcnXSA9IGluc3RhbmNlLmdldENvbmZpZygpO1xuICByZXR1cm4gZGljdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIG5kYXJyYXktc3R5bGUgc2NhbGFyIG9iamVjdHMgaW4gc2VyaWFsaXphdGlvbiBvYmplY3RzIHdpdGggbnVtYmVycy5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBJbiBzb21lIHZlcnNpb25zIG9mIHRmLmtlcmFzLCBjZXJ0YWluIHNjYWxhciB2YWx1ZXMgaW4gdGhlIEhERjVcbiAqIG1vZGVsIHNhdmUgZmlsZSBjYW4gYmUgc2VyaWFsaXplZCBhczogYHsndHlwZSc6ICduZGFycmF5JywgJ3ZhbHVlJzogbnVtfWAsXG4gKiB3aGVyZSBpbiBgbnVtYCBpcyBhIHBsYWluIG51bWJlci4gVGhpcyBtZXRob2QgY29udmVydHMgc3VjaCBzZXJpYWxpemF0aW9uXG4gKiB0byBhIGBudW1iZXJgLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGtlcmFzLWZvcm1hdCBzZXJpYWxpemF0aW9uIG9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAqICAgKGluIHBsYWNlKS5cbiAqL1xuZnVuY3Rpb24gY29udmVydE5EQXJyYXlTY2FsYXJzSW5Db25maWcoY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSk6XG4gICAgdm9pZCB7XG4gIGlmIChjb25maWcgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25maWcuZm9yRWFjaChjb25maWdJdGVtID0+IGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKGNvbmZpZ0l0ZW0pKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhjb25maWcpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1tmaWVsZF07XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3R5cGUnXSA9PT0gJ25kYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVbJ3ZhbHVlJ10gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnW2ZpZWxkXSA9IHZhbHVlWyd2YWx1ZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKHZhbHVlIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIHNhdmVkIEtlcmFzIE9iamVjdFxuICogQHBhcmFtIGlkZW50aWZpZXIgZWl0aGVyIGEgc3RyaW5nIElEIG9yIGEgc2F2ZWQgS2VyYXMgZGljdGlvbmFyeVxuICogQHBhcmFtIG1vZHVsZU9iamVjdHMgYSBsaXN0IG9mIFB5dGhvbiBjbGFzcyBuYW1lcyB0byBvYmplY3QgY29uc3RydWN0b3JzXG4gKiBAcGFyYW0gY3VzdG9tT2JqZWN0cyBhIGxpc3Qgb2YgUHl0aG9uIGNsYXNzIG5hbWVzIHRvIG9iamVjdCBjb25zdHJ1Y3RvcnNcbiAqIEBwYXJhbSBwcmludGFibGVNb2R1bGVOYW1lIGRlYnVnIHRleHQgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVjb25zdGl0dXRlZFxuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIGEgVGVuc29yRmxvdy5qcyBMYXllcnMgb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplS2VyYXNPYmplY3QoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nfHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBtb2R1bGVPYmplY3RzID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9LFxuICAgIGN1c3RvbU9iamVjdHMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX0sXG4gICAgcHJpbnRhYmxlTW9kdWxlTmFtZSA9ICdvYmplY3QnLCBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogYW55IHtcbiAgLy8gdHNsaW50OmVuYWJsZVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaWRlbnRpZmllcjtcbiAgICBsZXQgZm47XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSBpbiBjdXN0b21PYmplY3RzKSB7XG4gICAgICBmbiA9IGN1c3RvbU9iamVjdHNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSBpbiBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTKSB7XG4gICAgICBmbiA9IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4gPSBtb2R1bGVPYmplY3RzW2Z1bmN0aW9uTmFtZV07XG4gICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVbmtub3duICR7cHJpbnRhYmxlTW9kdWxlTmFtZX06ICR7aWRlbnRpZmllcn0uIGAgK1xuICAgICAgICAgICAgYFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbmAgK1xuICAgICAgICAgICAgYDEuIFRoZSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBgICtcbiAgICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICAgIGBjb2RlLlxcbmAgK1xuICAgICAgICAgICAgYDIuIFRoZSBjdXN0b20gJHtwcmludGFibGVNb2R1bGVOYW1lfSBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGAgK1xuICAgICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgICAgYHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLmApO1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbGluayB0byB0dXRvcmlhbCBwYWdlIG9uIGN1c3RvbSBsYXllcnMuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBhIEtlcmFzIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICAgIGNvbnN0IGNvbmZpZyA9IGlkZW50aWZpZXI7XG4gICAgaWYgKGNvbmZpZ1snY2xhc3NOYW1lJ10gPT0gbnVsbCB8fCBjb25maWdbJ2NvbmZpZyddID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiBJbXByb3BlciBjb25maWcgZm9ybWF0OiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfS5cXG5gICtcbiAgICAgICAgICBgJ2NsYXNzTmFtZScgYW5kICdjb25maWcnIG11c3Qgc2V0LmApO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBjb25maWdbJ2NsYXNzTmFtZSddIGFzIHN0cmluZztcbiAgICBsZXQgY2xzLCBmcm9tQ29uZmlnO1xuICAgIGlmIChjbGFzc05hbWUgaW4gY3VzdG9tT2JqZWN0cykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBjdXN0b21PYmplY3RzW2NsYXNzTmFtZV07XG4gICAgfSBlbHNlIGlmIChjbGFzc05hbWUgaW4gX0dMT0JBTF9DVVNUT01fT0JKRUNUUykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTWydjbGFzc05hbWUnXTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSBpbiBtb2R1bGVPYmplY3RzKSB7XG4gICAgICBbY2xzLCBmcm9tQ29uZmlnXSA9IG1vZHVsZU9iamVjdHNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgaWYgKGNscyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiAke2NsYXNzTmFtZX0uIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSBiZSBkdWUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG5gICtcbiAgICAgICAgICBgMS4gVGhlICR7cHJpbnRhYmxlTW9kdWxlTmFtZX0gaXMgZGVmaW5lZCBpbiBQeXRob24sIGluIHdoaWNoIGAgK1xuICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICBgY29kZS5cXG5gICtcbiAgICAgICAgICBgMi4gVGhlIGN1c3RvbSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gSmF2YVNjcmlwdCwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgIGB0Zi5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoKS5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsaW5rIHRvIHR1dG9yaWFsIHBhZ2Ugb24gY3VzdG9tIGxheWVycy5cbiAgICB9XG4gICAgaWYgKGZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgLy8gUG9ydGluZyBub3RlczogSW5zdGVhZCBvZiBjaGVja2luZyB0byBzZWUgd2hldGhlciBmcm9tQ29uZmlnIGFjY2VwdHNcbiAgICAgIC8vIGN1c3RvbU9iamVjdHMsIHdlIGNyZWF0ZSBhIGN1c3RvbU9iamVjdHMgZGljdGlvbmFyeSBhbmQgdGFjayBpdCBvbiB0b1xuICAgICAgLy8gY29uZmlnWydjb25maWcnXSBhcyBjb25maWdbJ2NvbmZpZyddLmN1c3RvbU9iamVjdHMuIE9iamVjdHMgY2FuIHVzZSBpdCxcbiAgICAgIC8vIGlmIHRoZXkgd2FudC5cblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgY29uc3QgY3VzdG9tT2JqZWN0c0NvbWJpbmVkID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoX0dMT0JBTF9DVVNUT01fT0JKRUNUUykpIHtcbiAgICAgICAgY3VzdG9tT2JqZWN0c0NvbWJpbmVkW2tleV0gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBjdXN0b21PYmplY3RzQ29tYmluZWRba2V5XSA9IGN1c3RvbU9iamVjdHNba2V5XTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgY3VzdG9tT2JqZWN0cyB0byBjb25maWdcbiAgICAgIGNvbnN0IG5lc3RlZENvbmZpZyA9IGNvbmZpZ1snY29uZmlnJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgICAgbmVzdGVkQ29uZmlnWydjdXN0b21PYmplY3RzJ10gPSBjdXN0b21PYmplY3RzQ29tYmluZWQ7XG5cbiAgICAgIGNvbnN0IGJhY2t1cEN1c3RvbU9iamVjdHMgPSB7Li4uX0dMT0JBTF9DVVNUT01fT0JKRUNUU307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV0gPSBjdXN0b21PYmplY3RzW2tleV07XG4gICAgICB9XG4gICAgICBjb252ZXJ0TkRBcnJheVNjYWxhcnNJbkNvbmZpZyhjb25maWdbJ2NvbmZpZyddKTtcbiAgICAgIGNvbnN0IHJldHVybk9iaiA9XG4gICAgICAgICAgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZ1snY29uZmlnJ10sIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KTtcbiAgICAgIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7Li4uYmFja3VwQ3VzdG9tT2JqZWN0c307XG5cbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gYGNsc2AgbWF5IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3MuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UgYnkgY29udmVudGlvbiBgY29uZmlnYCBob2xkc1xuICAgICAgLy8gdGhlIGt3YXJncyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICBjb25zdCBiYWNrdXBDdXN0b21PYmplY3RzID0gey4uLl9HTE9CQUxfQ1VTVE9NX09CSkVDVFN9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VzdG9tT2JqZWN0cykpIHtcbiAgICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUU1trZXldID0gY3VzdG9tT2JqZWN0c1trZXldO1xuICAgICAgfVxuICAgICAgLy8gSW4gcHl0aG9uIHRoaXMgaXMgKipjb25maWdbJ2NvbmZpZyddLCBmb3IgdGZqcy1sYXllcnMgd2UgcmVxdWlyZVxuICAgICAgLy8gY2xhc3NlcyB0aGF0IHVzZSB0aGlzIGZhbGwtdGhyb3VnaCBjb25zdHJ1Y3Rpb24gbWV0aG9kIHRvIHRha2VcbiAgICAgIC8vIGEgY29uZmlnIGludGVyZmFjZSB0aGF0IG1pbWljcyB0aGUgZXhwYW5zaW9uIG9mIG5hbWVkIHBhcmFtZXRlcnMuXG4gICAgICBjb25zdCByZXR1cm5PYmogPSBuZXcgY2xzKGNvbmZpZ1snY29uZmlnJ10pO1xuICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUUyA9IHsuLi5iYWNrdXBDdXN0b21PYmplY3RzfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG51bWJlcnMgZm9yIHNvcnRpbmcuXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb24gb2YgdHdvIG51bWJlcnMgZm9yIHJldmVyc2Ugc29ydGluZy5cbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZU51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIC0xICogbnVtYmVyQ29tcGFyZShhLCBiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgRFR5cGUuXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIERUeXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9EVHlwZShkdHlwZTogc3RyaW5nKTogRGF0YVR5cGUge1xuICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBkdHlwZTogJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3QgdGhlIGVsZW1lbnQtYnktZWxlbWVudCBlcXVhbGl0eSBvZiB0d28gQXJyYXlzIG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0geHMgRmlyc3QgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB5cyBTZWNvbmQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEByZXR1cm5zIFdldGhlciB0aGUgdHdvIGFycmF5cyBhcmUgYWxsIGVxdWFsLCBlbGVtZW50IGJ5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdzRXF1YWwoeHM6IHN0cmluZ1tdLCB5czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKHhzID09IG51bGwgfHwgeXMgPT0gbnVsbCkge1xuICAgIHJldHVybiB4cyA9PT0geXM7XG4gIH1cbiAgaWYgKHhzLmxlbmd0aCAhPT0geXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoeHNbaV0gIT09IHlzW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pcXVlIGVsZW1lbnRzIG9mIGFuIGFycmF5LlxuICogQHBhcmFtIHhzIEFycmF5LlxuICogQHJldHVybnMgQW4gQXJyYXkgY29uc2lzdGluZyBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGluIGB4c2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oeHM6IFRbXSk6IFRbXSB7XG4gIGlmICh4cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHhzO1xuICB9XG4gIGNvbnN0IG91dDogVFtdID0gW107XG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc29ydGluZy5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKG91dC5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgb3V0LnB1c2goeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIE9iamVjdCBpcyBlbXB0eSAoaS5lLiwgZG9lcyBub3QgaGF2ZSBvd24gcHJvcGVydGllcykuXG4gKiBAcGFyYW0gb2JqIE9iamVjdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgT2JqZWN0IGlzIGVtcHR5LlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBvYmplY3QgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmo6IHt9KTogYm9vbGVhbiB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHZhbHVlIGluIG9iajogJHtKU09OLnN0cmluZ2lmeShvYmopfWApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBidWlsZCB0eXBlIHVuaW9uL2VudW0gcnVuLXRpbWUgY2hlY2tlcnMuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxhYmVsIEEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdmFsdWVzIG5vciBgdW5kZWZpbmVkYC9gbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgIHZhbHVlczogc3RyaW5nW10sIGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgJHtsYWJlbH0uICBWYWxpZCB2YWx1ZXMgYXJlICR7XG4gICAgICAgIHZhbHVlc30gb3IgbnVsbC91bmRlZmluZWQuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHZlcmlmeWluZyB0aGUgdHlwZXMgb2YgaW5wdXRzLlxuICpcbiAqIEVuc3VyZXMgdGhhdCB0aGUgZWxlbWVudHMgb2YgYHhgIGFyZSBhbGwgb2YgdHlwZSBgZXhwZWN0ZWRUeXBlYC5cbiAqIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIGB4YCBpcyB3aXRoaW4gYm91bmRzLlxuICpcbiAqIEBwYXJhbSB4IE9iamVjdCB0byB0ZXN0LlxuICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgc3RyaW5nIGV4cGVjdGVkIHR5cGUgb2YgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGVcbiAqIEFycmF5LlxuICogQHBhcmFtIG1pbkxlbmd0aCBSZXR1cm4gZmFsc2UgaWYgeC5sZW5ndGggaXMgbGVzcyB0aGFuIHRoaXMuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFJldHVybiBmYWxzZSBpZiB4Lmxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhpcy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYHhgIGlzIGFuIGBBcnJheTxleHBlY3RlZFR5cGU+YCB3aXRoXG4gKiBsZW5ndGggPj0gYG1pbkxlbmd0aGAgYW5kIDw9IGBtYXhMZW5ndGhgLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICB4OiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBtaW5MZW5ndGggPSAwLFxuICAgIG1heExlbmd0aCA9IEluZmluaXR5KTogYm9vbGVhbiB7XG4gIGFzc2VydChtaW5MZW5ndGggPj0gMCk7XG4gIGFzc2VydChtYXhMZW5ndGggPj0gbWluTGVuZ3RoKTtcbiAgcmV0dXJuIChcbiAgICAgIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5sZW5ndGggPj0gbWluTGVuZ3RoICYmIHgubGVuZ3RoIDw9IG1heExlbmd0aCAmJlxuICAgICAgeC5ldmVyeShlID0+IHR5cGVvZiBlID09PSBleHBlY3RlZFR5cGUpKTtcbn1cbi8vIHRzbGludDplbmFibGU6bm8tYW55XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZSBhcmUgcG9zaXRpdmUgaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGJlaW5nIGFzc2VydGVkIG9uLiBNYXkgYmUgYSBzaW5nbGUgbnVtYmVyIG9yIGFuIGFycmF5XG4gKiAgIG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YWx1ZSwgdXNlZCB0byBtYWtlIHRoZSBlcnJvciBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG5hbWU6IHN0cmluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gMCwgKCkgPT4gYCR7bmFtZX0gaXMgdW5leHBlY3RlZGx5IGFuIGVtcHR5IGFycmF5LmApO1xuICAgIHZhbHVlLmZvckVhY2goXG4gICAgICAgICh2LCBpKSA9PiBhc3NlcnRQb3NpdGl2ZUludGVnZXIodiwgYGVsZW1lbnQgJHtpICsgMX0gb2YgJHtuYW1lfWApKTtcbiAgfSBlbHNlIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwLFxuICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSB2YWx1ZSBpbnRvIGEgZGlzcGxheS1mcmllbmRseSwgaHVtYW4tcmVhZGFibGUgZmFzaGlvbi5cbiAqXG4gKiAtIGBudWxsYCBpcyBmb3JtYXR0ZWQgYXMgYCdudWxsJ2BcbiAqIC0gU3RyaW5ncyBhcmUgZm9ybWF0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHF1b3Rlcy5cbiAqIC0gQXJyYXlzIGFyZSBmb3JtYXR0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGRpc3BsYXkuXG4gKiBAcmV0dXJuIEZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbJyArIHZhbHVlLm1hcCh2ID0+IGZvcm1hdEFzRnJpZW5kbHlTdHJpbmcodikpLmpvaW4oJywnKSArICddJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGBmMmAgKGRlY29yYXRvcikgd2hpY2ggd3JhcHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBgZmAuIGBmMmAgZ3VhcmFudGVlcyB0aGF0IGBmYCBjYW4gYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogZXZlcnkgYHdhaXRNc2AgbXMuIElmIGBmMmAgaXMgY2FsbGVkIG1vcmUgb2Z0ZW4sIGl0IHdpbGwgcmV0dXJuXG4gKiB0aGUgbGFzdCByZXR1cm5lZCByZXN1bHQgb2YgYGZgLlxuICpcbiAqIEBwYXJhbSBmIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgZmAgdG8gd3JhcC5cbiAqIEBwYXJhbSB3YWl0TXMgVGhlIHRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gYGZgIGluIG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VD4oXG4gICAgZjogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCwgd2FpdE1zOiBudW1iZXIsXG4gICAgbm93RnVuYz86IEZ1bmN0aW9uKTogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCB7XG4gIGxldCBsYXN0VGltZSA9IG5vd0Z1bmMgIT0gbnVsbCA/IG5vd0Z1bmMoKSA6IHV0aWwubm93KCk7XG4gIGxldCBsYXN0UmVzdWx0OiBUO1xuICBjb25zdCBmMiA9ICguLi5hcmdzOiBBcnJheTx7fT4pID0+IHtcbiAgICBjb25zdCBub3cgPSBub3dGdW5jICE9IG51bGwgPyBub3dGdW5jKCkgOiB1dGlsLm5vdygpO1xuICAgIGlmIChub3cgLSBsYXN0VGltZSA8IHdhaXRNcykge1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuICAgIGxhc3RUaW1lID0gbm93O1xuICAgIGxhc3RSZXN1bHQgPSBmKC4uLmFyZ3MpO1xuICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICB9O1xuICByZXR1cm4gZjI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVzYWJsZSBhY3RpdmF0aW9uIGdpdmVuIGEgbGF5ZXJzIGlkZW50aWZpZXIuXG4gKlxuICogQHBhcmFtIGFjdGl2YXRpb25OYW1lIFRoZSBsYXllcnMgaWRlbnRpZmllciBzdHJpbmcuXG4gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBmdXNhYmxlIGFjdGl2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbChhY3RpdmF0aW9uTmFtZTogc3RyaW5nKTpcbiAgICBmdXNlZC5BY3RpdmF0aW9uIHtcbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gJ3JlbHUnO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uTmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICByZXR1cm4gJ2xpbmVhcic7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAnZWx1Jykge1xuICAgIHJldHVybiAnZWx1JztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudHlwZSBQb3NzaWJsZVZhbHVlcyA9IEFycmF5PEFycmF5PGJvb2xlYW58c3RyaW5nfG51bWJlcj4+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHNldHMgb2YgdmFsdWVzLlxuICogVGhpcyB3b3JrcyB0aGUgc2FtZSBhcyBpdGVydG9vbHMucHJvZHVjdCBpbiBQeXRob24uXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBmaWx0ZXJzID0gWzEyOCwgMjU2LCA1MTJdXG4gKiBwYWRkaW5ncyA9IFsnc2FtZScsICd2YWxpZCddXG4gKlxuICogcHJvZHVjdCA9IFsgWzEyOCwgJ3NhbWUnXSwgWzEyOCwgJ3ZhbGlkJ10sIFsyNTYsICdzYW1lJ10sIFsyNTYsICd2YWxpZCddLFxuICogWzUxMiwgJ3NhbWUnXSwgWzUxMiwgJ3ZhbGlkJ11dXG4gKlxuICogQHBhcmFtIGFycmF5T2ZWYWx1ZXMgTGlzdC9hcnJheSBvZiB2YWx1ZXMuXG4gKiBAcmV0dXJuIFRoZSBjYXJ0ZXNpYW4gcHJvZHVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcnRlc2lhblByb2R1Y3RPZlZhbHVlcyguLi5hcnJheU9mVmFsdWVzOiBQb3NzaWJsZVZhbHVlcyk6XG4gICAgUG9zc2libGVWYWx1ZXMge1xuICBhc3NlcnQoYXJyYXlPZlZhbHVlcy5sZW5ndGggPiAwLCAnYXJyYXlPZlZhbHVlcyBpcyBlbXB0eScpO1xuXG4gIGZvciAoY29uc3QgdmFsdWVzIG9mIGFycmF5T2ZWYWx1ZXMpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZXMpLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgYXNzZXJ0KHZhbHVlcy5sZW5ndGggPiAwLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgZW1wdHknKTtcbiAgfVxuXG4gIHJldHVybiBhcnJheU9mVmFsdWVzLnJlZHVjZSgocHJvZHVjdHMsIHZhbHVlcykgPT4ge1xuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IFt2YWx1ZV0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgICAgLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb2R1Y3RzLm1hcCgocHJldlZhbHVlKSA9PiBbLi4ucHJldlZhbHVlLCB2YWx1ZV0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0dGVuZWRQcm9kdWN0LCB1bmZsYXR0ZW5lZFByb2R1Y3QpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmxhdHRlbmVkUHJvZHVjdC5jb25jYXQodW5mbGF0dGVuZWRQcm9kdWN0KTtcbiAgICAgICAgfSwgW10pO1xuICB9LCBbXSBhcyBQb3NzaWJsZVZhbHVlcyk7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY191dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9nZW5lcmljX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsNkNBQTZDO0FBRTdDLE9BQU8sRUFBaUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFckQsZ0JBQWdCO0FBRWhCOzs7R0FHRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtJQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsa0NBQWtDO1FBQ2xDLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDakI7U0FBTTtRQUNMLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFJLEtBQVUsRUFBRSxRQUFXO0lBQzlDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtRQUN4QixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDckIsT0FBTyxFQUFFLENBQUM7U0FDWDtLQUNGO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksRUFBTztJQUN6QyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxNQUFNLENBQUksQ0FBUTtJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLENBQUM7S0FDVjtJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWU7SUFDM0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTtRQUM1QixJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLFVBQVUsR0FBRyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxNQUFNLEtBQUssRUFBRSxFQUFFO1lBQ2pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDekM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBQ0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFZO0lBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsTUFBTSxRQUFRLEdBQ1YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuRTs7O09BR0c7SUFDSCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFDRCxPQUFPLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDOUIsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsVUFBa0I7SUFDNUMsNERBQTREO0lBQzVELElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDMUIsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFDRCxpREFBaUQ7SUFDakQsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2xDLE9BQU8sVUFBVSxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxrQ0FBa0M7QUFDbEMsSUFBSSxzQkFBc0IsR0FBRyxFQUE4QixDQUFDO0FBRTVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFvQztJQUV2RSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUMvQyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsTUFBTSxJQUFJLEdBQWtDLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsNkJBQTZCLENBQUMsTUFBcUM7SUFFMUUsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUNoRCxPQUFPO0tBQ1I7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7S0FDekU7U0FBTTtRQUNMLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTO29CQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2hDO3FCQUFNO29CQUNMLDZCQUE2QixDQUFDLEtBQWlDLENBQUMsQ0FBQztpQkFDbEU7YUFDRjtTQUNGO0tBQ0Y7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCx3QkFBd0I7QUFDeEIsTUFBTSxVQUFVLHNCQUFzQixDQUNsQyxVQUEyQyxFQUMzQyxnQkFBZ0IsRUFBOEIsRUFDOUMsZ0JBQWdCLEVBQThCLEVBQzlDLG1CQUFtQixHQUFHLFFBQVEsRUFBRSxjQUFjLEdBQUcsS0FBSztJQUN4RCxnQkFBZ0I7SUFDaEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDbEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQ2hDLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxZQUFZLElBQUksYUFBYSxFQUFFO1lBQ2pDLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDbEM7YUFBTSxJQUFJLFlBQVksSUFBSSxzQkFBc0IsRUFBRTtZQUNqRCxFQUFFLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNMLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNkLE1BQU0sSUFBSSxVQUFVLENBQ2hCLFdBQVcsbUJBQW1CLEtBQUssVUFBVSxJQUFJO29CQUNqRCxvREFBb0Q7b0JBQ3BELFVBQVUsbUJBQW1CLGtDQUFrQztvQkFDL0QsaUVBQWlFO29CQUNqRSxTQUFTO29CQUNULGlCQUFpQixtQkFBbUIsNkJBQTZCO29CQUNqRSxzQ0FBc0M7b0JBQ3RDLG1DQUFtQyxDQUFDLENBQUM7Z0JBQ3pDLDBEQUEwRDthQUMzRDtTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7S0FDWDtTQUFNO1FBQ0wsOERBQThEO1FBQzlELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUMxQixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUMzRCxNQUFNLElBQUksVUFBVSxDQUNoQixHQUFHLG1CQUFtQiw0QkFBNEI7Z0JBQ2xELEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDOUIsb0NBQW9DLENBQUMsQ0FBQztTQUMzQztRQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQVcsQ0FBQztRQUNoRCxJQUFJLEdBQUcsRUFBRSxVQUFVLENBQUM7UUFDcEIsSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFO1lBQzlCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM5QzthQUFNLElBQUksU0FBUyxJQUFJLHNCQUFzQixFQUFFO1lBQzlDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pEO2FBQU0sSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFO1lBQ3JDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM5QztRQUNELElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNmLE1BQU0sSUFBSSxVQUFVLENBQ2hCLFdBQVcsbUJBQW1CLEtBQUssU0FBUyxJQUFJO2dCQUNoRCxvREFBb0Q7Z0JBQ3BELFVBQVUsbUJBQW1CLGtDQUFrQztnQkFDL0QsaUVBQWlFO2dCQUNqRSxTQUFTO2dCQUNULGlCQUFpQixtQkFBbUIsNkJBQTZCO2dCQUNqRSxzQ0FBc0M7Z0JBQ3RDLG1DQUFtQyxDQUFDLENBQUM7WUFDekMsMERBQTBEO1NBQzNEO1FBQ0QsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1lBQ3RCLHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLGdCQUFnQjtZQUVoQixrQ0FBa0M7WUFDbEMsTUFBTSxxQkFBcUIsR0FBRyxFQUE4QixDQUFDO1lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2dCQUNyRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMxRDtZQUNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDNUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0Qsa0NBQWtDO1lBQ2xDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQTZCLENBQUM7WUFDbEUsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1lBRXRELE1BQU0sbUJBQW1CLHFCQUFPLHNCQUFzQixDQUFDLENBQUM7WUFDeEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUM1QyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEQ7WUFDRCw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLFNBQVMsR0FDWCxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDckUsc0JBQXNCLHFCQUFPLG1CQUFtQixDQUFDLENBQUM7WUFFbEQsT0FBTyxTQUFTLENBQUM7U0FDbEI7YUFBTTtZQUNMLGtEQUFrRDtZQUNsRCw0Q0FBNEM7WUFDNUMsOEJBQThCO1lBQzlCLE1BQU0sbUJBQW1CLHFCQUFPLHNCQUFzQixDQUFDLENBQUM7WUFDeEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUM1QyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEQ7WUFDRCxtRUFBbUU7WUFDbkUsaUVBQWlFO1lBQ2pFLG9FQUFvRTtZQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxzQkFBc0IscUJBQU8sbUJBQW1CLENBQUMsQ0FBQztZQUNsRCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtLQUNGO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ2hELE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYTtJQUN6QyxRQUFRLEtBQUssRUFBRTtRQUNiLEtBQUssU0FBUztZQUNaLE9BQU8sU0FBUyxDQUFDO1FBQ25CO1lBQ0UsTUFBTSxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRDtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsRUFBWSxFQUFFLEVBQVk7SUFDckQsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0tBQ2xCO0lBQ0QsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUU7UUFDM0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBSSxFQUFPO0lBQy9CLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtRQUNkLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7SUFDcEIsb0RBQW9EO0lBQ3BELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFPO0lBQ25DLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtRQUNmLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3RFO0lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUU7UUFDckIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDckMsTUFBZ0IsRUFBRSxLQUFhLEVBQUUsS0FBYTtJQUNoRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsT0FBTztLQUNSO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsS0FBSyx1QkFDakQsTUFBTSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ2xDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBd0I7QUFDeEIsTUFBTSxVQUFVLHVCQUF1QixDQUNuQyxDQUFNLEVBQUUsWUFBb0IsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUMzQyxTQUFTLEdBQUcsUUFBUTtJQUN0QixNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTO1FBQ2xFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFDRCx1QkFBdUI7QUFFdkI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXNCLEVBQUUsSUFBWTtJQUN4RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksa0NBQWtDLENBQUMsQ0FBQztRQUN2RSxLQUFLLENBQUMsT0FBTyxDQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDeEU7U0FBTTtRQUNMLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLElBQUkscUNBQXFDO1lBQ3ZELEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzlDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsS0FBVTtJQUMvQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDbEIsT0FBTyxNQUFNLENBQUM7S0FDZjtTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMvQixPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ3hFO1NBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDcEMsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO0tBQ3JCO1NBQU07UUFDTCxPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUM7S0FDbkI7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUE0QixFQUFFLE1BQWMsRUFDNUMsT0FBa0I7SUFDcEIsSUFBSSxRQUFRLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4RCxJQUFJLFVBQWEsQ0FBQztJQUNsQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBZSxFQUFFLEVBQUU7UUFDaEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxJQUFJLEdBQUcsR0FBRyxRQUFRLEdBQUcsTUFBTSxFQUFFO1lBQzNCLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNmLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFDRixPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxjQUFzQjtJQUUvRCxJQUFJLGNBQWMsS0FBSyxNQUFNLEVBQUU7UUFDN0IsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUNELElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRTtRQUMvQixPQUFPLFFBQVEsQ0FBQztLQUNqQjtJQUNELElBQUksY0FBYyxLQUFLLEtBQUssRUFBRTtRQUM1QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBSUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsR0FBRyxhQUE2QjtJQUUxRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUUzRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRTtRQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQy9DLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNO2FBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFvQixDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZTogdXRpbHMvZ2VuZXJpY191dGlscy5weSAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBmdXNlZCwgc2VyaWFsaXphdGlvbiwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gdHNsaW50OmVuYWJsZVxuXG4vKipcbiAqIElmIGB2YWx1ZWAgaXMgYW4gQXJyYXksIGVxdWl2YWxlbnQgdG8gUHl0aG9uJ3MgYHZhbHVlICogbnVtVmFsdWVzYC5cbiAqIElmIGB2YWx1ZWAgaXMgbm90IGFuIEFycmF5LCBlcXVpdmFsZW50IHRvIFB5dGhvbidzIGBbdmFsdWVdICogbnVtVmFsdWVzYFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcHlMaXN0UmVwZWF0KHZhbHVlOiBhbnksIG51bVZhbHVlczogbnVtYmVyKTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbGV0IG5ld0FycmF5OiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkuY29uY2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KG51bVZhbHVlcyk7XG4gICAgbmV3QXJyYXkuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodmFsOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdmFsKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgYGFycmF5YCB0aGF0IGFyZSBlcXVhbCB0byBgcmVmZXJlbmNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50PFQ+KGFycmF5OiBUW10sIHJlZmVybmNlOiBUKSB7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgaWYgKGl0ZW0gPT09IHJlZmVybmNlKSB7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudGVyO1xufVxuXG4vKipcbiAqIElmIGFuIGFycmF5IGlzIG9mIGxlbmd0aCAxLCBqdXN0IHJldHVybiB0aGUgZmlyc3QgZWxlbWVudC4gT3RoZXJ3aXNlLCByZXR1cm5cbiAqIHRoZSBmdWxsIGFycmF5LlxuICogQHBhcmFtIHRlbnNvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbk9yQXJyYXk8VD4oeHM6IFRbXSk6IFR8VFtdIHtcbiAgaWYgKHhzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB4c1swXTtcbiAgfVxuICByZXR1cm4geHM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGxpc3QvdGVuc29yIGludG8gYSBsaXN0LlxuICpcbiAqIElmIGEgdGVuc29yIGlzIHBhc3NlZCwgd2UgcmV0dXJuXG4gKiBhIGxpc3Qgb2Ygc2l6ZSAxIGNvbnRhaW5pbmcgdGhlIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCB0YXJnZXQgb2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiB0b0xpc3Q8VD4oeDogVHxUW10pOiBUW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiB4O1xuICB9XG4gIHJldHVybiBbeF07XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBVSUQgZm9yIGEgbGlzdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TGlzdFVpZChvYmpzOiBhbnl8YW55W10pOiBzdHJpbmcge1xuICBjb25zdCBvYmplY3RMaXN0ID0gdG9MaXN0KG9ianMpO1xuICBsZXQgcmV0VmFsID0gJyc7XG4gIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdExpc3QpIHtcbiAgICBpZiAob2JqLmlkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBPYmplY3QgJHtvYmp9IHBhc3NlZCB0byBvYmplY3RMaXN0VWlkIHdpdGhvdXQgYW4gaWRgKTtcbiAgICB9XG4gICAgaWYgKHJldFZhbCAhPT0gJycpIHtcbiAgICAgIHJldFZhbCA9IHJldFZhbCArICcsICc7XG4gICAgfVxuICAgIHJldFZhbCA9IGAke3JldFZhbH0ke01hdGguYWJzKG9iai5pZCl9YDtcbiAgfVxuICByZXR1cm4gcmV0VmFsO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gc25ha2UtY2FzZS5cbiAqIEBwYXJhbSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnRlcm1lZGlhdGUgPSBuYW1lLnJlcGxhY2UoLyguKShbQS1aXVthLXowLTldKykvZywgJyQxXyQyJyk7XG4gIGNvbnN0IGluc2VjdXJlID1cbiAgICAgIGludGVybWVkaWF0ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xuICAvKlxuICAgSWYgdGhlIGNsYXNzIGlzIHByaXZhdGUgdGhlIG5hbWUgc3RhcnRzIHdpdGggXCJfXCIgd2hpY2ggaXMgbm90IHNlY3VyZVxuICAgZm9yIGNyZWF0aW5nIHNjb3Blcy4gV2UgcHJlZml4IHRoZSBuYW1lIHdpdGggXCJwcml2YXRlXCIgaW4gdGhpcyBjYXNlLlxuICAgKi9cbiAgaWYgKGluc2VjdXJlWzBdICE9PSAnXycpIHtcbiAgICByZXR1cm4gaW5zZWN1cmU7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJyArIGluc2VjdXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gcXVpY2sgcmV0dXJuIGZvciBlbXB0eSBzdHJpbmcgb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzXG4gIGlmIChpZGVudGlmaWVyLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIHRoZSB1bmRlcnNjb3JlIGluZGljYXRpbmcgc25ha2VfY2FzZVxuICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCdfJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZSgvW19dKyhcXHd8JCkvZywgKG0sIHAxKSA9PiBwMS50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVLZXJhc09iamVjdChpbnN0YW5jZTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSA9IHt9O1xuICBkaWN0WydjbGFzc05hbWUnXSA9IGluc3RhbmNlLmdldENsYXNzTmFtZSgpO1xuICBkaWN0Wydjb25maWcnXSA9IGluc3RhbmNlLmdldENvbmZpZygpO1xuICByZXR1cm4gZGljdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIG5kYXJyYXktc3R5bGUgc2NhbGFyIG9iamVjdHMgaW4gc2VyaWFsaXphdGlvbiBvYmplY3RzIHdpdGggbnVtYmVycy5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBJbiBzb21lIHZlcnNpb25zIG9mIHRmLmtlcmFzLCBjZXJ0YWluIHNjYWxhciB2YWx1ZXMgaW4gdGhlIEhERjVcbiAqIG1vZGVsIHNhdmUgZmlsZSBjYW4gYmUgc2VyaWFsaXplZCBhczogYHsndHlwZSc6ICduZGFycmF5JywgJ3ZhbHVlJzogbnVtfWAsXG4gKiB3aGVyZSBpbiBgbnVtYCBpcyBhIHBsYWluIG51bWJlci4gVGhpcyBtZXRob2QgY29udmVydHMgc3VjaCBzZXJpYWxpemF0aW9uXG4gKiB0byBhIGBudW1iZXJgLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGtlcmFzLWZvcm1hdCBzZXJpYWxpemF0aW9uIG9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAqICAgKGluIHBsYWNlKS5cbiAqL1xuZnVuY3Rpb24gY29udmVydE5EQXJyYXlTY2FsYXJzSW5Db25maWcoY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSk6XG4gICAgdm9pZCB7XG4gIGlmIChjb25maWcgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25maWcuZm9yRWFjaChjb25maWdJdGVtID0+IGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKGNvbmZpZ0l0ZW0pKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhjb25maWcpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1tmaWVsZF07XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3R5cGUnXSA9PT0gJ25kYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVbJ3ZhbHVlJ10gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnW2ZpZWxkXSA9IHZhbHVlWyd2YWx1ZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKHZhbHVlIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIHNhdmVkIEtlcmFzIE9iamVjdFxuICogQHBhcmFtIGlkZW50aWZpZXIgZWl0aGVyIGEgc3RyaW5nIElEIG9yIGEgc2F2ZWQgS2VyYXMgZGljdGlvbmFyeVxuICogQHBhcmFtIG1vZHVsZU9iamVjdHMgYSBsaXN0IG9mIFB5dGhvbiBjbGFzcyBuYW1lcyB0byBvYmplY3QgY29uc3RydWN0b3JzXG4gKiBAcGFyYW0gY3VzdG9tT2JqZWN0cyBhIGxpc3Qgb2YgUHl0aG9uIGNsYXNzIG5hbWVzIHRvIG9iamVjdCBjb25zdHJ1Y3RvcnNcbiAqIEBwYXJhbSBwcmludGFibGVNb2R1bGVOYW1lIGRlYnVnIHRleHQgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVjb25zdGl0dXRlZFxuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIGEgVGVuc29yRmxvdy5qcyBMYXllcnMgb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplS2VyYXNPYmplY3QoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nfHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBtb2R1bGVPYmplY3RzID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9LFxuICAgIGN1c3RvbU9iamVjdHMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX0sXG4gICAgcHJpbnRhYmxlTW9kdWxlTmFtZSA9ICdvYmplY3QnLCBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogYW55IHtcbiAgLy8gdHNsaW50OmVuYWJsZVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaWRlbnRpZmllcjtcbiAgICBsZXQgZm47XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSBpbiBjdXN0b21PYmplY3RzKSB7XG4gICAgICBmbiA9IGN1c3RvbU9iamVjdHNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSBpbiBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTKSB7XG4gICAgICBmbiA9IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4gPSBtb2R1bGVPYmplY3RzW2Z1bmN0aW9uTmFtZV07XG4gICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVbmtub3duICR7cHJpbnRhYmxlTW9kdWxlTmFtZX06ICR7aWRlbnRpZmllcn0uIGAgK1xuICAgICAgICAgICAgYFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbmAgK1xuICAgICAgICAgICAgYDEuIFRoZSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBgICtcbiAgICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICAgIGBjb2RlLlxcbmAgK1xuICAgICAgICAgICAgYDIuIFRoZSBjdXN0b20gJHtwcmludGFibGVNb2R1bGVOYW1lfSBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGAgK1xuICAgICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgICAgYHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLmApO1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbGluayB0byB0dXRvcmlhbCBwYWdlIG9uIGN1c3RvbSBsYXllcnMuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBhIEtlcmFzIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICAgIGNvbnN0IGNvbmZpZyA9IGlkZW50aWZpZXI7XG4gICAgaWYgKGNvbmZpZ1snY2xhc3NOYW1lJ10gPT0gbnVsbCB8fCBjb25maWdbJ2NvbmZpZyddID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiBJbXByb3BlciBjb25maWcgZm9ybWF0OiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfS5cXG5gICtcbiAgICAgICAgICBgJ2NsYXNzTmFtZScgYW5kICdjb25maWcnIG11c3Qgc2V0LmApO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBjb25maWdbJ2NsYXNzTmFtZSddIGFzIHN0cmluZztcbiAgICBsZXQgY2xzLCBmcm9tQ29uZmlnO1xuICAgIGlmIChjbGFzc05hbWUgaW4gY3VzdG9tT2JqZWN0cykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBjdXN0b21PYmplY3RzW2NsYXNzTmFtZV07XG4gICAgfSBlbHNlIGlmIChjbGFzc05hbWUgaW4gX0dMT0JBTF9DVVNUT01fT0JKRUNUUykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTWydjbGFzc05hbWUnXTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSBpbiBtb2R1bGVPYmplY3RzKSB7XG4gICAgICBbY2xzLCBmcm9tQ29uZmlnXSA9IG1vZHVsZU9iamVjdHNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgaWYgKGNscyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiAke2NsYXNzTmFtZX0uIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSBiZSBkdWUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG5gICtcbiAgICAgICAgICBgMS4gVGhlICR7cHJpbnRhYmxlTW9kdWxlTmFtZX0gaXMgZGVmaW5lZCBpbiBQeXRob24sIGluIHdoaWNoIGAgK1xuICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICBgY29kZS5cXG5gICtcbiAgICAgICAgICBgMi4gVGhlIGN1c3RvbSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gSmF2YVNjcmlwdCwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgIGB0Zi5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoKS5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsaW5rIHRvIHR1dG9yaWFsIHBhZ2Ugb24gY3VzdG9tIGxheWVycy5cbiAgICB9XG4gICAgaWYgKGZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgLy8gUG9ydGluZyBub3RlczogSW5zdGVhZCBvZiBjaGVja2luZyB0byBzZWUgd2hldGhlciBmcm9tQ29uZmlnIGFjY2VwdHNcbiAgICAgIC8vIGN1c3RvbU9iamVjdHMsIHdlIGNyZWF0ZSBhIGN1c3RvbU9iamVjdHMgZGljdGlvbmFyeSBhbmQgdGFjayBpdCBvbiB0b1xuICAgICAgLy8gY29uZmlnWydjb25maWcnXSBhcyBjb25maWdbJ2NvbmZpZyddLmN1c3RvbU9iamVjdHMuIE9iamVjdHMgY2FuIHVzZSBpdCxcbiAgICAgIC8vIGlmIHRoZXkgd2FudC5cblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgY29uc3QgY3VzdG9tT2JqZWN0c0NvbWJpbmVkID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoX0dMT0JBTF9DVVNUT01fT0JKRUNUUykpIHtcbiAgICAgICAgY3VzdG9tT2JqZWN0c0NvbWJpbmVkW2tleV0gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBjdXN0b21PYmplY3RzQ29tYmluZWRba2V5XSA9IGN1c3RvbU9iamVjdHNba2V5XTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgY3VzdG9tT2JqZWN0cyB0byBjb25maWdcbiAgICAgIGNvbnN0IG5lc3RlZENvbmZpZyA9IGNvbmZpZ1snY29uZmlnJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgICAgbmVzdGVkQ29uZmlnWydjdXN0b21PYmplY3RzJ10gPSBjdXN0b21PYmplY3RzQ29tYmluZWQ7XG5cbiAgICAgIGNvbnN0IGJhY2t1cEN1c3RvbU9iamVjdHMgPSB7Li4uX0dMT0JBTF9DVVNUT01fT0JKRUNUU307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV0gPSBjdXN0b21PYmplY3RzW2tleV07XG4gICAgICB9XG4gICAgICBjb252ZXJ0TkRBcnJheVNjYWxhcnNJbkNvbmZpZyhjb25maWdbJ2NvbmZpZyddKTtcbiAgICAgIGNvbnN0IHJldHVybk9iaiA9XG4gICAgICAgICAgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZ1snY29uZmlnJ10sIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KTtcbiAgICAgIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7Li4uYmFja3VwQ3VzdG9tT2JqZWN0c307XG5cbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gYGNsc2AgbWF5IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3MuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UgYnkgY29udmVudGlvbiBgY29uZmlnYCBob2xkc1xuICAgICAgLy8gdGhlIGt3YXJncyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICBjb25zdCBiYWNrdXBDdXN0b21PYmplY3RzID0gey4uLl9HTE9CQUxfQ1VTVE9NX09CSkVDVFN9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VzdG9tT2JqZWN0cykpIHtcbiAgICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUU1trZXldID0gY3VzdG9tT2JqZWN0c1trZXldO1xuICAgICAgfVxuICAgICAgLy8gSW4gcHl0aG9uIHRoaXMgaXMgKipjb25maWdbJ2NvbmZpZyddLCBmb3IgdGZqcy1sYXllcnMgd2UgcmVxdWlyZVxuICAgICAgLy8gY2xhc3NlcyB0aGF0IHVzZSB0aGlzIGZhbGwtdGhyb3VnaCBjb25zdHJ1Y3Rpb24gbWV0aG9kIHRvIHRha2VcbiAgICAgIC8vIGEgY29uZmlnIGludGVyZmFjZSB0aGF0IG1pbWljcyB0aGUgZXhwYW5zaW9uIG9mIG5hbWVkIHBhcmFtZXRlcnMuXG4gICAgICBjb25zdCByZXR1cm5PYmogPSBuZXcgY2xzKGNvbmZpZ1snY29uZmlnJ10pO1xuICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUUyA9IHsuLi5iYWNrdXBDdXN0b21PYmplY3RzfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG51bWJlcnMgZm9yIHNvcnRpbmcuXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb24gb2YgdHdvIG51bWJlcnMgZm9yIHJldmVyc2Ugc29ydGluZy5cbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZU51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIC0xICogbnVtYmVyQ29tcGFyZShhLCBiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgRFR5cGUuXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIERUeXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9EVHlwZShkdHlwZTogc3RyaW5nKTogRGF0YVR5cGUge1xuICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBkdHlwZTogJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3QgdGhlIGVsZW1lbnQtYnktZWxlbWVudCBlcXVhbGl0eSBvZiB0d28gQXJyYXlzIG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0geHMgRmlyc3QgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB5cyBTZWNvbmQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEByZXR1cm5zIFdldGhlciB0aGUgdHdvIGFycmF5cyBhcmUgYWxsIGVxdWFsLCBlbGVtZW50IGJ5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdzRXF1YWwoeHM6IHN0cmluZ1tdLCB5czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKHhzID09IG51bGwgfHwgeXMgPT0gbnVsbCkge1xuICAgIHJldHVybiB4cyA9PT0geXM7XG4gIH1cbiAgaWYgKHhzLmxlbmd0aCAhPT0geXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoeHNbaV0gIT09IHlzW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pcXVlIGVsZW1lbnRzIG9mIGFuIGFycmF5LlxuICogQHBhcmFtIHhzIEFycmF5LlxuICogQHJldHVybnMgQW4gQXJyYXkgY29uc2lzdGluZyBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGluIGB4c2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oeHM6IFRbXSk6IFRbXSB7XG4gIGlmICh4cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHhzO1xuICB9XG4gIGNvbnN0IG91dDogVFtdID0gW107XG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc29ydGluZy5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKG91dC5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgb3V0LnB1c2goeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIE9iamVjdCBpcyBlbXB0eSAoaS5lLiwgZG9lcyBub3QgaGF2ZSBvd24gcHJvcGVydGllcykuXG4gKiBAcGFyYW0gb2JqIE9iamVjdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgT2JqZWN0IGlzIGVtcHR5LlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBvYmplY3QgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmo6IHt9KTogYm9vbGVhbiB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHZhbHVlIGluIG9iajogJHtKU09OLnN0cmluZ2lmeShvYmopfWApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBidWlsZCB0eXBlIHVuaW9uL2VudW0gcnVuLXRpbWUgY2hlY2tlcnMuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxhYmVsIEEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdmFsdWVzIG5vciBgdW5kZWZpbmVkYC9gbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgIHZhbHVlczogc3RyaW5nW10sIGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgJHtsYWJlbH0uICBWYWxpZCB2YWx1ZXMgYXJlICR7XG4gICAgICAgIHZhbHVlc30gb3IgbnVsbC91bmRlZmluZWQuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHZlcmlmeWluZyB0aGUgdHlwZXMgb2YgaW5wdXRzLlxuICpcbiAqIEVuc3VyZXMgdGhhdCB0aGUgZWxlbWVudHMgb2YgYHhgIGFyZSBhbGwgb2YgdHlwZSBgZXhwZWN0ZWRUeXBlYC5cbiAqIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIGB4YCBpcyB3aXRoaW4gYm91bmRzLlxuICpcbiAqIEBwYXJhbSB4IE9iamVjdCB0byB0ZXN0LlxuICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgc3RyaW5nIGV4cGVjdGVkIHR5cGUgb2YgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGVcbiAqIEFycmF5LlxuICogQHBhcmFtIG1pbkxlbmd0aCBSZXR1cm4gZmFsc2UgaWYgeC5sZW5ndGggaXMgbGVzcyB0aGFuIHRoaXMuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFJldHVybiBmYWxzZSBpZiB4Lmxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhpcy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYHhgIGlzIGFuIGBBcnJheTxleHBlY3RlZFR5cGU+YCB3aXRoXG4gKiBsZW5ndGggPj0gYG1pbkxlbmd0aGAgYW5kIDw9IGBtYXhMZW5ndGhgLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICB4OiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBtaW5MZW5ndGggPSAwLFxuICAgIG1heExlbmd0aCA9IEluZmluaXR5KTogYm9vbGVhbiB7XG4gIGFzc2VydChtaW5MZW5ndGggPj0gMCk7XG4gIGFzc2VydChtYXhMZW5ndGggPj0gbWluTGVuZ3RoKTtcbiAgcmV0dXJuIChcbiAgICAgIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5sZW5ndGggPj0gbWluTGVuZ3RoICYmIHgubGVuZ3RoIDw9IG1heExlbmd0aCAmJlxuICAgICAgeC5ldmVyeShlID0+IHR5cGVvZiBlID09PSBleHBlY3RlZFR5cGUpKTtcbn1cbi8vIHRzbGludDplbmFibGU6bm8tYW55XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZSBhcmUgcG9zaXRpdmUgaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGJlaW5nIGFzc2VydGVkIG9uLiBNYXkgYmUgYSBzaW5nbGUgbnVtYmVyIG9yIGFuIGFycmF5XG4gKiAgIG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YWx1ZSwgdXNlZCB0byBtYWtlIHRoZSBlcnJvciBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG5hbWU6IHN0cmluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gMCwgKCkgPT4gYCR7bmFtZX0gaXMgdW5leHBlY3RlZGx5IGFuIGVtcHR5IGFycmF5LmApO1xuICAgIHZhbHVlLmZvckVhY2goXG4gICAgICAgICh2LCBpKSA9PiBhc3NlcnRQb3NpdGl2ZUludGVnZXIodiwgYGVsZW1lbnQgJHtpICsgMX0gb2YgJHtuYW1lfWApKTtcbiAgfSBlbHNlIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwLFxuICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSB2YWx1ZSBpbnRvIGEgZGlzcGxheS1mcmllbmRseSwgaHVtYW4tcmVhZGFibGUgZmFzaGlvbi5cbiAqXG4gKiAtIGBudWxsYCBpcyBmb3JtYXR0ZWQgYXMgYCdudWxsJ2BcbiAqIC0gU3RyaW5ncyBhcmUgZm9ybWF0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHF1b3Rlcy5cbiAqIC0gQXJyYXlzIGFyZSBmb3JtYXR0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGRpc3BsYXkuXG4gKiBAcmV0dXJuIEZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbJyArIHZhbHVlLm1hcCh2ID0+IGZvcm1hdEFzRnJpZW5kbHlTdHJpbmcodikpLmpvaW4oJywnKSArICddJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGBmMmAgKGRlY29yYXRvcikgd2hpY2ggd3JhcHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBgZmAuIGBmMmAgZ3VhcmFudGVlcyB0aGF0IGBmYCBjYW4gYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogZXZlcnkgYHdhaXRNc2AgbXMuIElmIGBmMmAgaXMgY2FsbGVkIG1vcmUgb2Z0ZW4sIGl0IHdpbGwgcmV0dXJuXG4gKiB0aGUgbGFzdCByZXR1cm5lZCByZXN1bHQgb2YgYGZgLlxuICpcbiAqIEBwYXJhbSBmIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgZmAgdG8gd3JhcC5cbiAqIEBwYXJhbSB3YWl0TXMgVGhlIHRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gYGZgIGluIG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VD4oXG4gICAgZjogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCwgd2FpdE1zOiBudW1iZXIsXG4gICAgbm93RnVuYz86IEZ1bmN0aW9uKTogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCB7XG4gIGxldCBsYXN0VGltZSA9IG5vd0Z1bmMgIT0gbnVsbCA/IG5vd0Z1bmMoKSA6IHV0aWwubm93KCk7XG4gIGxldCBsYXN0UmVzdWx0OiBUO1xuICBjb25zdCBmMiA9ICguLi5hcmdzOiBBcnJheTx7fT4pID0+IHtcbiAgICBjb25zdCBub3cgPSBub3dGdW5jICE9IG51bGwgPyBub3dGdW5jKCkgOiB1dGlsLm5vdygpO1xuICAgIGlmIChub3cgLSBsYXN0VGltZSA8IHdhaXRNcykge1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuICAgIGxhc3RUaW1lID0gbm93O1xuICAgIGxhc3RSZXN1bHQgPSBmKC4uLmFyZ3MpO1xuICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICB9O1xuICByZXR1cm4gZjI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVzYWJsZSBhY3RpdmF0aW9uIGdpdmVuIGEgbGF5ZXJzIGlkZW50aWZpZXIuXG4gKlxuICogQHBhcmFtIGFjdGl2YXRpb25OYW1lIFRoZSBsYXllcnMgaWRlbnRpZmllciBzdHJpbmcuXG4gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBmdXNhYmxlIGFjdGl2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbChhY3RpdmF0aW9uTmFtZTogc3RyaW5nKTpcbiAgICBmdXNlZC5BY3RpdmF0aW9uIHtcbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gJ3JlbHUnO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uTmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICByZXR1cm4gJ2xpbmVhcic7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAnZWx1Jykge1xuICAgIHJldHVybiAnZWx1JztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudHlwZSBQb3NzaWJsZVZhbHVlcyA9IEFycmF5PEFycmF5PGJvb2xlYW58c3RyaW5nfG51bWJlcj4+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHNldHMgb2YgdmFsdWVzLlxuICogVGhpcyB3b3JrcyB0aGUgc2FtZSBhcyBpdGVydG9vbHMucHJvZHVjdCBpbiBQeXRob24uXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBmaWx0ZXJzID0gWzEyOCwgMjU2LCA1MTJdXG4gKiBwYWRkaW5ncyA9IFsnc2FtZScsICd2YWxpZCddXG4gKlxuICogcHJvZHVjdCA9IFsgWzEyOCwgJ3NhbWUnXSwgWzEyOCwgJ3ZhbGlkJ10sIFsyNTYsICdzYW1lJ10sIFsyNTYsICd2YWxpZCddLFxuICogWzUxMiwgJ3NhbWUnXSwgWzUxMiwgJ3ZhbGlkJ11dXG4gKlxuICogQHBhcmFtIGFycmF5T2ZWYWx1ZXMgTGlzdC9hcnJheSBvZiB2YWx1ZXMuXG4gKiBAcmV0dXJuIFRoZSBjYXJ0ZXNpYW4gcHJvZHVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcnRlc2lhblByb2R1Y3RPZlZhbHVlcyguLi5hcnJheU9mVmFsdWVzOiBQb3NzaWJsZVZhbHVlcyk6XG4gICAgUG9zc2libGVWYWx1ZXMge1xuICBhc3NlcnQoYXJyYXlPZlZhbHVlcy5sZW5ndGggPiAwLCAnYXJyYXlPZlZhbHVlcyBpcyBlbXB0eScpO1xuXG4gIGZvciAoY29uc3QgdmFsdWVzIG9mIGFycmF5T2ZWYWx1ZXMpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZXMpLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgYXNzZXJ0KHZhbHVlcy5sZW5ndGggPiAwLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgZW1wdHknKTtcbiAgfVxuXG4gIHJldHVybiBhcnJheU9mVmFsdWVzLnJlZHVjZSgocHJvZHVjdHMsIHZhbHVlcykgPT4ge1xuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IFt2YWx1ZV0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgICAgLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb2R1Y3RzLm1hcCgocHJldlZhbHVlKSA9PiBbLi4ucHJldlZhbHVlLCB2YWx1ZV0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0dGVuZWRQcm9kdWN0LCB1bmZsYXR0ZW5lZFByb2R1Y3QpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmxhdHRlbmVkUHJvZHVjdC5jb25jYXQodW5mbGF0dGVuZWRQcm9kdWN0KTtcbiAgICAgICAgfSwgW10pO1xuICB9LCBbXSBhcyBQb3NzaWJsZVZhbHVlcyk7XG59XG4iXX0=
/** @license See the LICENSE file. */
/// <amd-module name="@tensorflow/tfjs-layers/dist/version" />
declare const version = "4.10.0";
declare const version = "4.11.0";
export { version };
/** @license See the LICENSE file. */
// This code is auto-generated, do not modify this file!
const version = '4.10.0';
const version = '4.11.0';
export { version };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cblxuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnNC4xMC4wJztcbmV4cG9ydCB7dmVyc2lvbn07XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cblxuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnNC4xMS4wJztcbmV4cG9ydCB7dmVyc2lvbn07XG4iXX0=
{
"name": "@tensorflow/tfjs-layers",
"version": "4.10.0",
"version": "4.11.0",
"description": "TensorFlow layers API in JavaScript",

@@ -41,4 +41,4 @@ "license": "Apache-2.0 AND MIT",

"peerDependencies": {
"@tensorflow/tfjs-core": "4.10.0"
"@tensorflow/tfjs-core": "4.11.0"
}
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc