Code coverage report for src/reflect-metadata.js

Statements: 28.35% (74 / 261)      Branches: 11.29% (14 / 124)      Functions: 30.3% (10 / 33)      Lines: 26% (65 / 250)      Ignored: none     

All files » src/ » reflect-metadata.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 3921     1   1                                                             1 1                                 1 5   5     5     1                 1                 1                 1 9   9     9     1                 1                 1                                                   1                         1                         1             1 14 14 6 1   5 5   13 13 5     5 5   13     1                                                   1               1                                                   1 9 9 1   8     1 5 5     1                                                                   1                     1 14     1       1 14     1       1       1           1                                                                 1   1         1 1 1 1     1 1        
System.register(["core-js"], function (_export) {
    "use strict";
 
    var core, functionPrototype, _Map, _Set, _WeakMap, __Metadata__;
 
    function decorate(decorators, target, targetKey, targetDescriptor) {
        if (!IsUndefined(targetDescriptor)) {
            if (!IsArray(decorators)) {
                throw new TypeError();
            } else if (!IsObject(target)) {
                throw new TypeError();
            } else if (IsUndefined(targetKey)) {
                throw new TypeError();
            } else if (!IsObject(targetDescriptor)) {
                throw new TypeError();
            }
            targetKey = ToPropertyKey(targetKey);
            return DecoratePropertyWithDescriptor(decorators, target, targetKey, targetDescriptor);
        } else if (!IsUndefined(targetKey)) {
            if (!IsArray(decorators)) {
                throw new TypeError();
            } else if (!IsObject(target)) {
                throw new TypeError();
            }
            targetKey = ToPropertyKey(targetKey);
            return DecoratePropertyWithoutDescriptor(decorators, target, targetKey);
        } else {
            if (!IsArray(decorators)) {
                throw new TypeError();
            } else if (!IsConstructor(target)) {
                throw new TypeError();
            }
            return DecorateConstructor(decorators, target);
        }
    }
 
    function metadata(metadataKey, metadataValue) {
        function decorator(target, targetKey) {
            if (!IsUndefined(targetKey)) {
                if (!IsObject(target)) {
                    throw new TypeError();
                }
                targetKey = ToPropertyKey(targetKey);
                OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, targetKey);
            } else {
                if (!IsConstructor(target)) {
                    throw new TypeError();
                }
                OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, undefined);
            }
        }
        return decorator;
    }
 
    function defineMetadata(metadataKey, metadataValue, target, targetKey) {
        Iif (!IsObject(target)) {
            throw new TypeError();
        } else Iif (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, targetKey);
    }
 
    function hasMetadata(metadataKey, target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryHasMetadata(metadataKey, target, targetKey);
    }
 
    function hasOwnMetadata(metadataKey, target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryHasOwnMetadata(metadataKey, target, targetKey);
    }
 
    function getMetadata(metadataKey, target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryGetMetadata(metadataKey, target, targetKey);
    }
 
    function getOwnMetadata(metadataKey, target, targetKey) {
        Iif (!IsObject(target)) {
            throw new TypeError();
        } else Iif (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryGetOwnMetadata(metadataKey, target, targetKey);
    }
 
    function getMetadataKeys(target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryMetadataKeys(target, targetKey);
    }
 
    function getOwnMetadataKeys(target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        return OrdinaryOwnMetadataKeys(target, targetKey);
    }
 
    function deleteMetadata(metadataKey, target, targetKey) {
        if (!IsObject(target)) {
            throw new TypeError();
        } else if (!IsUndefined(targetKey)) {
            targetKey = ToPropertyKey(targetKey);
        }
        // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#deletemetadata-metadatakey-p-
        var metadataMap = GetOrCreateMetadataMap(target, targetKey, false);
        if (IsUndefined(metadataMap)) {
            return false;
        }
        if (!metadataMap["delete"](metadataKey)) {
            return false;
        }
        if (metadataMap.size > 0) {
            return true;
        }
        var targetMetadata = __Metadata__.get(target);
        targetMetadata["delete"](targetKey);
        if (targetMetadata.size > 0) {
            return true;
        }
        __Metadata__["delete"](target);
        return true;
    }
 
    function DecorateConstructor(decorators, target) {
        for (var i = decorators.length - 1; i >= 0; --i) {
            var decorator = decorators[i];
            var decorated = decorator(target);
            if (!IsUndefined(decorated)) {
                if (!IsConstructor(decorated)) {
                    throw new TypeError();
                }
                target = decorated;
            }
        }
        return target;
    }
    function DecoratePropertyWithDescriptor(decorators, target, propertyKey, descriptor) {
        for (var i = decorators.length - 1; i >= 0; --i) {
            var decorator = decorators[i];
            var decorated = decorator(target, propertyKey, descriptor);
            if (!IsUndefined(decorated)) {
                if (!IsObject(decorated)) {
                    throw new TypeError();
                }
                descriptor = decorated;
            }
        }
        return descriptor;
    }
    function DecoratePropertyWithoutDescriptor(decorators, target, propertyKey) {
        for (var i = decorators.length - 1; i >= 0; --i) {
            var decorator = decorators[i];
            decorator(target, propertyKey);
        }
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#getorcreatemetadatamap--o-p-create-
    function GetOrCreateMetadataMap(target, targetKey, create) {
        var targetMetadata = __Metadata__.get(target);
        if (!targetMetadata) {
            if (!create) {
                return undefined;
            }
            targetMetadata = new _Map();
            __Metadata__.set(target, targetMetadata);
        }
        var keyMetadata = targetMetadata.get(targetKey);
        if (!keyMetadata) {
            Iif (!create) {
                return undefined;
            }
            keyMetadata = new _Map();
            targetMetadata.set(targetKey, keyMetadata);
        }
        return keyMetadata;
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinaryhasmetadata--metadatakey-o-p-
    function OrdinaryHasMetadata(_x, _x2, _x3) {
        var _again = true;
 
        _function: while (_again) {
            var MetadataKey = _x,
                O = _x2,
                P = _x3;
            hasOwn = parent = undefined;
            _again = false;
 
            var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);
            if (hasOwn) {
                return true;
            }
            var parent = GetPrototypeOf(O);
            if (parent !== null) {
                _x = MetadataKey;
                _x2 = parent;
                _x3 = P;
                _again = true;
                continue _function;
            }
            return false;
        }
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinaryhasownmetadata--metadatakey-o-p-
    function OrdinaryHasOwnMetadata(MetadataKey, O, P) {
        var metadataMap = GetOrCreateMetadataMap(O, P, false);
        if (metadataMap === undefined) {
            return false;
        }
        return Boolean(metadataMap.has(MetadataKey));
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinarygetmetadata--metadatakey-o-p-
    function OrdinaryGetMetadata(_x4, _x5, _x6) {
        var _again2 = true;
 
        _function2: while (_again2) {
            var MetadataKey = _x4,
                O = _x5,
                P = _x6;
            hasOwn = parent = undefined;
            _again2 = false;
 
            var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);
            if (hasOwn) {
                return OrdinaryGetOwnMetadata(MetadataKey, O, P);
            }
            var parent = GetPrototypeOf(O);
            if (parent !== null) {
                _x4 = MetadataKey;
                _x5 = parent;
                _x6 = P;
                _again2 = true;
                continue _function2;
            }
            return undefined;
        }
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinarygetownmetadata--metadatakey-o-p-
    function OrdinaryGetOwnMetadata(MetadataKey, O, P) {
        var metadataMap = GetOrCreateMetadataMap(O, P, false);
        if (metadataMap === undefined) {
            return undefined;
        }
        return metadataMap.get(MetadataKey);
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinarydefineownmetadata--metadatakey-metadatavalue-o-p-
    function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
        var metadataMap = GetOrCreateMetadataMap(O, P, true);
        metadataMap.set(MetadataKey, MetadataValue);
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinarymetadatakeys--o-p-
    function OrdinaryMetadataKeys(O, P) {
        var ownKeys = OrdinaryOwnMetadataKeys(O, P);
        var parent = GetPrototypeOf(O);
        if (parent === null) {
            return ownKeys;
        }
        var parentKeys = OrdinaryMetadataKeys(parent, P);
        if (parentKeys.length <= 0) {
            return ownKeys;
        }
        if (ownKeys.length <= 0) {
            return parentKeys;
        }
        var set = new _Set();
        var keys = [];
        for (var _i = 0; _i < ownKeys.length; _i++) {
            var key = ownKeys[_i];
            var hasKey = set.has(key);
            if (!hasKey) {
                set.add(key);
                keys.push(key);
            }
        }
        for (var _a = 0; _a < parentKeys.length; _a++) {
            var key = parentKeys[_a];
            var hasKey = set.has(key);
            if (!hasKey) {
                set.add(key);
                keys.push(key);
            }
        }
        return keys;
    }
    // https://github.com/jonathandturner/decorators/blob/master/specs/metadata.md#ordinaryownmetadatakeys--o-p-
    function OrdinaryOwnMetadataKeys(target, targetKey) {
        var metadataMap = GetOrCreateMetadataMap(target, targetKey, false);
        var keys = [];
        if (metadataMap) {
            metadataMap.forEach(function (_, key) {
                return keys.push(key);
            });
        }
        return keys;
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-language-types-undefined-type
    function IsUndefined(x) {
        return x === undefined;
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
    function IsArray(x) {
        return Array.isArray(x);
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object-type
    function IsObject(x) {
        return typeof x === "object" ? x !== null : typeof x === "function";
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
    function IsConstructor(x) {
        return typeof x === "function";
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-language-types-symbol-type
    function IsSymbol(x) {
        return typeof x === "symbol";
    }
    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
    function ToPropertyKey(value) {
        if (IsSymbol(value)) {
            return value;
        }
        return String(value);
    }
    function GetPrototypeOf(O) {
        var proto = Object.getPrototypeOf(O);
        if (typeof O !== "function" || O === functionPrototype) {
            return proto;
        }
        // TypeScript doesn't set __proto__ in ES5, as it's non-standard.
        // Try to determine the superclass constructor. Compatible implementations
        // must either set __proto__ on a subclass constructor to the superclass constructor,
        // or ensure each class has a valid `constructor` property on its prototype that
        // points back to the constructor.
        // If this is not the same as Function.[[Prototype]], then this is definately inherited.
        // This is the case when in ES6 or when using __proto__ in a compatible browser.
        if (proto !== functionPrototype) {
            return proto;
        }
        // If the super prototype is Object.prototype, null, or undefined, then we cannot determine the heritage.
        var prototype = O.prototype;
        var prototypeProto = Object.getPrototypeOf(prototype);
        if (prototypeProto == null || prototypeProto === Object.prototype) {
            return proto;
        }
        // if the constructor was not a function, then we cannot determine the heritage.
        var constructor = prototypeProto.constructor;
        if (typeof constructor !== "function") {
            return proto;
        }
        // if we have some kind of self-reference, then we cannot determine the heritage.
        if (constructor === O) {
            return proto;
        }
        // we have a pretty good guess at the heritage.
        return constructor;
    }
    return {
        setters: [function (_coreJs) {
            core = _coreJs["default"];
        }],
        execute: function () {
 
            // Load global or shim versions of Map, Set, and WeakMap
            functionPrototype = Object.getPrototypeOf(Function);
            _Map = Map;
            _Set = Set;
            _WeakMap = WeakMap;
 
            // [[Metadata]] internal slot
            __Metadata__ = new _WeakMap();
            Reflect.decorate = decorate;Reflect.metadata = metadata;Reflect.defineMetadata = defineMetadata;Reflect.hasMetadata = hasMetadata;Reflect.hasOwnMetadata = hasOwnMetadata;Reflect.getMetadata = getMetadata;Reflect.getOwnMetadata = getOwnMetadata;Reflect.getMetadataKeys = getMetadataKeys;Reflect.getOwnMetadataKeys = getOwnMetadataKeys;Reflect.deleteMetadata = deleteMetadata;
        }
    };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL21ldGFkYXRhL3NyYy9yZWZsZWN0LW1ldGFkYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztjQUdJLGlCQUFpQixFQUNqQixJQUFJLEVBQ0osSUFBSSxFQUNKLFFBQVEsRUFHUixZQUFZOztBQUVoQixhQUFTLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtBQUMvRCxZQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7QUFDaEMsZ0JBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDdEIsc0JBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQzthQUN6QixNQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDeEIsc0JBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQzthQUN6QixNQUNJLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQzdCLHNCQUFNLElBQUksU0FBUyxFQUFFLENBQUM7YUFDekIsTUFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7QUFDbEMsc0JBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQzthQUN6QjtBQUNELHFCQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLG1CQUFPLDhCQUE4QixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDMUYsTUFDSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQzlCLGdCQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ3RCLHNCQUFNLElBQUksU0FBUyxFQUFFLENBQUM7YUFDekIsTUFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxF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LFdBQVcsQ0FBQztBQUM3QyxZQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRTtBQUNuQyxtQkFBTyxLQUFLLENBQUM7U0FDaEI7O0FBRUQsWUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO0FBQ25CLG1CQUFPLEtBQUssQ0FBQztTQUNoQjs7QUFFRCxlQUFPLFdBQVcsQ0FBQztLQUN0Qjs7Ozs7Ozs7QUFuWEcsNkJBQWlCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7QUFDbkQsZ0JBQUksR0FBRyxHQUFHO0FBQ1YsZ0JBQUksR0FBRyxHQUFHO0FBQ1Ysb0JBQVEsR0FBRyxPQUFPOzs7QUFHbEIsd0JBQVksR0FBRyxJQUFJLFFBQVEsRUFBRTtBQXVDakMsbUJBQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEFBb0I1QixPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxBQVc1QixPQUFPLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxBQVd4QyxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxBQVdsQyxPQUFPLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxBQVd4QyxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxBQVdsQyxPQUFPLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxBQVd4QyxPQUFPLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxBQVcxQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsQUE0QmhELE9BQU8sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL21ldGFkYXRhL3NyYy9yZWZsZWN0LW1ldGFkYXRhLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvcmUgZnJvbSAnY29yZS1qcyc7XG5cbi8vIExvYWQgZ2xvYmFsIG9yIHNoaW0gdmVyc2lvbnMgb2YgTWFwLCBTZXQsIGFuZCBXZWFrTWFwXG52YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xudmFyIF9NYXAgPSBNYXA7XG52YXIgX1NldCA9IFNldDtcbnZhciBfV2Vha01hcCA9IFdlYWtNYXA7XG5cbi8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG52YXIgX19NZXRhZGF0YV9fID0gbmV3IF9XZWFrTWFwKCk7XG5cbmZ1bmN0aW9uIGRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwgdGFyZ2V0S2V5LCB0YXJnZXREZXNjcmlwdG9yKSB7XG4gICAgaWYgKCFJc1VuZGVmaW5lZCh0YXJnZXREZXNjcmlwdG9yKSkge1xuICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghSXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKElzVW5kZWZpbmVkKHRhcmdldEtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghSXNPYmplY3QodGFyZ2V0RGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRLZXkgPSBUb1Byb3BlcnR5S2V5KHRhcmdldEtleSk7XG4gICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5V2l0aERlc2NyaXB0b3IoZGVjb3JhdG9ycywgdGFyZ2V0LCB0YXJnZXRLZXksIHRhcmdldERlc2NyaXB0b3IpO1xuICAgIH1cbiAgICBlbHNlIGlmICghSXNVbmRlZmluZWQodGFyZ2V0S2V5KSkge1xuICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghSXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldEtleSA9IFRvUHJvcGVydHlLZXkodGFyZ2V0S2V5KTtcbiAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHlXaXRob3V0RGVzY3JpcHRvcihkZWNvcmF0b3JzLCB0YXJnZXQsIHRhcmdldEtleSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghSXNDb25zdHJ1Y3Rvcih0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KTtcbiAgICB9XG59XG5SZWZsZWN0LmRlY29yYXRlID0gZGVjb3JhdGU7XG5cbmZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0S2V5KSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0S2V5ID0gVG9Qcm9wZXJ0eUtleSh0YXJnZXRLZXkpO1xuICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCB0YXJnZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblJlZmxlY3QubWV0YWRhdGEgPSBtZXRhZGF0YTtcblxuZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldEtleSkpIHtcbiAgICAgICAgdGFyZ2V0S2V5ID0gVG9Qcm9wZXJ0eUtleSh0YXJnZXRLZXkpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCB0YXJnZXRLZXkpO1xufVxuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9IGRlZmluZU1ldGFkYXRhO1xuXG5mdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgIH1cbiAgICBlbHNlIGlmICghSXNVbmRlZmluZWQodGFyZ2V0S2V5KSkge1xuICAgICAgICB0YXJnZXRLZXkgPSBUb1Byb3BlcnR5S2V5KHRhcmdldEtleSk7XG4gICAgfVxuICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHRhcmdldEtleSk7XG59XG5SZWZsZWN0Lmhhc01ldGFkYXRhID0gaGFzTWV0YWRhdGE7XG5cbmZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFJc1VuZGVmaW5lZCh0YXJnZXRLZXkpKSB7XG4gICAgICAgIHRhcmdldEtleSA9IFRvUHJvcGVydHlLZXkodGFyZ2V0S2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgdGFyZ2V0S2V5KTtcbn1cblJlZmxlY3QuaGFzT3duTWV0YWRhdGEgPSBoYXNPd25NZXRhZGF0YTtcblxuZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldEtleSkpIHtcbiAgICAgICAgdGFyZ2V0S2V5ID0gVG9Qcm9wZXJ0eUtleSh0YXJnZXRLZXkpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCB0YXJnZXRLZXkpO1xufVxuUmVmbGVjdC5nZXRNZXRhZGF0YSA9IGdldE1ldGFkYXRhO1xuXG5mdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgIH1cbiAgICBlbHNlIGlmICghSXNVbmRlZmluZWQodGFyZ2V0S2V5KSkge1xuICAgICAgICB0YXJnZXRLZXkgPSBUb1Byb3BlcnR5S2V5KHRhcmdldEtleSk7XG4gICAgfVxuICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHRhcmdldEtleSk7XG59XG5SZWZsZWN0LmdldE93bk1ldGFkYXRhID0gZ2V0T3duTWV0YWRhdGE7XG5cbmZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFJc1VuZGVmaW5lZCh0YXJnZXRLZXkpKSB7XG4gICAgICAgIHRhcmdldEtleSA9IFRvUHJvcGVydHlLZXkodGFyZ2V0S2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgdGFyZ2V0S2V5KTtcbn1cblJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzID0gZ2V0TWV0YWRhdGFLZXlzO1xuXG5mdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgIH1cbiAgICBlbHNlIGlmICghSXNVbmRlZmluZWQodGFyZ2V0S2V5KSkge1xuICAgICAgICB0YXJnZXRLZXkgPSBUb1Byb3BlcnR5S2V5KHRhcmdldEtleSk7XG4gICAgfVxuICAgIHJldHVybiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyh0YXJnZXQsIHRhcmdldEtleSk7XG59XG5SZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyA9IGdldE93bk1ldGFkYXRhS2V5cztcblxuZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldEtleSkpIHtcbiAgICAgICAgdGFyZ2V0S2V5ID0gVG9Qcm9wZXJ0eUtleSh0YXJnZXRLZXkpO1xuICAgIH1cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vam9uYXRoYW5kdHVybmVyL2RlY29yYXRvcnMvYmxvYi9tYXN0ZXIvc3BlY3MvbWV0YWRhdGEubWQjZGVsZXRlbWV0YWRhdGEtbWV0YWRhdGFrZXktcC1cbiAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKHRhcmdldCwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGFNYXAuZGVsZXRlKG1ldGFkYXRhS2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YU1hcC5zaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHRhcmdldE1ldGFkYXRhID0gX19NZXRhZGF0YV9fLmdldCh0YXJnZXQpO1xuICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRLZXkpO1xuICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgX19NZXRhZGF0YV9fLmRlbGV0ZSh0YXJnZXQpO1xuICAgIHJldHVybiB0cnVlO1xufVxuUmVmbGVjdC5kZWxldGVNZXRhZGF0YSA9IGRlbGV0ZU1ldGFkYXRhO1xuXG5mdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgIGlmICghSXNVbmRlZmluZWQoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKGRlY29yYXRlZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIERlY29yYXRlUHJvcGVydHlXaXRoRGVzY3JpcHRvcihkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIGlmICghSXNVbmRlZmluZWQoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbmZ1bmN0aW9uIERlY29yYXRlUHJvcGVydHlXaXRob3V0RGVzY3JpcHRvcihkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9XG59XG4vLyBodHRwczovL2dpdGh1Yi5jb20vam9uYXRoYW5kdHVybmVyL2RlY29yYXRvcnMvYmxvYi9tYXN0ZXIvc3BlY3MvbWV0YWRhdGEubWQjZ2V0b3JjcmVhdGVtZXRhZGF0YW1hcC0tby1wLWNyZWF0ZS1cbmZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSkge1xuICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IF9fTWV0YWRhdGFfXy5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIXRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgIGlmICghY3JlYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgX19NZXRhZGF0YV9fLnNldCh0YXJnZXQsIHRhcmdldE1ldGFkYXRhKTtcbiAgICB9XG4gICAgdmFyIGtleU1ldGFkYXRhID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KHRhcmdldEtleSk7XG4gICAgaWYgKCFrZXlNZXRhZGF0YSkge1xuICAgICAgICBpZiAoIWNyZWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBrZXlNZXRhZGF0YSA9IG5ldyBfTWFwKCk7XG4gICAgICAgIHRhcmdldE1ldGFkYXRhLnNldCh0YXJnZXRLZXksIGtleU1ldGFkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleU1ldGFkYXRhO1xufVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pvbmF0aGFuZHR1cm5lci9kZWNvcmF0b3JzL2Jsb2IvbWFzdGVyL3NwZWNzL21ldGFkYXRhLm1kI29yZGluYXJ5aGFzbWV0YWRhdGEtLW1ldGFkYXRha2V5LW8tcC1cbmZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgaWYgKGhhc093bikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHBhcmVudCA9IEdldFByb3RvdHlwZU9mKE8pO1xuICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hdGhhbmR0dXJuZXIvZGVjb3JhdG9ycy9ibG9iL21hc3Rlci9zcGVjcy9tZXRhZGF0YS5tZCNvcmRpbmFyeWhhc293bm1ldGFkYXRhLS1tZXRhZGF0YWtleS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gICAgaWYgKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hdGhhbmR0dXJuZXIvZGVjb3JhdG9ycy9ibG9iL21hc3Rlci9zcGVjcy9tZXRhZGF0YS5tZCNvcmRpbmFyeWdldG1ldGFkYXRhLS1tZXRhZGF0YWtleS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgIGlmIChoYXNPd24pIHtcbiAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gR2V0UHJvdG90eXBlT2YoTyk7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hdGhhbmR0dXJuZXIvZGVjb3JhdG9ycy9ibG9iL21hc3Rlci9zcGVjcy9tZXRhZGF0YS5tZCNvcmRpbmFyeWdldG93bm1ldGFkYXRhLS1tZXRhZGF0YWtleS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gICAgaWYgKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG59XG4vLyBodHRwczovL2dpdGh1Yi5jb20vam9uYXRoYW5kdHVybmVyL2RlY29yYXRvcnMvYmxvYi9tYXN0ZXIvc3BlY3MvbWV0YWRhdGEubWQjb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YS0tbWV0YWRhdGFrZXktbWV0YWRhdGF2YWx1ZS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCB0cnVlKTtcbiAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xufVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pvbmF0aGFuZHR1cm5lci9kZWNvcmF0b3JzL2Jsb2IvbWFzdGVyL3NwZWNzL21ldGFkYXRhLm1kI29yZGluYXJ5bWV0YWRhdGFrZXlzLS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgdmFyIG93bktleXMgPSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICB2YXIgcGFyZW50ID0gR2V0UHJvdG90eXBlT2YoTyk7XG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICB9XG4gICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgIGlmIChwYXJlbnRLZXlzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgIH1cbiAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMCkge1xuICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICB9XG4gICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3duS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGtleSA9IG93bktleXNbX2ldO1xuICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2EgPSAwOyBfYSA8IHBhcmVudEtleXMubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBwYXJlbnRLZXlzW19hXTtcbiAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pvbmF0aGFuZHR1cm5lci9kZWNvcmF0b3JzL2Jsb2IvbWFzdGVyL3NwZWNzL21ldGFkYXRhLm1kI29yZGluYXJ5b3dubWV0YWRhdGFrZXlzLS1vLXAtXG5mdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyh0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChtZXRhZGF0YU1hcCkge1xuICAgICAgICBtZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uIChfLCBrZXkpIHsgcmV0dXJuIGtleXMucHVzaChrZXkpOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG4vLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy11bmRlZmluZWQtdHlwZVxuZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG59XG4vLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNhcnJheVxuZnVuY3Rpb24gSXNBcnJheSh4KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoeCk7XG59XG4vLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LXR5cGVcbmZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbn1cbi8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1pc2NvbnN0cnVjdG9yXG5mdW5jdGlvbiBJc0NvbnN0cnVjdG9yKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbn1cbi8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXN5bWJvbC10eXBlXG5mdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xufVxuLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvcHJvcGVydHlrZXlcbmZ1bmN0aW9uIFRvUHJvcGVydHlLZXkodmFsdWUpIHtcbiAgICBpZiAoSXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5mdW5jdGlvbiBHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pO1xuICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiBwcm90bztcbiAgICB9XG4gICAgLy8gVHlwZVNjcmlwdCBkb2Vzbid0IHNldCBfX3Byb3RvX18gaW4gRVM1LCBhcyBpdCdzIG5vbi1zdGFuZGFyZC5cbiAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAvLyBvciBlbnN1cmUgZWFjaCBjbGFzcyBoYXMgYSB2YWxpZCBgY29uc3RydWN0b3JgIHByb3BlcnR5IG9uIGl0cyBwcm90b3R5cGUgdGhhdFxuICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIGluIEVTNiBvciB3aGVuIHVzaW5nIF9fcHJvdG9fXyBpbiBhIGNvbXBhdGlibGUgYnJvd3Nlci5cbiAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiBwcm90bztcbiAgICB9XG4gICAgLy8gSWYgdGhlIHN1cGVyIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlLCBudWxsLCBvciB1bmRlZmluZWQsIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgIHZhciBwcm90b3R5cGVQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiBwcm90bztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICBpZiAoY29uc3RydWN0b3IgPT09IE8pIHtcbiAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgIH1cbiAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgIHJldHVybiBjb25zdHJ1Y3Rvcjtcbn1cbiJdfQ==