| Index: third_party/document_image_extractor/third_party/closure-library/closure/goog/object/object.js
|
| diff --git a/third_party/document_image_extractor/third_party/closure-library/closure/goog/object/object.js b/third_party/document_image_extractor/third_party/closure-library/closure/goog/object/object.js
|
| deleted file mode 100644
|
| index 20a77f789a39ef20ddd472c89ba024f47702152c..0000000000000000000000000000000000000000
|
| --- a/third_party/document_image_extractor/third_party/closure-library/closure/goog/object/object.js
|
| +++ /dev/null
|
| @@ -1,686 +0,0 @@
|
| -// Copyright 2006 The Closure Library Authors. All Rights Reserved.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS-IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -
|
| -/**
|
| - * @fileoverview Utilities for manipulating objects/maps/hashes.
|
| - * @author arv@google.com (Erik Arvidsson)
|
| - */
|
| -
|
| -goog.provide('goog.object');
|
| -
|
| -
|
| -/**
|
| - * Calls a function for each element in an object/map/hash.
|
| - *
|
| - * @param {Object<K,V>} obj The object over which to iterate.
|
| - * @param {function(this:T,V,?,Object<K,V>):?} f The function to call
|
| - * for every element. This function takes 3 arguments (the element, the
|
| - * index and the object) and the return value is ignored.
|
| - * @param {T=} opt_obj This is used as the 'this' object within f.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.forEach = function(obj, f, opt_obj) {
|
| - for (var key in obj) {
|
| - f.call(opt_obj, obj[key], key, obj);
|
| - }
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Calls a function for each element in an object/map/hash. If that call returns
|
| - * true, adds the element to a new object.
|
| - *
|
| - * @param {Object<K,V>} obj The object over which to iterate.
|
| - * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to call
|
| - * for every element. This
|
| - * function takes 3 arguments (the element, the index and the object)
|
| - * and should return a boolean. If the return value is true the
|
| - * element is added to the result object. If it is false the
|
| - * element is not included.
|
| - * @param {T=} opt_obj This is used as the 'this' object within f.
|
| - * @return {!Object<K,V>} a new object in which only elements that passed the
|
| - * test are present.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.filter = function(obj, f, opt_obj) {
|
| - var res = {};
|
| - for (var key in obj) {
|
| - if (f.call(opt_obj, obj[key], key, obj)) {
|
| - res[key] = obj[key];
|
| - }
|
| - }
|
| - return res;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * For every element in an object/map/hash calls a function and inserts the
|
| - * result into a new object.
|
| - *
|
| - * @param {Object<K,V>} obj The object over which to iterate.
|
| - * @param {function(this:T,V,?,Object<K,V>):R} f The function to call
|
| - * for every element. This function
|
| - * takes 3 arguments (the element, the index and the object)
|
| - * and should return something. The result will be inserted
|
| - * into a new object.
|
| - * @param {T=} opt_obj This is used as the 'this' object within f.
|
| - * @return {!Object<K,R>} a new object with the results from f.
|
| - * @template T,K,V,R
|
| - */
|
| -goog.object.map = function(obj, f, opt_obj) {
|
| - var res = {};
|
| - for (var key in obj) {
|
| - res[key] = f.call(opt_obj, obj[key], key, obj);
|
| - }
|
| - return res;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Calls a function for each element in an object/map/hash. If any
|
| - * call returns true, returns true (without checking the rest). If
|
| - * all calls return false, returns false.
|
| - *
|
| - * @param {Object<K,V>} obj The object to check.
|
| - * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to
|
| - * call for every element. This function
|
| - * takes 3 arguments (the element, the index and the object) and should
|
| - * return a boolean.
|
| - * @param {T=} opt_obj This is used as the 'this' object within f.
|
| - * @return {boolean} true if any element passes the test.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.some = function(obj, f, opt_obj) {
|
| - for (var key in obj) {
|
| - if (f.call(opt_obj, obj[key], key, obj)) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Calls a function for each element in an object/map/hash. If
|
| - * all calls return true, returns true. If any call returns false, returns
|
| - * false at this point and does not continue to check the remaining elements.
|
| - *
|
| - * @param {Object<K,V>} obj The object to check.
|
| - * @param {?function(this:T,V,?,Object<K,V>):boolean} f The function to
|
| - * call for every element. This function
|
| - * takes 3 arguments (the element, the index and the object) and should
|
| - * return a boolean.
|
| - * @param {T=} opt_obj This is used as the 'this' object within f.
|
| - * @return {boolean} false if any element fails the test.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.every = function(obj, f, opt_obj) {
|
| - for (var key in obj) {
|
| - if (!f.call(opt_obj, obj[key], key, obj)) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns the number of key-value pairs in the object map.
|
| - *
|
| - * @param {Object} obj The object for which to get the number of key-value
|
| - * pairs.
|
| - * @return {number} The number of key-value pairs in the object map.
|
| - */
|
| -goog.object.getCount = function(obj) {
|
| - // JS1.5 has __count__ but it has been deprecated so it raises a warning...
|
| - // in other words do not use. Also __count__ only includes the fields on the
|
| - // actual object and not in the prototype chain.
|
| - var rv = 0;
|
| - for (var key in obj) {
|
| - rv++;
|
| - }
|
| - return rv;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns one key from the object map, if any exists.
|
| - * For map literals the returned key will be the first one in most of the
|
| - * browsers (a know exception is Konqueror).
|
| - *
|
| - * @param {Object} obj The object to pick a key from.
|
| - * @return {string|undefined} The key or undefined if the object is empty.
|
| - */
|
| -goog.object.getAnyKey = function(obj) {
|
| - for (var key in obj) {
|
| - return key;
|
| - }
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns one value from the object map, if any exists.
|
| - * For map literals the returned value will be the first one in most of the
|
| - * browsers (a know exception is Konqueror).
|
| - *
|
| - * @param {Object<K,V>} obj The object to pick a value from.
|
| - * @return {V|undefined} The value or undefined if the object is empty.
|
| - * @template K,V
|
| - */
|
| -goog.object.getAnyValue = function(obj) {
|
| - for (var key in obj) {
|
| - return obj[key];
|
| - }
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Whether the object/hash/map contains the given object as a value.
|
| - * An alias for goog.object.containsValue(obj, val).
|
| - *
|
| - * @param {Object<K,V>} obj The object in which to look for val.
|
| - * @param {V} val The object for which to check.
|
| - * @return {boolean} true if val is present.
|
| - * @template K,V
|
| - */
|
| -goog.object.contains = function(obj, val) {
|
| - return goog.object.containsValue(obj, val);
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns the values of the object/map/hash.
|
| - *
|
| - * @param {Object<K,V>} obj The object from which to get the values.
|
| - * @return {!Array<V>} The values in the object/map/hash.
|
| - * @template K,V
|
| - */
|
| -goog.object.getValues = function(obj) {
|
| - var res = [];
|
| - var i = 0;
|
| - for (var key in obj) {
|
| - res[i++] = obj[key];
|
| - }
|
| - return res;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns the keys of the object/map/hash.
|
| - *
|
| - * @param {Object} obj The object from which to get the keys.
|
| - * @return {!Array<string>} Array of property keys.
|
| - */
|
| -goog.object.getKeys = function(obj) {
|
| - var res = [];
|
| - var i = 0;
|
| - for (var key in obj) {
|
| - res[i++] = key;
|
| - }
|
| - return res;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Get a value from an object multiple levels deep. This is useful for
|
| - * pulling values from deeply nested objects, such as JSON responses.
|
| - * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3)
|
| - *
|
| - * @param {!Object} obj An object to get the value from. Can be array-like.
|
| - * @param {...(string|number|!Array<number|string>)} var_args A number of keys
|
| - * (as strings, or numbers, for array-like objects). Can also be
|
| - * specified as a single array of keys.
|
| - * @return {*} The resulting value. If, at any point, the value for a key
|
| - * is undefined, returns undefined.
|
| - */
|
| -goog.object.getValueByKeys = function(obj, var_args) {
|
| - var isArrayLike = goog.isArrayLike(var_args);
|
| - var keys = isArrayLike ? var_args : arguments;
|
| -
|
| - // Start with the 2nd parameter for the variable parameters syntax.
|
| - for (var i = isArrayLike ? 0 : 1; i < keys.length; i++) {
|
| - obj = obj[keys[i]];
|
| - if (!goog.isDef(obj)) {
|
| - break;
|
| - }
|
| - }
|
| -
|
| - return obj;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Whether the object/map/hash contains the given key.
|
| - *
|
| - * @param {Object} obj The object in which to look for key.
|
| - * @param {*} key The key for which to check.
|
| - * @return {boolean} true If the map contains the key.
|
| - */
|
| -goog.object.containsKey = function(obj, key) {
|
| - return key in obj;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Whether the object/map/hash contains the given value. This is O(n).
|
| - *
|
| - * @param {Object<K,V>} obj The object in which to look for val.
|
| - * @param {V} val The value for which to check.
|
| - * @return {boolean} true If the map contains the value.
|
| - * @template K,V
|
| - */
|
| -goog.object.containsValue = function(obj, val) {
|
| - for (var key in obj) {
|
| - if (obj[key] == val) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Searches an object for an element that satisfies the given condition and
|
| - * returns its key.
|
| - * @param {Object<K,V>} obj The object to search in.
|
| - * @param {function(this:T,V,string,Object<K,V>):boolean} f The
|
| - * function to call for every element. Takes 3 arguments (the value,
|
| - * the key and the object) and should return a boolean.
|
| - * @param {T=} opt_this An optional "this" context for the function.
|
| - * @return {string|undefined} The key of an element for which the function
|
| - * returns true or undefined if no such element is found.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.findKey = function(obj, f, opt_this) {
|
| - for (var key in obj) {
|
| - if (f.call(opt_this, obj[key], key, obj)) {
|
| - return key;
|
| - }
|
| - }
|
| - return undefined;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Searches an object for an element that satisfies the given condition and
|
| - * returns its value.
|
| - * @param {Object<K,V>} obj The object to search in.
|
| - * @param {function(this:T,V,string,Object<K,V>):boolean} f The function
|
| - * to call for every element. Takes 3 arguments (the value, the key
|
| - * and the object) and should return a boolean.
|
| - * @param {T=} opt_this An optional "this" context for the function.
|
| - * @return {V} The value of an element for which the function returns true or
|
| - * undefined if no such element is found.
|
| - * @template T,K,V
|
| - */
|
| -goog.object.findValue = function(obj, f, opt_this) {
|
| - var key = goog.object.findKey(obj, f, opt_this);
|
| - return key && obj[key];
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Whether the object/map/hash is empty.
|
| - *
|
| - * @param {Object} obj The object to test.
|
| - * @return {boolean} true if obj is empty.
|
| - */
|
| -goog.object.isEmpty = function(obj) {
|
| - for (var key in obj) {
|
| - return false;
|
| - }
|
| - return true;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Removes all key value pairs from the object/map/hash.
|
| - *
|
| - * @param {Object} obj The object to clear.
|
| - */
|
| -goog.object.clear = function(obj) {
|
| - for (var i in obj) {
|
| - delete obj[i];
|
| - }
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Removes a key-value pair based on the key.
|
| - *
|
| - * @param {Object} obj The object from which to remove the key.
|
| - * @param {*} key The key to remove.
|
| - * @return {boolean} Whether an element was removed.
|
| - */
|
| -goog.object.remove = function(obj, key) {
|
| - var rv;
|
| - if ((rv = key in obj)) {
|
| - delete obj[key];
|
| - }
|
| - return rv;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Adds a key-value pair to the object. Throws an exception if the key is
|
| - * already in use. Use set if you want to change an existing pair.
|
| - *
|
| - * @param {Object<K,V>} obj The object to which to add the key-value pair.
|
| - * @param {string} key The key to add.
|
| - * @param {V} val The value to add.
|
| - * @template K,V
|
| - */
|
| -goog.object.add = function(obj, key, val) {
|
| - if (key in obj) {
|
| - throw Error('The object already contains the key "' + key + '"');
|
| - }
|
| - goog.object.set(obj, key, val);
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns the value for the given key.
|
| - *
|
| - * @param {Object<K,V>} obj The object from which to get the value.
|
| - * @param {string} key The key for which to get the value.
|
| - * @param {R=} opt_val The value to return if no item is found for the given
|
| - * key (default is undefined).
|
| - * @return {V|R|undefined} The value for the given key.
|
| - * @template K,V,R
|
| - */
|
| -goog.object.get = function(obj, key, opt_val) {
|
| - if (key in obj) {
|
| - return obj[key];
|
| - }
|
| - return opt_val;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Adds a key-value pair to the object/map/hash.
|
| - *
|
| - * @param {Object<K,V>} obj The object to which to add the key-value pair.
|
| - * @param {string} key The key to add.
|
| - * @param {V} value The value to add.
|
| - * @template K,V
|
| - */
|
| -goog.object.set = function(obj, key, value) {
|
| - obj[key] = value;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Adds a key-value pair to the object/map/hash if it doesn't exist yet.
|
| - *
|
| - * @param {Object<K,V>} obj The object to which to add the key-value pair.
|
| - * @param {string} key The key to add.
|
| - * @param {V} value The value to add if the key wasn't present.
|
| - * @return {V} The value of the entry at the end of the function.
|
| - * @template K,V
|
| - */
|
| -goog.object.setIfUndefined = function(obj, key, value) {
|
| - return key in obj ? obj[key] : (obj[key] = value);
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Sets a key and value to an object if the key is not set. The value will be
|
| - * the return value of the given function. If the key already exists, the
|
| - * object will not be changed and the function will not be called (the function
|
| - * will be lazily evaluated -- only called if necessary).
|
| - *
|
| - * This function is particularly useful for use with a map used a as a cache.
|
| - *
|
| - * @param {!Object<K,V>} obj The object to which to add the key-value pair.
|
| - * @param {string} key The key to add.
|
| - * @param {function():V} f The value to add if the key wasn't present.
|
| - * @return {V} The value of the entry at the end of the function.
|
| - * @template K,V
|
| - */
|
| -goog.object.setWithReturnValueIfNotSet = function(obj, key, f) {
|
| - if (key in obj) {
|
| - return obj[key];
|
| - }
|
| -
|
| - var val = f();
|
| - obj[key] = val;
|
| - return val;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Compares two objects for equality using === on the values.
|
| - *
|
| - * @param {!Object<K,V>} a
|
| - * @param {!Object<K,V>} b
|
| - * @return {boolean}
|
| - * @template K,V
|
| - */
|
| -goog.object.equals = function(a, b) {
|
| - for (var k in a) {
|
| - if (!(k in b) || a[k] !== b[k]) {
|
| - return false;
|
| - }
|
| - }
|
| - for (var k in b) {
|
| - if (!(k in a)) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Does a flat clone of the object.
|
| - *
|
| - * @param {Object<K,V>} obj Object to clone.
|
| - * @return {!Object<K,V>} Clone of the input object.
|
| - * @template K,V
|
| - */
|
| -goog.object.clone = function(obj) {
|
| - // We cannot use the prototype trick because a lot of methods depend on where
|
| - // the actual key is set.
|
| -
|
| - var res = {};
|
| - for (var key in obj) {
|
| - res[key] = obj[key];
|
| - }
|
| - return res;
|
| - // We could also use goog.mixin but I wanted this to be independent from that.
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Clones a value. The input may be an Object, Array, or basic type. Objects and
|
| - * arrays will be cloned recursively.
|
| - *
|
| - * WARNINGS:
|
| - * <code>goog.object.unsafeClone</code> does not detect reference loops. Objects
|
| - * that refer to themselves will cause infinite recursion.
|
| - *
|
| - * <code>goog.object.unsafeClone</code> is unaware of unique identifiers, and
|
| - * copies UIDs created by <code>getUid</code> into cloned results.
|
| - *
|
| - * @param {*} obj The value to clone.
|
| - * @return {*} A clone of the input value.
|
| - */
|
| -goog.object.unsafeClone = function(obj) {
|
| - var type = goog.typeOf(obj);
|
| - if (type == 'object' || type == 'array') {
|
| - if (obj.clone) {
|
| - return obj.clone();
|
| - }
|
| - var clone = type == 'array' ? [] : {};
|
| - for (var key in obj) {
|
| - clone[key] = goog.object.unsafeClone(obj[key]);
|
| - }
|
| - return clone;
|
| - }
|
| -
|
| - return obj;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Returns a new object in which all the keys and values are interchanged
|
| - * (keys become values and values become keys). If multiple keys map to the
|
| - * same value, the chosen transposed value is implementation-dependent.
|
| - *
|
| - * @param {Object} obj The object to transpose.
|
| - * @return {!Object} The transposed object.
|
| - */
|
| -goog.object.transpose = function(obj) {
|
| - var transposed = {};
|
| - for (var key in obj) {
|
| - transposed[obj[key]] = key;
|
| - }
|
| - return transposed;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * The names of the fields that are defined on Object.prototype.
|
| - * @type {Array<string>}
|
| - * @private
|
| - */
|
| -goog.object.PROTOTYPE_FIELDS_ = [
|
| - 'constructor',
|
| - 'hasOwnProperty',
|
| - 'isPrototypeOf',
|
| - 'propertyIsEnumerable',
|
| - 'toLocaleString',
|
| - 'toString',
|
| - 'valueOf'
|
| -];
|
| -
|
| -
|
| -/**
|
| - * Extends an object with another object.
|
| - * This operates 'in-place'; it does not create a new Object.
|
| - *
|
| - * Example:
|
| - * var o = {};
|
| - * goog.object.extend(o, {a: 0, b: 1});
|
| - * o; // {a: 0, b: 1}
|
| - * goog.object.extend(o, {b: 2, c: 3});
|
| - * o; // {a: 0, b: 2, c: 3}
|
| - *
|
| - * @param {Object} target The object to modify. Existing properties will be
|
| - * overwritten if they are also present in one of the objects in
|
| - * {@code var_args}.
|
| - * @param {...Object} var_args The objects from which values will be copied.
|
| - */
|
| -goog.object.extend = function(target, var_args) {
|
| - var key, source;
|
| - for (var i = 1; i < arguments.length; i++) {
|
| - source = arguments[i];
|
| - for (key in source) {
|
| - target[key] = source[key];
|
| - }
|
| -
|
| - // For IE the for-in-loop does not contain any properties that are not
|
| - // enumerable on the prototype object (for example isPrototypeOf from
|
| - // Object.prototype) and it will also not include 'replace' on objects that
|
| - // extend String and change 'replace' (not that it is common for anyone to
|
| - // extend anything except Object).
|
| -
|
| - for (var j = 0; j < goog.object.PROTOTYPE_FIELDS_.length; j++) {
|
| - key = goog.object.PROTOTYPE_FIELDS_[j];
|
| - if (Object.prototype.hasOwnProperty.call(source, key)) {
|
| - target[key] = source[key];
|
| - }
|
| - }
|
| - }
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Creates a new object built from the key-value pairs provided as arguments.
|
| - * @param {...*} var_args If only one argument is provided and it is an array
|
| - * then this is used as the arguments, otherwise even arguments are used as
|
| - * the property names and odd arguments are used as the property values.
|
| - * @return {!Object} The new object.
|
| - * @throws {Error} If there are uneven number of arguments or there is only one
|
| - * non array argument.
|
| - */
|
| -goog.object.create = function(var_args) {
|
| - var argLength = arguments.length;
|
| - if (argLength == 1 && goog.isArray(arguments[0])) {
|
| - return goog.object.create.apply(null, arguments[0]);
|
| - }
|
| -
|
| - if (argLength % 2) {
|
| - throw Error('Uneven number of arguments');
|
| - }
|
| -
|
| - var rv = {};
|
| - for (var i = 0; i < argLength; i += 2) {
|
| - rv[arguments[i]] = arguments[i + 1];
|
| - }
|
| - return rv;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Creates a new object where the property names come from the arguments but
|
| - * the value is always set to true
|
| - * @param {...*} var_args If only one argument is provided and it is an array
|
| - * then this is used as the arguments, otherwise the arguments are used
|
| - * as the property names.
|
| - * @return {!Object} The new object.
|
| - */
|
| -goog.object.createSet = function(var_args) {
|
| - var argLength = arguments.length;
|
| - if (argLength == 1 && goog.isArray(arguments[0])) {
|
| - return goog.object.createSet.apply(null, arguments[0]);
|
| - }
|
| -
|
| - var rv = {};
|
| - for (var i = 0; i < argLength; i++) {
|
| - rv[arguments[i]] = true;
|
| - }
|
| - return rv;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * Creates an immutable view of the underlying object, if the browser
|
| - * supports immutable objects.
|
| - *
|
| - * In default mode, writes to this view will fail silently. In strict mode,
|
| - * they will throw an error.
|
| - *
|
| - * @param {!Object<K,V>} obj An object.
|
| - * @return {!Object<K,V>} An immutable view of that object, or the
|
| - * original object if this browser does not support immutables.
|
| - * @template K,V
|
| - */
|
| -goog.object.createImmutableView = function(obj) {
|
| - var result = obj;
|
| - if (Object.isFrozen && !Object.isFrozen(obj)) {
|
| - result = Object.create(obj);
|
| - Object.freeze(result);
|
| - }
|
| - return result;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * @param {!Object} obj An object.
|
| - * @return {boolean} Whether this is an immutable view of the object.
|
| - */
|
| -goog.object.isImmutableView = function(obj) {
|
| - return !!Object.isFrozen && Object.isFrozen(obj);
|
| -};
|
|
|