1'use strict';
2
3var __fs__ = require('fs');
4var __path__ = require('path');
5var __util__ = require('util');
6var __glob__ = require('glob');
7var __os__ = require('os');
8var __xmlhttprequest__ = require('unxhr');
9
10(function(global_object) {
11
12  // @note
13  //   A few conventions for the documentation of this file:
14  //   1. Always use "//" (in contrast with "/**/")
15  //   2. The syntax used is Yardoc (yardoc.org), which is intended for Ruby (se below)
16  //   3. `@param` and `@return` types should be preceded by `JS.` when referring to
17  //      JavaScript constructors (e.g. `JS.Function`) otherwise Ruby is assumed.
18  //   4. `nil` and `null` being unambiguous refer to the respective
19  //      objects/values in Ruby and JavaScript
20  //   5. This is still WIP :) so please give feedback and suggestions on how
21  //      to improve or for alternative solutions
22  //
23  //   The way the code is digested before going through Yardoc is a secret kept
24  //   in the docs repo (https://github.com/opal/docs/tree/master).
25
26  var console;
27
28  // Detect the global object
29  if (typeof(globalThis) !== 'undefined') { global_object = globalThis; }
30  else if (typeof(global) !== 'undefined') { global_object = global; }
31  else if (typeof(window) !== 'undefined') { global_object = window; }
32
33  // Setup a dummy console object if missing
34  if (global_object.console == null) {
35    global_object.console = {};
36  }
37
38  if (typeof(global_object.console) === 'object') {
39    console = global_object.console;
40  } else {
41    console = {};
42  }
43
44  if (!('log' in console)) { console.log = function () {}; }
45  if (!('warn' in console)) { console.warn = console.log; }
46
47  if (typeof(global_object.Opal) !== 'undefined') {
48    console.warn('Opal already loaded. Loading twice can cause troubles, please fix your setup.');
49    return global_object.Opal;
50  }
51
52  var nil;
53
54  // The actual class for BasicObject
55  var BasicObject;
56
57  // The actual Object class.
58  // The leading underscore is to avoid confusion with window.Object()
59  var _Object;
60
61  // The actual Module class
62  var Module;
63
64  // The actual Class class
65  var Class;
66
67  // The Opal.Opal class (helpers etc.)
68  var _Opal;
69
70  // The Kernel module
71  var Kernel;
72
73  // The Opal object that is exposed globally
74  var Opal = global_object.Opal = {};
75
76  // This is a useful reference to global object inside ruby files
77  Opal.global = global_object;
78
79  // Configure runtime behavior with regards to require and unsupported features
80  Opal.config = {
81    missing_require_severity: 'error',        // error, warning, ignore
82    unsupported_features_severity: 'warning', // error, warning, ignore
83    experimental_features_severity: 'warning',// warning, ignore
84    enable_stack_trace: true                  // true, false
85  };
86
87  // Minify common function calls
88  var $call      = Function.prototype.call;
89  var $bind      = Function.prototype.bind;
90  var $has_own   = Object.hasOwn || $call.bind(Object.prototype.hasOwnProperty);
91  var $set_proto = Object.setPrototypeOf;
92  var $slice     = $call.bind(Array.prototype.slice);
93  var $splice    = $call.bind(Array.prototype.splice);
94
95  // Nil object id is always 4
96  var nil_id = 4;
97
98  // Generates even sequential numbers greater than 4
99  // (nil_id) to serve as unique ids for ruby objects
100  var unique_id = nil_id;
101
102  // Return next unique id
103  function $uid() {
104    unique_id += 2;
105    return unique_id;
106  }  Opal.uid = $uid;
107
108  // Retrieve or assign the id of an object
109  Opal.id = function(obj) {
110    if (obj.$$is_number) return (obj * 2)+1;
111    if (obj.$$id == null) {
112      $prop(obj, '$$id', $uid());
113    }
114    return obj.$$id;
115  };
116
117  // Globals table
118  var $gvars = Opal.gvars = {};
119
120  // Exit function, this should be replaced by platform specific implementation
121  // (See nodejs and chrome for examples)
122  Opal.exit = function(status) { if ($gvars.DEBUG) console.log('Exited with status '+status); };
123
124  // keeps track of exceptions for $!
125  Opal.exceptions = [];
126
127  // @private
128  // Pops an exception from the stack and updates `$!`.
129  Opal.pop_exception = function() {
130    var exception = Opal.exceptions.pop();
131    if (exception) {
132      $gvars["!"] = exception;
133      $gvars["@"] = exception.$backtrace();
134    }
135    else {
136      $gvars["!"] = $gvars["@"] = nil;
137    }
138  };
139
140  // A helper function for raising things, that gracefully degrades if necessary
141  // functionality is not yet loaded.
142  function $raise(klass, message) {
143    // Raise Exception, so we can know that something wrong is going on.
144    if (!klass) klass = Opal.Exception || Error;
145
146    if (Kernel && Kernel.$raise) {
147      if (arguments.length > 2) {
148        Kernel.$raise(klass.$new.apply(klass, $slice(arguments, 1)));
149      }
150      else {
151        Kernel.$raise(klass, message);
152      }
153    }
154    else if (!klass.$new) {
155      throw new klass(message);
156    }
157    else {
158      throw klass.$new(message);
159    }
160  }
161
162  function $prop(object, name, initialValue) {
163    if (typeof(object) === "string") {
164      // Special case for:
165      //   s = "string"
166      //   def s.m; end
167      // String class is the only class that:
168      // + compiles to JS primitive
169      // + allows method definition directly on instances
170      // numbers, true, false and null do not support it.
171      object[name] = initialValue;
172    } else {
173      Object.defineProperty(object, name, {
174        value: initialValue,
175        enumerable: false,
176        configurable: true,
177        writable: true
178      });
179    }
180  }
181
182  Opal.prop = $prop;
183
184  // @deprecated
185  Opal.defineProperty = Opal.prop;
186
187  Opal.slice = $slice;
188
189  // Helpers
190  // -----
191
192  var $truthy = Opal.truthy = function(val) {
193    return false !== val && nil !== val && undefined !== val && null !== val && (!(val instanceof Boolean) || true === val.valueOf());
194  };
195
196  Opal.falsy = function(val) {
197    return !$truthy(val);
198  };
199
200  Opal.type_error = function(object, type, method, coerced) {
201    object = object.$$class;
202
203    if (coerced && method) {
204      coerced = coerced.$$class;
205      $raise(Opal.TypeError,
206        "can't convert " + object + " into " + type +
207        " (" + object + "#" + method + " gives " + coerced + ")"
208      );
209    } else {
210      $raise(Opal.TypeError,
211        "no implicit conversion of " + object + " into " + type
212      );
213    }
214  };
215
216  Opal.coerce_to = function(object, type, method, args) {
217    var body;
218
219    if (method === 'to_int' && type === Opal.Integer && object.$$is_number)
220      return object < 0 ? Math.ceil(object) : Math.floor(object);
221
222    if (method === 'to_str' && type === Opal.String && object.$$is_string)
223      return object;
224
225    if (Opal.is_a(object, type)) return object;
226
227    // Fast path for the most common situation
228    if (object['$respond_to?'].$$pristine && object.$method_missing.$$pristine) {
229      body = object[$jsid(method)];
230      if (body == null || body.$$stub) Opal.type_error(object, type);
231      return body.apply(object, args);
232    }
233
234    if (!object['$respond_to?'](method)) {
235      Opal.type_error(object, type);
236    }
237
238    if (args == null) args = [];
239    return Opal.send(object, method, args);
240  };
241
242  Opal.respond_to = function(obj, jsid, include_all) {
243    if (obj == null || !obj.$$class) return false;
244    include_all = !!include_all;
245    var body = obj[jsid];
246
247    if (obj['$respond_to?'].$$pristine) {
248      if (typeof(body) === "function" && !body.$$stub) {
249        return true;
250      }
251      if (!obj['$respond_to_missing?'].$$pristine) {
252        return Opal.send(obj, obj['$respond_to_missing?'], [jsid.substr(1), include_all]);
253      }
254    } else {
255      return Opal.send(obj, obj['$respond_to?'], [jsid.substr(1), include_all]);
256    }
257  };
258
259  // TracePoint support
260  // ------------------
261  //
262  // Support for `TracePoint.trace(:class) do ... end`
263  Opal.trace_class = false;
264  Opal.tracers_for_class = [];
265
266  function invoke_tracers_for_class(klass_or_module) {
267    var i, ii, tracer;
268
269    for(i = 0, ii = Opal.tracers_for_class.length; i < ii; i++) {
270      tracer = Opal.tracers_for_class[i];
271      tracer.trace_object = klass_or_module;
272      tracer.block.$call(tracer);
273    }
274  }
275
276  function handle_autoload(cref, name) {
277    if (!cref.$$autoload[name].loaded) {
278      cref.$$autoload[name].loaded = true;
279      try {
280        Opal.Kernel.$require(cref.$$autoload[name].path);
281      } catch (e) {
282        cref.$$autoload[name].exception = e;
283        throw e;
284      }
285      cref.$$autoload[name].required = true;
286      if (cref.$$const[name] != null) {
287        cref.$$autoload[name].success = true;
288        return cref.$$const[name];
289      }
290    } else if (cref.$$autoload[name].loaded && !cref.$$autoload[name].required) {
291      if (cref.$$autoload[name].exception) { throw cref.$$autoload[name].exception; }
292    }
293  }
294
295  // Constants
296  // ---------
297  //
298  // For future reference:
299  // - The Rails autoloading guide (http://guides.rubyonrails.org/v5.0/autoloading_and_reloading_constants.html)
300  // - @ConradIrwin's 2012 post on “Everything you ever wanted to know about constant lookup in Ruby” (http://cirw.in/blog/constant-lookup.html)
301  //
302  // Legend of MRI concepts/names:
303  // - constant reference (cref): the module/class that acts as a namespace
304  // - nesting: the namespaces wrapping the current scope, e.g. nesting inside
305  //            `module A; module B::C; end; end` is `[B::C, A]`
306
307  // Get the constant in the scope of the current cref
308  function const_get_name(cref, name) {
309    if (cref) {
310      if (cref.$$const[name] != null) { return cref.$$const[name]; }
311      if (cref.$$autoload && cref.$$autoload[name]) {
312        return handle_autoload(cref, name);
313      }
314    }
315  }
316
317  // Walk up the nesting array looking for the constant
318  function const_lookup_nesting(nesting, name) {
319    var i, ii, constant;
320
321    if (nesting.length === 0) return;
322
323    // If the nesting is not empty the constant is looked up in its elements
324    // and in order. The ancestors of those elements are ignored.
325    for (i = 0, ii = nesting.length; i < ii; i++) {
326      constant = nesting[i].$$const[name];
327      if (constant != null) {
328        return constant;
329      } else if (nesting[i].$$autoload && nesting[i].$$autoload[name]) {
330        return handle_autoload(nesting[i], name);
331      }
332    }
333  }
334
335  // Walk up the ancestors chain looking for the constant
336  function const_lookup_ancestors(cref, name) {
337    var i, ii, ancestors;
338
339    if (cref == null) return;
340
341    ancestors = $ancestors(cref);
342
343    for (i = 0, ii = ancestors.length; i < ii; i++) {
344      if (ancestors[i].$$const && $has_own(ancestors[i].$$const, name)) {
345        return ancestors[i].$$const[name];
346      } else if (ancestors[i].$$autoload && ancestors[i].$$autoload[name]) {
347        return handle_autoload(ancestors[i], name);
348      }
349    }
350  }
351
352  // Walk up Object's ancestors chain looking for the constant,
353  // but only if cref is missing or a module.
354  function const_lookup_Object(cref, name) {
355    if (cref == null || cref.$$is_module) {
356      return const_lookup_ancestors(_Object, name);
357    }
358  }
359
360  // Call const_missing if nothing else worked
361  function const_missing(cref, name) {
362    return (cref || _Object).$const_missing(name);
363  }
364
365  // Look for the constant just in the current cref or call `#const_missing`
366  Opal.const_get_local = function(cref, name, skip_missing) {
367    var result;
368
369    if (cref == null) return;
370
371    if (cref === '::') cref = _Object;
372
373    if (!cref.$$is_module && !cref.$$is_class) {
374      $raise(Opal.TypeError, cref.toString() + " is not a class/module");
375    }
376
377    result = const_get_name(cref, name);
378    return result != null || skip_missing ? result : const_missing(cref, name);
379  };
380
381  // Look for the constant relative to a cref or call `#const_missing` (when the
382  // constant is prefixed by `::`).
383  Opal.const_get_qualified = function(cref, name, skip_missing) {
384    var result, cache, cached, current_version = Opal.const_cache_version;
385
386    if (name == null) {
387      // A shortpath for calls like ::String => $$$("String")
388      result = const_get_name(_Object, cref);
389
390      if (result != null) return result;
391      return Opal.const_get_qualified(_Object, cref, skip_missing);
392    }
393
394    if (cref == null) return;
395
396    if (cref === '::') cref = _Object;
397
398    if (!cref.$$is_module && !cref.$$is_class) {
399      $raise(Opal.TypeError, cref.toString() + " is not a class/module");
400    }
401
402    if ((cache = cref.$$const_cache) == null) {
403      $prop(cref, '$$const_cache', Object.create(null));
404      cache = cref.$$const_cache;
405    }
406    cached = cache[name];
407
408    if (cached == null || cached[0] !== current_version) {
409      ((result = const_get_name(cref, name))              != null) ||
410      ((result = const_lookup_ancestors(cref, name))      != null);
411      cache[name] = [current_version, result];
412    } else {
413      result = cached[1];
414    }
415
416    return result != null || skip_missing ? result : const_missing(cref, name);
417  };
418
419  // Initialize the top level constant cache generation counter
420  Opal.const_cache_version = 1;
421
422  // Look for the constant in the open using the current nesting and the nearest
423  // cref ancestors or call `#const_missing` (when the constant has no :: prefix).
424  Opal.const_get_relative = function(nesting, name, skip_missing) {
425    var cref = nesting[0], result, current_version = Opal.const_cache_version, cache, cached;
426
427    if ((cache = nesting.$$const_cache) == null) {
428      $prop(nesting, '$$const_cache', Object.create(null));
429      cache = nesting.$$const_cache;
430    }
431    cached = cache[name];
432
433    if (cached == null || cached[0] !== current_version) {
434      ((result = const_get_name(cref, name))              != null) ||
435      ((result = const_lookup_nesting(nesting, name))     != null) ||
436      ((result = const_lookup_ancestors(cref, name))      != null) ||
437      ((result = const_lookup_Object(cref, name))         != null);
438
439      cache[name] = [current_version, result];
440    } else {
441      result = cached[1];
442    }
443
444    return result != null || skip_missing ? result : const_missing(cref, name);
445  };
446
447  // Register the constant on a cref and opportunistically set the name of
448  // unnamed classes/modules.
449  function $const_set(cref, name, value) {
450    var new_const = true;
451
452    if (cref == null || cref === '::') cref = _Object;
453
454    if (value.$$is_a_module) {
455      if (value.$$name == null || value.$$name === nil) value.$$name = name;
456      if (value.$$base_module == null) value.$$base_module = cref;
457    }
458
459    cref.$$const = (cref.$$const || Object.create(null));
460
461    if (name in cref.$$const || ("$$autoload" in cref && name in cref.$$autoload)) {
462      new_const = false;
463    }
464
465    cref.$$const[name] = value;
466
467    // Add a short helper to navigate constants manually.
468    // @example
469    //   Opal.$$.Regexp.$$.IGNORECASE
470    cref.$$ = cref.$$const;
471
472    Opal.const_cache_version++;
473
474    // Expose top level constants onto the Opal object
475    if (cref === _Object) Opal[name] = value;
476
477    // Name new class directly onto current scope (Opal.Foo.Baz = klass)
478    $prop(cref, name, value);
479
480    if (new_const && cref.$const_added && !cref.$const_added.$$pristine) {
481      cref.$const_added(name);
482    }
483
484    return value;
485  }
486  Opal.const_set = $const_set;
487
488  // Get all the constants reachable from a given cref, by default will include
489  // inherited constants.
490  Opal.constants = function(cref, inherit) {
491    if (inherit == null) inherit = true;
492
493    var module, modules = [cref], i, ii, constants = {}, constant;
494
495    if (inherit) modules = modules.concat($ancestors(cref));
496    if (inherit && cref.$$is_module) modules = modules.concat([Opal.Object]).concat($ancestors(Opal.Object));
497
498    for (i = 0, ii = modules.length; i < ii; i++) {
499      module = modules[i];
500
501      // Do not show Objects constants unless we're querying Object itself
502      if (cref !== _Object && module == _Object) break;
503
504      for (constant in module.$$const) {
505        constants[constant] = true;
506      }
507      if (module.$$autoload) {
508        for (constant in module.$$autoload) {
509          constants[constant] = true;
510        }
511      }
512    }
513
514    return Object.keys(constants);
515  };
516
517  // Remove a constant from a cref.
518  Opal.const_remove = function(cref, name) {
519    Opal.const_cache_version++;
520
521    if (cref.$$const[name] != null) {
522      var old = cref.$$const[name];
523      delete cref.$$const[name];
524      return old;
525    }
526
527    if (cref.$$autoload && cref.$$autoload[name]) {
528      delete cref.$$autoload[name];
529      return nil;
530    }
531
532    $raise(Opal.NameError, "constant "+cref+"::"+cref.$name()+" not defined");
533  };
534
535  // Generates a function that is a curried const_get_relative.
536  Opal.const_get_relative_factory = function(nesting) {
537    return function(name, skip_missing) {
538      return Opal.$$(nesting, name, skip_missing);
539    }
540  };
541
542  // Setup some shortcuts to reduce compiled size
543  Opal.$$ = Opal.const_get_relative;
544  Opal.$$$ = Opal.const_get_qualified;
545  Opal.$r = Opal.const_get_relative_factory;
546
547  // Modules & Classes
548  // -----------------
549
550  // A `class Foo; end` expression in ruby is compiled to call this runtime
551  // method which either returns an existing class of the given name, or creates
552  // a new class in the given `base` scope.
553  //
554  // If a constant with the given name exists, then we check to make sure that
555  // it is a class and also that the superclasses match. If either of these
556  // fail, then we raise a `TypeError`. Note, `superclass` may be null if one
557  // was not specified in the ruby code.
558  //
559  // We pass a constructor to this method of the form `function ClassName() {}`
560  // simply so that classes show up with nicely formatted names inside debuggers
561  // in the web browser (or node/sprockets).
562  //
563  // The `scope` is the current `self` value where the class is being created
564  // from. We use this to get the scope for where the class should be created.
565  // If `scope` is an object (not a class/module), we simple get its class and
566  // use that as the scope instead.
567  //
568  // @param scope        [Object] where the class is being created
569  // @param superclass   [Class,null] superclass of the new class (may be null)
570  // @param singleton    [Boolean,null] a true value denotes we want to allocate
571  //                                    a singleton
572  //
573  // @return new [Class]  or existing ruby class
574  //
575  function $allocate_class(name, superclass, singleton) {
576    var klass;
577
578    if (superclass != null && superclass.$$bridge) {
579      // Inheritance from bridged classes requires
580      // calling original JS constructors
581      klass = function() {
582        var args = $slice(arguments),
583            self = new ($bind.apply(superclass.$$constructor, [null].concat(args)))();
584
585        // and replacing a __proto__ manually
586        $set_proto(self, klass.$$prototype);
587        return self;
588      };
589    } else {
590      klass = function(){};
591    }
592
593    if (name && name !== nil) {
594      $prop(klass, 'displayName', '::'+name);
595    }
596
597    $prop(klass, '$$name', name);
598    $prop(klass, '$$constructor', klass);
599    $prop(klass, '$$prototype', klass.prototype);
600    $prop(klass, '$$const', {});
601    $prop(klass, '$$is_class', true);
602    $prop(klass, '$$is_a_module', true);
603    $prop(klass, '$$super', superclass);
604    $prop(klass, '$$cvars', {});
605    $prop(klass, '$$own_included_modules', []);
606    $prop(klass, '$$own_prepended_modules', []);
607    $prop(klass, '$$ancestors', []);
608    $prop(klass, '$$ancestors_cache_version', null);
609    $prop(klass, '$$subclasses', []);
610
611    $prop(klass.$$prototype, '$$class', klass);
612
613    // By default if there are no singleton class methods
614    // __proto__ is Class.prototype
615    // Later singleton methods generate a singleton_class
616    // and inject it into ancestors chain
617    if (Opal.Class) {
618      $set_proto(klass, Opal.Class.prototype);
619    }
620
621    if (superclass != null) {
622      $set_proto(klass.$$prototype, superclass.$$prototype);
623
624      if (singleton !== true) {
625        // Let's not forbid GC from cleaning up our
626        // subclasses.
627        if (typeof WeakRef !== 'undefined') {
628          // First, let's clean up our array from empty objects.
629          var i, subclass, rebuilt_subclasses = [];
630          for (i = 0; i < superclass.$$subclasses.length; i++) {
631            subclass = superclass.$$subclasses[i];
632            if (subclass.deref() !== undefined) {
633              rebuilt_subclasses.push(subclass);
634            }
635          }
636          // Now, let's add our class.
637          rebuilt_subclasses.push(new WeakRef(klass));
638          superclass.$$subclasses = rebuilt_subclasses;
639        }
640        else {
641          superclass.$$subclasses.push(klass);
642        }
643      }
644
645      if (superclass.$$meta) {
646        // If superclass has metaclass then we have explicitely inherit it.
647        Opal.build_class_singleton_class(klass);
648      }
649    }
650
651    return klass;
652  }  Opal.allocate_class = $allocate_class;
653
654
655  function find_existing_class(scope, name) {
656    // Try to find the class in the current scope
657    var klass = const_get_name(scope, name);
658
659    // If the class exists in the scope, then we must use that
660    if (klass) {
661      // Make sure the existing constant is a class, or raise error
662      if (!klass.$$is_class) {
663        $raise(Opal.TypeError, name + " is not a class");
664      }
665
666      return klass;
667    }
668  }
669
670  function ensureSuperclassMatch(klass, superclass) {
671    if (klass.$$super !== superclass) {
672      $raise(Opal.TypeError, "superclass mismatch for class " + klass.$$name);
673    }
674  }
675
676  Opal.klass = function(scope, superclass, name) {
677    var bridged;
678
679    if (scope == null || scope == '::') {
680      // Global scope
681      scope = _Object;
682    } else if (!scope.$$is_class && !scope.$$is_module) {
683      // Scope is an object, use its class
684      scope = scope.$$class;
685    }
686
687    // If the superclass is not an Opal-generated class then we're bridging a native JS class
688    if (
689      superclass != null && (!superclass.hasOwnProperty || (
690        superclass.hasOwnProperty && !superclass.hasOwnProperty('$$is_class')
691      ))
692    ) {
693      if (superclass.constructor && superclass.constructor.name == "Function") {
694        bridged = superclass;
695        superclass = _Object;
696      } else {
697        $raise(Opal.TypeError, "superclass must be a Class (" + (
698          (superclass.constructor && (superclass.constructor.name || superclass.constructor.$$name)) ||
699          typeof(superclass)
700        ) + " given)");
701      }
702    }
703
704    var klass = find_existing_class(scope, name);
705
706    if (klass != null) {
707      if (superclass) {
708        // Make sure existing class has same superclass
709        ensureSuperclassMatch(klass, superclass);
710      }
711    }
712    else {
713      // Class doesn't exist, create a new one with given superclass...
714
715      // Not specifying a superclass means we can assume it to be Object
716      if (superclass == null) {
717        superclass = _Object;
718      }
719
720      // Create the class object (instance of Class)
721      klass = $allocate_class(name, superclass);
722      $const_set(scope, name, klass);
723
724      // Call .inherited() hook with new class on the superclass
725      if (superclass.$inherited) {
726        superclass.$inherited(klass);
727      }
728
729      if (bridged) {
730        Opal.bridge(bridged, klass);
731      }
732    }
733
734    if (Opal.trace_class) { invoke_tracers_for_class(klass); }
735
736    return klass;
737  };
738
739  // Define new module (or return existing module). The given `scope` is basically
740  // the current `self` value the `module` statement was defined in. If this is
741  // a ruby module or class, then it is used, otherwise if the scope is a ruby
742  // object then that objects real ruby class is used (e.g. if the scope is the
743  // main object, then the top level `Object` class is used as the scope).
744  //
745  // If a module of the given name is already defined in the scope, then that
746  // instance is just returned.
747  //
748  // If there is a class of the given name in the scope, then an error is
749  // generated instead (cannot have a class and module of same name in same scope).
750  //
751  // Otherwise, a new module is created in the scope with the given name, and that
752  // new instance is returned back (to be referenced at runtime).
753  //
754  // @param  scope [Module, Class] class or module this definition is inside
755  // @param  id   [String] the name of the new (or existing) module
756  //
757  // @return [Module]
758  function $allocate_module(name) {
759    var constructor = function(){};
760    var module = constructor;
761
762    if (name)
763      $prop(constructor, 'displayName', name+'.constructor');
764
765    $prop(module, '$$name', name);
766    $prop(module, '$$prototype', constructor.prototype);
767    $prop(module, '$$const', {});
768    $prop(module, '$$is_module', true);
769    $prop(module, '$$is_a_module', true);
770    $prop(module, '$$cvars', {});
771    $prop(module, '$$iclasses', []);
772    $prop(module, '$$own_included_modules', []);
773    $prop(module, '$$own_prepended_modules', []);
774    $prop(module, '$$ancestors', [module]);
775    $prop(module, '$$ancestors_cache_version', null);
776
777    $set_proto(module, Opal.Module.prototype);
778
779    return module;
780  }  Opal.allocate_module = $allocate_module;
781
782  function find_existing_module(scope, name) {
783    var module = const_get_name(scope, name);
784    if (module == null && scope === _Object) module = const_lookup_ancestors(_Object, name);
785
786    if (module) {
787      if (!module.$$is_module && module !== _Object) {
788        $raise(Opal.TypeError, name + " is not a module");
789      }
790    }
791
792    return module;
793  }
794
795  Opal.module = function(scope, name) {
796    var module;
797
798    if (scope == null || scope == '::') {
799      // Global scope
800      scope = _Object;
801    } else if (!scope.$$is_class && !scope.$$is_module) {
802      // Scope is an object, use its class
803      scope = scope.$$class;
804    }
805
806    module = find_existing_module(scope, name);
807
808    if (module == null) {
809      // Module doesnt exist, create a new one...
810      module = $allocate_module(name);
811      $const_set(scope, name, module);
812    }
813
814    if (Opal.trace_class) { invoke_tracers_for_class(module); }
815
816    return module;
817  };
818
819  // Return the singleton class for the passed object.
820  //
821  // If the given object alredy has a singleton class, then it will be stored on
822  // the object as the `$$meta` property. If this exists, then it is simply
823  // returned back.
824  //
825  // Otherwise, a new singleton object for the class or object is created, set on
826  // the object at `$$meta` for future use, and then returned.
827  //
828  // @param object [Object] the ruby object
829  // @return [Class] the singleton class for object
830  Opal.get_singleton_class = function(object) {
831    if (object.$$is_number) {
832      $raise(Opal.TypeError, "can't define singleton");
833    }
834    if (object.$$meta) {
835      return object.$$meta;
836    }
837
838    if (object.hasOwnProperty('$$is_class')) {
839      return Opal.build_class_singleton_class(object);
840    } else if (object.hasOwnProperty('$$is_module')) {
841      return Opal.build_module_singleton_class(object);
842    } else {
843      return Opal.build_object_singleton_class(object);
844    }
845  };
846
847  // helper to set $$meta on klass, module or instance
848  function set_meta(obj, meta) {
849    if (obj.hasOwnProperty('$$meta')) {
850      obj.$$meta = meta;
851    } else {
852      $prop(obj, '$$meta', meta);
853    }
854    if (obj.$$frozen) {
855      // If a object is frozen (sealed), freeze $$meta too.
856      // No need to inject $$meta.$$prototype in the prototype chain,
857      // as $$meta cannot be modified anyway.
858      obj.$$meta.$freeze();
859    } else {
860      $set_proto(obj, meta.$$prototype);
861    }
862  }
863  // Build the singleton class for an existing class. Class object are built
864  // with their singleton class already in the prototype chain and inheriting
865  // from their superclass object (up to `Class` itself).
866  //
867  // NOTE: Actually in MRI a class' singleton class inherits from its
868  // superclass' singleton class which in turn inherits from Class.
869  //
870  // @param klass [Class]
871  // @return [Class]
872  Opal.build_class_singleton_class = function(klass) {
873    if (klass.$$meta) {
874      return klass.$$meta;
875    }
876
877    // The singleton_class superclass is the singleton_class of its superclass;
878    // but BasicObject has no superclass (its `$$super` is null), thus we
879    // fallback on `Class`.
880    var superclass = klass === BasicObject ? Class : Opal.get_singleton_class(klass.$$super);
881
882    var meta = $allocate_class(null, superclass, true);
883
884    $prop(meta, '$$is_singleton', true);
885    $prop(meta, '$$singleton_of', klass);
886    set_meta(klass, meta);
887    // Restoring ClassName.class
888    $prop(klass, '$$class', Opal.Class);
889
890    return meta;
891  };
892
893  Opal.build_module_singleton_class = function(mod) {
894    if (mod.$$meta) {
895      return mod.$$meta;
896    }
897
898    var meta = $allocate_class(null, Opal.Module, true);
899
900    $prop(meta, '$$is_singleton', true);
901    $prop(meta, '$$singleton_of', mod);
902    set_meta(mod, meta);
903    // Restoring ModuleName.class
904    $prop(mod, '$$class', Opal.Module);
905
906    return meta;
907  };
908
909  // Build the singleton class for a Ruby (non class) Object.
910  //
911  // @param object [Object]
912  // @return [Class]
913  Opal.build_object_singleton_class = function(object) {
914    var superclass = object.$$class,
915        klass = $allocate_class(nil, superclass, true);
916
917    $prop(klass, '$$is_singleton', true);
918    $prop(klass, '$$singleton_of', object);
919
920    delete klass.$$prototype.$$class;
921
922    set_meta(object, klass);
923
924    return klass;
925  };
926
927  Opal.is_method = function(prop) {
928    return (prop[0] === '$' && prop[1] !== '$');
929  };
930
931  Opal.instance_methods = function(mod) {
932    var exclude = [], results = [], ancestors = $ancestors(mod);
933
934    for (var i = 0, l = ancestors.length; i < l; i++) {
935      var ancestor = ancestors[i],
936          proto = ancestor.$$prototype;
937
938      if (proto.hasOwnProperty('$$dummy')) {
939        proto = proto.$$define_methods_on;
940      }
941
942      var props = Object.getOwnPropertyNames(proto);
943
944      for (var j = 0, ll = props.length; j < ll; j++) {
945        var prop = props[j];
946
947        if (Opal.is_method(prop)) {
948          var method_name = prop.slice(1),
949              method = proto[prop];
950
951          if (method.$$stub && exclude.indexOf(method_name) === -1) {
952            exclude.push(method_name);
953          }
954
955          if (!method.$$stub && results.indexOf(method_name) === -1 && exclude.indexOf(method_name) === -1) {
956            results.push(method_name);
957          }
958        }
959      }
960    }
961
962    return results;
963  };
964
965  Opal.own_instance_methods = function(mod) {
966    var results = [],
967        proto = mod.$$prototype;
968
969    if (proto.hasOwnProperty('$$dummy')) {
970      proto = proto.$$define_methods_on;
971    }
972
973    var props = Object.getOwnPropertyNames(proto);
974
975    for (var i = 0, length = props.length; i < length; i++) {
976      var prop = props[i];
977
978      if (Opal.is_method(prop)) {
979        var method = proto[prop];
980
981        if (!method.$$stub) {
982          var method_name = prop.slice(1);
983          results.push(method_name);
984        }
985      }
986    }
987
988    return results;
989  };
990
991  Opal.methods = function(obj) {
992    return Opal.instance_methods(obj.$$meta || obj.$$class);
993  };
994
995  Opal.own_methods = function(obj) {
996    return obj.$$meta ? Opal.own_instance_methods(obj.$$meta) : [];
997  };
998
999  Opal.receiver_methods = function(obj) {
1000    var mod = Opal.get_singleton_class(obj);
1001    var singleton_methods = Opal.own_instance_methods(mod);
1002    var instance_methods = Opal.own_instance_methods(mod.$$super);
1003    return singleton_methods.concat(instance_methods);
1004  };
1005
1006  // Returns an object containing all pairs of names/values
1007  // for all class variables defined in provided +module+
1008  // and its ancestors.
1009  //
1010  // @param module [Module]
1011  // @return [Object]
1012  Opal.class_variables = function(module) {
1013    var ancestors = $ancestors(module),
1014        i, length = ancestors.length,
1015        result = {};
1016
1017    for (i = length - 1; i >= 0; i--) {
1018      var ancestor = ancestors[i];
1019
1020      for (var cvar in ancestor.$$cvars) {
1021        result[cvar] = ancestor.$$cvars[cvar];
1022      }
1023    }
1024
1025    return result;
1026  };
1027
1028  // Sets class variable with specified +name+ to +value+
1029  // in provided +module+
1030  //
1031  // @param module [Module]
1032  // @param name [String]
1033  // @param value [Object]
1034  Opal.class_variable_set = function(module, name, value) {
1035    var ancestors = $ancestors(module),
1036        i, length = ancestors.length;
1037
1038    for (i = length - 2; i >= 0; i--) {
1039      var ancestor = ancestors[i];
1040
1041      if ($has_own(ancestor.$$cvars, name)) {
1042        ancestor.$$cvars[name] = value;
1043        return value;
1044      }
1045    }
1046
1047    module.$$cvars[name] = value;
1048
1049    return value;
1050  };
1051
1052  // Gets class variable with specified +name+ from provided +module+
1053  //
1054  // @param module [Module]
1055  // @param name [String]
1056  Opal.class_variable_get = function(module, name, tolerant) {
1057    if ($has_own(module.$$cvars, name))
1058      return module.$$cvars[name];
1059
1060    var ancestors = $ancestors(module),
1061      i, length = ancestors.length;
1062
1063    for (i = 0; i < length; i++) {
1064      var ancestor = ancestors[i];
1065
1066      if ($has_own(ancestor.$$cvars, name)) {
1067        return ancestor.$$cvars[name];
1068      }
1069    }
1070
1071    if (!tolerant)
1072      $raise(Opal.NameError, 'uninitialized class variable '+name+' in '+module.$name());
1073
1074    return nil;
1075  };
1076
1077  function isRoot(proto) {
1078    return proto.hasOwnProperty('$$iclass') && proto.hasOwnProperty('$$root');
1079  }
1080
1081  function own_included_modules(module) {
1082    var result = [], mod, proto = Object.getPrototypeOf(module.$$prototype);
1083
1084    while (proto) {
1085      if (proto.hasOwnProperty('$$class')) {
1086        // superclass
1087        break;
1088      }
1089      mod = protoToModule(proto);
1090      if (mod) {
1091        result.push(mod);
1092      }
1093      proto = Object.getPrototypeOf(proto);
1094    }
1095
1096    return result;
1097  }
1098
1099  function own_prepended_modules(module) {
1100    var result = [], mod, proto = Object.getPrototypeOf(module.$$prototype);
1101
1102    if (module.$$prototype.hasOwnProperty('$$dummy')) {
1103      while (proto) {
1104        if (proto === module.$$prototype.$$define_methods_on) {
1105          break;
1106        }
1107
1108        mod = protoToModule(proto);
1109        if (mod) {
1110          result.push(mod);
1111        }
1112
1113        proto = Object.getPrototypeOf(proto);
1114      }
1115    }
1116
1117    return result;
1118  }
1119
1120
1121  // The actual inclusion of a module into a class.
1122  //
1123  // ## Class `$$parent` and `iclass`
1124  //
1125  // To handle `super` calls, every class has a `$$parent`. This parent is
1126  // used to resolve the next class for a super call. A normal class would
1127  // have this point to its superclass. However, if a class includes a module
1128  // then this would need to take into account the module. The module would
1129  // also have to then point its `$$parent` to the actual superclass. We
1130  // cannot modify modules like this, because it might be included in more
1131  // then one class. To fix this, we actually insert an `iclass` as the class'
1132  // `$$parent` which can then point to the superclass. The `iclass` acts as
1133  // a proxy to the actual module, so the `super` chain can then search it for
1134  // the required method.
1135  //
1136  // @param module [Module] the module to include
1137  // @param includer [Module] the target class to include module into
1138  // @return [null]
1139  Opal.append_features = function(module, includer) {
1140    var module_ancestors = $ancestors(module);
1141    var iclasses = [];
1142
1143    if (module_ancestors.indexOf(includer) !== -1) {
1144      $raise(Opal.ArgumentError, 'cyclic include detected');
1145    }
1146
1147    for (var i = 0, length = module_ancestors.length; i < length; i++) {
1148      var ancestor = module_ancestors[i], iclass = create_iclass(ancestor);
1149      $prop(iclass, '$$included', true);
1150      iclasses.push(iclass);
1151    }
1152    var includer_ancestors = $ancestors(includer),
1153        chain = chain_iclasses(iclasses),
1154        start_chain_after,
1155        end_chain_on;
1156
1157    if (includer_ancestors.indexOf(module) === -1) {
1158      // first time include
1159
1160      // includer -> chain.first -> ...chain... -> chain.last -> includer.parent
1161      start_chain_after = includer.$$prototype;
1162      end_chain_on = Object.getPrototypeOf(includer.$$prototype);
1163    } else {
1164      // The module has been already included,
1165      // we don't need to put it into the ancestors chain again,
1166      // but this module may have new included modules.
1167      // If it's true we need to copy them.
1168      //
1169      // The simplest way is to replace ancestors chain from
1170      //          parent
1171      //            |
1172      //   `module` iclass (has a $$root flag)
1173      //            |
1174      //   ...previos chain of module.included_modules ...
1175      //            |
1176      //  "next ancestor" (has a $$root flag or is a real class)
1177      //
1178      // to
1179      //          parent
1180      //            |
1181      //    `module` iclass (has a $$root flag)
1182      //            |
1183      //   ...regenerated chain of module.included_modules
1184      //            |
1185      //   "next ancestor" (has a $$root flag or is a real class)
1186      //
1187      // because there are no intermediate classes between `parent` and `next ancestor`.
1188      // It doesn't break any prototypes of other objects as we don't change class references.
1189
1190      var parent = includer.$$prototype, module_iclass = Object.getPrototypeOf(parent);
1191
1192      while (module_iclass != null) {
1193        if (module_iclass.$$module === module && isRoot(module_iclass)) {
1194          break;
1195        }
1196
1197        parent = module_iclass;
1198        module_iclass = Object.getPrototypeOf(module_iclass);
1199      }
1200
1201      if (module_iclass) {
1202        // module has been directly included
1203        var next_ancestor = Object.getPrototypeOf(module_iclass);
1204
1205        // skip non-root iclasses (that were recursively included)
1206        while (next_ancestor.hasOwnProperty('$$iclass') && !isRoot(next_ancestor)) {
1207          next_ancestor = Object.getPrototypeOf(next_ancestor);
1208        }
1209
1210        start_chain_after = parent;
1211        end_chain_on = next_ancestor;
1212      } else {
1213        // module has not been directly included but was in ancestor chain because it was included by another module
1214        // include it directly
1215        start_chain_after = includer.$$prototype;
1216        end_chain_on = Object.getPrototypeOf(includer.$$prototype);
1217      }
1218    }
1219
1220    $set_proto(start_chain_after, chain.first);
1221    $set_proto(chain.last, end_chain_on);
1222
1223    // recalculate own_included_modules cache
1224    includer.$$own_included_modules = own_included_modules(includer);
1225
1226    Opal.const_cache_version++;
1227  };
1228
1229  Opal.prepend_features = function(module, prepender) {
1230    // Here we change the ancestors chain from
1231    //
1232    //   prepender
1233    //      |
1234    //    parent
1235    //
1236    // to:
1237    //
1238    // dummy(prepender)
1239    //      |
1240    //  iclass(module)
1241    //      |
1242    // iclass(prepender)
1243    //      |
1244    //    parent
1245    var module_ancestors = $ancestors(module);
1246    var iclasses = [];
1247
1248    if (module_ancestors.indexOf(prepender) !== -1) {
1249      $raise(Opal.ArgumentError, 'cyclic prepend detected');
1250    }
1251
1252    for (var i = 0, length = module_ancestors.length; i < length; i++) {
1253      var ancestor = module_ancestors[i], iclass = create_iclass(ancestor);
1254      $prop(iclass, '$$prepended', true);
1255      iclasses.push(iclass);
1256    }
1257
1258    var chain = chain_iclasses(iclasses),
1259        dummy_prepender = prepender.$$prototype,
1260        previous_parent = Object.getPrototypeOf(dummy_prepender),
1261        prepender_iclass,
1262        start_chain_after,
1263        end_chain_on;
1264
1265    if (dummy_prepender.hasOwnProperty('$$dummy')) {
1266      // The module already has some prepended modules
1267      // which means that we don't need to make it "dummy"
1268      prepender_iclass = dummy_prepender.$$define_methods_on;
1269    } else {
1270      // Making the module "dummy"
1271      prepender_iclass = create_dummy_iclass(prepender);
1272      flush_methods_in(prepender);
1273      $prop(dummy_prepender, '$$dummy', true);
1274      $prop(dummy_prepender, '$$define_methods_on', prepender_iclass);
1275
1276      // Converting
1277      //   dummy(prepender) -> previous_parent
1278      // to
1279      //   dummy(prepender) -> iclass(prepender) -> previous_parent
1280      $set_proto(dummy_prepender, prepender_iclass);
1281      $set_proto(prepender_iclass, previous_parent);
1282    }
1283
1284    var prepender_ancestors = $ancestors(prepender);
1285
1286    if (prepender_ancestors.indexOf(module) === -1) {
1287      // first time prepend
1288
1289      start_chain_after = dummy_prepender;
1290
1291      // next $$root or prepender_iclass or non-$$iclass
1292      end_chain_on = Object.getPrototypeOf(dummy_prepender);
1293      while (end_chain_on != null) {
1294        if (
1295          end_chain_on.hasOwnProperty('$$root') ||
1296          end_chain_on === prepender_iclass ||
1297          !end_chain_on.hasOwnProperty('$$iclass')
1298        ) {
1299          break;
1300        }
1301
1302        end_chain_on = Object.getPrototypeOf(end_chain_on);
1303      }
1304    } else {
1305      $raise(Opal.RuntimeError, "Prepending a module multiple times is not supported");
1306    }
1307
1308    $set_proto(start_chain_after, chain.first);
1309    $set_proto(chain.last, end_chain_on);
1310
1311    // recalculate own_prepended_modules cache
1312    prepender.$$own_prepended_modules = own_prepended_modules(prepender);
1313
1314    Opal.const_cache_version++;
1315  };
1316
1317  function flush_methods_in(module) {
1318    var proto = module.$$prototype,
1319        props = Object.getOwnPropertyNames(proto);
1320
1321    for (var i = 0; i < props.length; i++) {
1322      var prop = props[i];
1323      if (Opal.is_method(prop)) {
1324        delete proto[prop];
1325      }
1326    }
1327  }
1328
1329  function create_iclass(module) {
1330    var iclass = create_dummy_iclass(module);
1331
1332    if (module.$$is_module) {
1333      module.$$iclasses.push(iclass);
1334    }
1335
1336    return iclass;
1337  }
1338
1339  // Dummy iclass doesn't receive updates when the module gets a new method.
1340  function create_dummy_iclass(module) {
1341    var iclass = {},
1342        proto = module.$$prototype;
1343
1344    if (proto.hasOwnProperty('$$dummy')) {
1345      proto = proto.$$define_methods_on;
1346    }
1347
1348    var props = Object.getOwnPropertyNames(proto),
1349        length = props.length, i;
1350
1351    for (i = 0; i < length; i++) {
1352      var prop = props[i];
1353      $prop(iclass, prop, proto[prop]);
1354    }
1355
1356    $prop(iclass, '$$iclass', true);
1357    $prop(iclass, '$$module', module);
1358
1359    return iclass;
1360  }
1361
1362  function chain_iclasses(iclasses) {
1363    var length = iclasses.length, first = iclasses[0];
1364
1365    $prop(first, '$$root', true);
1366
1367    if (length === 1) {
1368      return { first: first, last: first };
1369    }
1370
1371    var previous = first;
1372
1373    for (var i = 1; i < length; i++) {
1374      var current = iclasses[i];
1375      $set_proto(previous, current);
1376      previous = current;
1377    }
1378
1379
1380    return { first: iclasses[0], last: iclasses[length - 1] };
1381  }
1382
1383  // For performance, some core Ruby classes are toll-free bridged to their
1384  // native JavaScript counterparts (e.g. a Ruby Array is a JavaScript Array).
1385  //
1386  // This method is used to setup a native constructor (e.g. Array), to have
1387  // its prototype act like a normal Ruby class. Firstly, a new Ruby class is
1388  // created using the native constructor so that its prototype is set as the
1389  // target for the new class. Note: all bridged classes are set to inherit
1390  // from Object.
1391  //
1392  // Example:
1393  //
1394  //    Opal.bridge(self, Function);
1395  //
1396  // @param klass       [Class] the Ruby class to bridge
1397  // @param constructor [JS.Function] native JavaScript constructor to use
1398  // @return [Class] returns the passed Ruby class
1399  //
1400  Opal.bridge = function(native_klass, klass) {
1401    if (native_klass.hasOwnProperty('$$bridge')) {
1402      $raise(Opal.ArgumentError, "already bridged");
1403    }
1404
1405    // constructor is a JS function with a prototype chain like:
1406    // - constructor
1407    //   - super
1408    //
1409    // What we need to do is to inject our class (with its prototype chain)
1410    // between constructor and super. For example, after injecting ::Object
1411    // into JS String we get:
1412    //
1413    // - constructor (window.String)
1414    //   - Opal.Object
1415    //     - Opal.Kernel
1416    //       - Opal.BasicObject
1417    //         - super (window.Object)
1418    //           - null
1419    //
1420    $prop(native_klass, '$$bridge', klass);
1421    $set_proto(native_klass.prototype, (klass.$$super || Opal.Object).$$prototype);
1422    $prop(klass, '$$prototype', native_klass.prototype);
1423
1424    $prop(klass.$$prototype, '$$class', klass);
1425    $prop(klass, '$$constructor', native_klass);
1426    $prop(klass, '$$bridge', true);
1427  };
1428
1429  function protoToModule(proto) {
1430    if (proto.hasOwnProperty('$$dummy')) {
1431      return;
1432    } else if (proto.hasOwnProperty('$$iclass')) {
1433      return proto.$$module;
1434    } else if (proto.hasOwnProperty('$$class')) {
1435      return proto.$$class;
1436    }
1437  }
1438
1439  function own_ancestors(module) {
1440    return module.$$own_prepended_modules.concat([module]).concat(module.$$own_included_modules);
1441  }
1442
1443  // The Array of ancestors for a given module/class
1444  function $ancestors(module) {
1445    if (!module) { return []; }
1446
1447    if (module.$$ancestors_cache_version === Opal.const_cache_version) {
1448      return module.$$ancestors;
1449    }
1450
1451    var result = [], i, mods, length;
1452
1453    for (i = 0, mods = own_ancestors(module), length = mods.length; i < length; i++) {
1454      result.push(mods[i]);
1455    }
1456
1457    if (module.$$super) {
1458      for (i = 0, mods = $ancestors(module.$$super), length = mods.length; i < length; i++) {
1459        result.push(mods[i]);
1460      }
1461    }
1462
1463    module.$$ancestors_cache_version = Opal.const_cache_version;
1464    module.$$ancestors = result;
1465
1466    return result;
1467  }  Opal.ancestors = $ancestors;
1468
1469  Opal.included_modules = function(module) {
1470    var result = [], mod = null, proto = Object.getPrototypeOf(module.$$prototype);
1471
1472    for (; proto && Object.getPrototypeOf(proto); proto = Object.getPrototypeOf(proto)) {
1473      mod = protoToModule(proto);
1474      if (mod && mod.$$is_module && proto.$$iclass && proto.$$included) {
1475        result.push(mod);
1476      }
1477    }
1478
1479    return result;
1480  };
1481
1482
1483  // Method Missing
1484  // --------------
1485
1486  // Methods stubs are used to facilitate method_missing in opal. A stub is a
1487  // placeholder function which just calls `method_missing` on the receiver.
1488  // If no method with the given name is actually defined on an object, then it
1489  // is obvious to say that the stub will be called instead, and then in turn
1490  // method_missing will be called.
1491  //
1492  // When a file in ruby gets compiled to javascript, it includes a call to
1493  // this function which adds stubs for every method name in the compiled file.
1494  // It should then be safe to assume that method_missing will work for any
1495  // method call detected.
1496  //
1497  // Method stubs are added to the BasicObject prototype, which every other
1498  // ruby object inherits, so all objects should handle method missing. A stub
1499  // is only added if the given property name (method name) is not already
1500  // defined.
1501  //
1502  // Note: all ruby methods have a `$` prefix in javascript, so all stubs will
1503  // have this prefix as well (to make this method more performant).
1504  //
1505  //    Opal.add_stubs("foo,bar,baz=");
1506  //
1507  // All stub functions will have a private `$$stub` property set to true so
1508  // that other internal methods can detect if a method is just a stub or not.
1509  // `Kernel#respond_to?` uses this property to detect a methods presence.
1510  //
1511  // @param stubs [Array] an array of method stubs to add
1512  // @return [undefined]
1513  Opal.add_stubs = function(stubs) {
1514    var proto = Opal.BasicObject.$$prototype;
1515    var stub, existing_method;
1516    stubs = stubs.split(',');
1517
1518    for (var i = 0, length = stubs.length; i < length; i++) {
1519      stub = $jsid(stubs[i]), existing_method = proto[stub];
1520
1521      if (existing_method == null || existing_method.$$stub) {
1522        Opal.add_stub_for(proto, stub);
1523      }
1524    }
1525  };
1526
1527  // Add a method_missing stub function to the given prototype for the
1528  // given name.
1529  //
1530  // @param prototype [Prototype] the target prototype
1531  // @param stub [String] stub name to add (e.g. "$foo")
1532  // @return [undefined]
1533  Opal.add_stub_for = function(prototype, stub) {
1534    // Opal.stub_for(stub) is the method_missing_stub
1535    $prop(prototype, stub, Opal.stub_for(stub));
1536  };
1537
1538  // Generate the method_missing stub for a given method name.
1539  //
1540  // @param method_name [String] The js-name of the method to stub (e.g. "$foo")
1541  // @return [undefined]
1542  Opal.stub_for = function(method_name) {
1543
1544    function method_missing_stub() {
1545      // Copy any given block onto the method_missing dispatcher
1546      this.$method_missing.$$p = method_missing_stub.$$p;
1547
1548      // Set block property to null ready for the next call (stop false-positives)
1549      method_missing_stub.$$p = null;
1550
1551      // call method missing with correct args (remove '$' prefix on method name)
1552      var args_ary = new Array(arguments.length);
1553      for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = arguments[i]; }
1554
1555      return this.$method_missing.apply(this, [method_name.slice(1)].concat(args_ary));
1556    }
1557
1558    method_missing_stub.$$stub = true;
1559
1560    return method_missing_stub;
1561  };
1562
1563
1564  // Methods
1565  // -------
1566
1567  // Arity count error dispatcher for methods
1568  //
1569  // @param actual [Fixnum] number of arguments given to method
1570  // @param expected [Fixnum] expected number of arguments
1571  // @param object [Object] owner of the method +meth+
1572  // @param meth [String] method name that got wrong number of arguments
1573  // @raise [ArgumentError]
1574  Opal.ac = function(actual, expected, object, meth) {
1575    var inspect = '';
1576    if (object.$$is_a_module) {
1577      inspect += object.$$name + '.';
1578    }
1579    else {
1580      inspect += object.$$class.$$name + '#';
1581    }
1582    inspect += meth;
1583
1584    $raise(Opal.ArgumentError, '[' + inspect + '] wrong number of arguments (given ' + actual + ', expected ' + expected + ')');
1585  };
1586
1587  // Arity count error dispatcher for blocks
1588  //
1589  // @param actual [Fixnum] number of arguments given to block
1590  // @param expected [Fixnum] expected number of arguments
1591  // @param context [Object] context of the block definition
1592  // @raise [ArgumentError]
1593  Opal.block_ac = function(actual, expected, context) {
1594    var inspect = "`block in " + context + "'";
1595
1596    $raise(Opal.ArgumentError, inspect + ': wrong number of arguments (given ' + actual + ', expected ' + expected + ')');
1597  };
1598
1599  function get_ancestors(obj) {
1600    if (obj.hasOwnProperty('$$meta') && obj.$$meta !== null) {
1601      return $ancestors(obj.$$meta);
1602    } else {
1603      return $ancestors(obj.$$class);
1604    }
1605  }
1606  // Super dispatcher
1607  Opal.find_super = function(obj, mid, current_func, defcheck, allow_stubs) {
1608    var jsid = $jsid(mid), ancestors, super_method;
1609
1610    ancestors = get_ancestors(obj);
1611
1612    var current_index = ancestors.indexOf(current_func.$$owner);
1613
1614    for (var i = current_index + 1; i < ancestors.length; i++) {
1615      var ancestor = ancestors[i],
1616          proto = ancestor.$$prototype;
1617
1618      if (proto.hasOwnProperty('$$dummy')) {
1619        proto = proto.$$define_methods_on;
1620      }
1621
1622      if (proto.hasOwnProperty(jsid)) {
1623        super_method = proto[jsid];
1624        break;
1625      }
1626    }
1627
1628    if (!defcheck && super_method && super_method.$$stub && obj.$method_missing.$$pristine) {
1629      // method_missing hasn't been explicitly defined
1630      $raise(Opal.NoMethodError, 'super: no superclass method `'+mid+"' for "+obj, mid);
1631    }
1632
1633    return (super_method.$$stub && !allow_stubs) ? null : super_method;
1634  };
1635
1636  // Iter dispatcher for super in a block
1637  Opal.find_block_super = function(obj, jsid, current_func, defcheck, implicit) {
1638    var call_jsid = jsid;
1639
1640    if (!current_func) {
1641      $raise(Opal.RuntimeError, "super called outside of method");
1642    }
1643
1644    if (implicit && current_func.$$define_meth) {
1645      $raise(Opal.RuntimeError,
1646        "implicit argument passing of super from method defined by define_method() is not supported. " +
1647        "Specify all arguments explicitly"
1648      );
1649    }
1650
1651    if (current_func.$$def) {
1652      call_jsid = current_func.$$jsid;
1653    }
1654
1655    return Opal.find_super(obj, call_jsid, current_func, defcheck);
1656  };
1657
1658  // @deprecated
1659  Opal.find_super_dispatcher = Opal.find_super;
1660
1661  // @deprecated
1662  Opal.find_iter_super_dispatcher = Opal.find_block_super;
1663
1664  // handles yield calls for 1 yielded arg
1665  Opal.yield1 = function(block, arg) {
1666    if (typeof(block) !== "function") {
1667      $raise(Opal.LocalJumpError, "no block given");
1668    }
1669
1670    var has_mlhs = block.$$has_top_level_mlhs_arg,
1671        has_trailing_comma = block.$$has_trailing_comma_in_args;
1672
1673    if (block.length > 1 || ((has_mlhs || has_trailing_comma) && block.length === 1)) {
1674      arg = Opal.to_ary(arg);
1675    }
1676
1677    if ((block.length > 1 || (has_trailing_comma && block.length === 1)) && arg.$$is_array) {
1678      return block.apply(null, arg);
1679    }
1680    else {
1681      return block(arg);
1682    }
1683  };
1684
1685  // handles yield for > 1 yielded arg
1686  Opal.yieldX = function(block, args) {
1687    if (typeof(block) !== "function") {
1688      $raise(Opal.LocalJumpError, "no block given");
1689    }
1690
1691    if (block.length > 1 && args.length === 1) {
1692      if (args[0].$$is_array) {
1693        return block.apply(null, args[0]);
1694      }
1695    }
1696
1697    if (!args.$$is_array) {
1698      var args_ary = new Array(args.length);
1699      for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = args[i]; }
1700
1701      return block.apply(null, args_ary);
1702    }
1703
1704    return block.apply(null, args);
1705  };
1706
1707  // Finds the corresponding exception match in candidates.  Each candidate can
1708  // be a value, or an array of values.  Returns null if not found.
1709  Opal.rescue = function(exception, candidates) {
1710    for (var i = 0; i < candidates.length; i++) {
1711      var candidate = candidates[i];
1712
1713      if (candidate.$$is_array) {
1714        var result = Opal.rescue(exception, candidate);
1715
1716        if (result) {
1717          return result;
1718        }
1719      }
1720      else if (candidate === Opal.JS.Error || candidate['$==='](exception)) {
1721        return candidate;
1722      }
1723    }
1724
1725    return null;
1726  };
1727
1728  Opal.is_a = function(object, klass) {
1729    if (klass != null && object.$$meta === klass || object.$$class === klass) {
1730      return true;
1731    }
1732
1733    if (object.$$is_number && klass.$$is_number_class) {
1734      return (klass.$$is_integer_class) ? (object % 1) === 0 : true;
1735    }
1736
1737    var ancestors = $ancestors(object.$$is_class ? Opal.get_singleton_class(object) : (object.$$meta || object.$$class));
1738
1739    return ancestors.indexOf(klass) !== -1;
1740  };
1741
1742  // Helpers for extracting kwsplats
1743  // Used for: { **h }
1744  Opal.to_hash = function(value) {
1745    if (value.$$is_hash) {
1746      return value;
1747    }
1748    else if (value['$respond_to?']('to_hash', true)) {
1749      var hash = value.$to_hash();
1750      if (hash.$$is_hash) {
1751        return hash;
1752      }
1753      else {
1754        $raise(Opal.TypeError, "Can't convert " + value.$$class +
1755          " to Hash (" + value.$$class + "#to_hash gives " + hash.$$class + ")");
1756      }
1757    }
1758    else {
1759      $raise(Opal.TypeError, "no implicit conversion of " + value.$$class + " into Hash");
1760    }
1761  };
1762
1763  // Helpers for implementing multiple assignment
1764  // Our code for extracting the values and assigning them only works if the
1765  // return value is a JS array.
1766  // So if we get an Array subclass, extract the wrapped JS array from it
1767
1768  // Used for: a, b = something (no splat)
1769  Opal.to_ary = function(value) {
1770    if (value.$$is_array) {
1771      return value;
1772    }
1773    else if (value['$respond_to?']('to_ary', true)) {
1774      var ary = value.$to_ary();
1775      if (ary === nil) {
1776        return [value];
1777      }
1778      else if (ary.$$is_array) {
1779        return ary;
1780      }
1781      else {
1782        $raise(Opal.TypeError, "Can't convert " + value.$$class +
1783          " to Array (" + value.$$class + "#to_ary gives " + ary.$$class + ")");
1784      }
1785    }
1786    else {
1787      return [value];
1788    }
1789  };
1790
1791  // Used for: a, b = *something (with splat)
1792  Opal.to_a = function(value) {
1793    if (value.$$is_array) {
1794      // A splatted array must be copied
1795      return value.slice();
1796    }
1797    else if (value['$respond_to?']('to_a', true)) {
1798      var ary = value.$to_a();
1799      if (ary === nil) {
1800        return [value];
1801      }
1802      else if (ary.$$is_array) {
1803        return ary;
1804      }
1805      else {
1806        $raise(Opal.TypeError, "Can't convert " + value.$$class +
1807          " to Array (" + value.$$class + "#to_a gives " + ary.$$class + ")");
1808      }
1809    }
1810    else {
1811      return [value];
1812    }
1813  };
1814
1815  // Used for extracting keyword arguments from arguments passed to
1816  // JS function. If provided +arguments+ list doesn't have a Hash
1817  // as a last item, returns a blank Hash.
1818  //
1819  // @param parameters [Array]
1820  // @return [Hash]
1821  //
1822  Opal.extract_kwargs = function(parameters) {
1823    var kwargs = parameters[parameters.length - 1];
1824    if (kwargs != null && Opal.respond_to(kwargs, '$to_hash', true)) {
1825      $splice(parameters, parameters.length - 1);
1826      return kwargs;
1827    }
1828  };
1829
1830  // Used to get a list of rest keyword arguments. Method takes the given
1831  // keyword args, i.e. the hash literal passed to the method containing all
1832  // keyword arguemnts passed to method, as well as the used args which are
1833  // the names of required and optional arguments defined. This method then
1834  // just returns all key/value pairs which have not been used, in a new
1835  // hash literal.
1836  //
1837  // @param given_args [Hash] all kwargs given to method
1838  // @param used_args [Object<String: true>] all keys used as named kwargs
1839  // @return [Hash]
1840  //
1841  Opal.kwrestargs = function(given_args, used_args) {
1842    var keys      = [],
1843        map       = {},
1844        key           ,
1845        given_map = given_args.$$smap;
1846
1847    for (key in given_map) {
1848      if (!used_args[key]) {
1849        keys.push(key);
1850        map[key] = given_map[key];
1851      }
1852    }
1853
1854    return Opal.hash2(keys, map);
1855  };
1856
1857  function apply_blockopts(block, blockopts) {
1858    if (typeof(blockopts) === 'number') {
1859      block.$$arity = blockopts;
1860    }
1861    else if (typeof(blockopts) === 'object') {
1862      Object.assign(block, blockopts);
1863    }
1864  }
1865
1866  // Optimization for a costly operation of prepending '$' to method names
1867  var jsid_cache = {};
1868  function $jsid(name) {
1869    return jsid_cache[name] || (jsid_cache[name] = '$' + name);
1870  }
1871  Opal.jsid = $jsid;
1872
1873  // Calls passed method on a ruby object with arguments and block:
1874  //
1875  // Can take a method or a method name.
1876  //
1877  // 1. When method name gets passed it invokes it by its name
1878  //    and calls 'method_missing' when object doesn't have this method.
1879  //    Used internally by Opal to invoke method that takes a block or a splat.
1880  // 2. When method (i.e. method body) gets passed, it doesn't trigger 'method_missing'
1881  //    because it doesn't know the name of the actual method.
1882  //    Used internally by Opal to invoke 'super'.
1883  //
1884  // @example
1885  //   var my_array = [1, 2, 3, 4]
1886  //   Opal.send(my_array, 'length')                    # => 4
1887  //   Opal.send(my_array, my_array.$length)            # => 4
1888  //
1889  //   Opal.send(my_array, 'reverse!')                  # => [4, 3, 2, 1]
1890  //   Opal.send(my_array, my_array['$reverse!']')      # => [4, 3, 2, 1]
1891  //
1892  // @param recv [Object] ruby object
1893  // @param method [Function, String] method body or name of the method
1894  // @param args [Array] arguments that will be passed to the method call
1895  // @param block [Function] ruby block
1896  // @param blockopts [Object, Number] optional properties to set on the block
1897  // @return [Object] returning value of the method call
1898  Opal.send = function(recv, method, args, block, blockopts) {
1899    var body;
1900
1901    if (typeof(method) === 'function') {
1902      body = method;
1903      method = null;
1904    } else if (typeof(method) === 'string') {
1905      body = recv[$jsid(method)];
1906    } else {
1907      $raise(Opal.NameError, "Passed method should be a string or a function");
1908    }
1909
1910    return Opal.send2(recv, body, method, args, block, blockopts);
1911  };
1912
1913  Opal.send2 = function(recv, body, method, args, block, blockopts) {
1914    if (body == null && method != null && recv.$method_missing) {
1915      body = recv.$method_missing;
1916      args = [method].concat(args);
1917    }
1918
1919    apply_blockopts(block, blockopts);
1920
1921    if (typeof block === 'function') body.$$p = block;
1922    return body.apply(recv, args);
1923  };
1924
1925  Opal.refined_send = function(refinement_groups, recv, method, args, block, blockopts) {
1926    var i, j, k, ancestors, ancestor, refinements, refinement, refine_modules, refine_module, body;
1927
1928    ancestors = get_ancestors(recv);
1929
1930    // For all ancestors that there are, starting from the closest to the furthest...
1931    for (i = 0; i < ancestors.length; i++) {
1932      ancestor = Opal.id(ancestors[i]);
1933
1934      // For all refinement groups there are, starting from the closest scope to the furthest...
1935      for (j = 0; j < refinement_groups.length; j++) {
1936        refinements = refinement_groups[j];
1937
1938        // For all refinements there are, starting from the last `using` call to the furthest...
1939        for (k = refinements.length - 1; k >= 0; k--) {
1940          refinement = refinements[k];
1941          if (typeof refinement.$$refine_modules === 'undefined') continue;
1942
1943          // A single module being given as an argument of the `using` call contains multiple
1944          // refinement modules
1945          refine_modules = refinement.$$refine_modules;
1946
1947          // Does this module refine a given call for a given ancestor module?
1948          if (typeof refine_modules[ancestor] === 'undefined') continue;
1949          refine_module = refine_modules[ancestor];
1950
1951          // Does this module define a method we want to call?
1952          if (typeof refine_module.$$prototype[$jsid(method)] !== 'undefined') {
1953            body = refine_module.$$prototype[$jsid(method)];
1954            return Opal.send2(recv, body, method, args, block, blockopts);
1955          }
1956        }
1957      }
1958    }
1959
1960    return Opal.send(recv, method, args, block, blockopts);
1961  };
1962
1963  Opal.lambda = function(block, blockopts) {
1964    block.$$is_lambda = true;
1965
1966    apply_blockopts(block, blockopts);
1967
1968    return block;
1969  };
1970
1971  // Used to define methods on an object. This is a helper method, used by the
1972  // compiled source to define methods on special case objects when the compiler
1973  // can not determine the destination object, or the object is a Module
1974  // instance. This can get called by `Module#define_method` as well.
1975  //
1976  // ## Modules
1977  //
1978  // Any method defined on a module will come through this runtime helper.
1979  // The method is added to the module body, and the owner of the method is
1980  // set to be the module itself. This is used later when choosing which
1981  // method should show on a class if more than 1 included modules define
1982  // the same method. Finally, if the module is in `module_function` mode,
1983  // then the method is also defined onto the module itself.
1984  //
1985  // ## Classes
1986  //
1987  // This helper will only be called for classes when a method is being
1988  // defined indirectly; either through `Module#define_method`, or by a
1989  // literal `def` method inside an `instance_eval` or `class_eval` body. In
1990  // either case, the method is simply added to the class' prototype. A special
1991  // exception exists for `BasicObject` and `Object`. These two classes are
1992  // special because they are used in toll-free bridged classes. In each of
1993  // these two cases, extra work is required to define the methods on toll-free
1994  // bridged class' prototypes as well.
1995  //
1996  // ## Objects
1997  //
1998  // If a simple ruby object is the object, then the method is simply just
1999  // defined on the object as a singleton method. This would be the case when
2000  // a method is defined inside an `instance_eval` block.
2001  //
2002  // @param obj  [Object, Class] the actual obj to define method for
2003  // @param jsid [String] the JavaScript friendly method name (e.g. '$foo')
2004  // @param body [JS.Function] the literal JavaScript function used as method
2005  // @param blockopts [Object, Number] optional properties to set on the body
2006  // @return [null]
2007  //
2008  Opal.def = function(obj, jsid, body, blockopts) {
2009    apply_blockopts(body, blockopts);
2010
2011    // Special case for a method definition in the
2012    // top-level namespace
2013    if (obj === Opal.top) {
2014      return Opal.defn(Opal.Object, jsid, body);
2015    }
2016    // if instance_eval is invoked on a module/class, it sets inst_eval_mod
2017    else if (!obj.$$eval && obj.$$is_a_module) {
2018      return Opal.defn(obj, jsid, body);
2019    }
2020    else {
2021      return Opal.defs(obj, jsid, body);
2022    }
2023  };
2024
2025  // Define method on a module or class (see Opal.def).
2026  Opal.defn = function(module, jsid, body) {
2027    $deny_frozen_access(module);
2028
2029    body.displayName = jsid;
2030    body.$$owner = module;
2031
2032    var name = jsid.substr(1);
2033
2034    var proto = module.$$prototype;
2035    if (proto.hasOwnProperty('$$dummy')) {
2036      proto = proto.$$define_methods_on;
2037    }
2038    $prop(proto, jsid, body);
2039
2040    if (module.$$is_module) {
2041      if (module.$$module_function) {
2042        Opal.defs(module, jsid, body);
2043      }
2044
2045      for (var i = 0, iclasses = module.$$iclasses, length = iclasses.length; i < length; i++) {
2046        var iclass = iclasses[i];
2047        $prop(iclass, jsid, body);
2048      }
2049    }
2050
2051    var singleton_of = module.$$singleton_of;
2052    if (module.$method_added && !module.$method_added.$$stub && !singleton_of) {
2053      module.$method_added(name);
2054    }
2055    else if (singleton_of && singleton_of.$singleton_method_added && !singleton_of.$singleton_method_added.$$stub) {
2056      singleton_of.$singleton_method_added(name);
2057    }
2058
2059    return name;
2060  };
2061
2062  // Define a singleton method on the given object (see Opal.def).
2063  Opal.defs = function(obj, jsid, body, blockopts) {
2064    apply_blockopts(body, blockopts);
2065
2066    if (obj.$$is_string || obj.$$is_number) {
2067      $raise(Opal.TypeError, "can't define singleton");
2068    }
2069    return Opal.defn(Opal.get_singleton_class(obj), jsid, body);
2070  };
2071
2072  // Called from #remove_method.
2073  Opal.rdef = function(obj, jsid) {
2074    if (!$has_own(obj.$$prototype, jsid)) {
2075      $raise(Opal.NameError, "method '" + jsid.substr(1) + "' not defined in " + obj.$name());
2076    }
2077
2078    delete obj.$$prototype[jsid];
2079
2080    if (obj.$$is_singleton) {
2081      if (obj.$$prototype.$singleton_method_removed && !obj.$$prototype.$singleton_method_removed.$$stub) {
2082        obj.$$prototype.$singleton_method_removed(jsid.substr(1));
2083      }
2084    }
2085    else {
2086      if (obj.$method_removed && !obj.$method_removed.$$stub) {
2087        obj.$method_removed(jsid.substr(1));
2088      }
2089    }
2090  };
2091
2092  // Called from #undef_method.
2093  Opal.udef = function(obj, jsid) {
2094    if (!obj.$$prototype[jsid] || obj.$$prototype[jsid].$$stub) {
2095      $raise(Opal.NameError, "method '" + jsid.substr(1) + "' not defined in " + obj.$name());
2096    }
2097
2098    Opal.add_stub_for(obj.$$prototype, jsid);
2099
2100    if (obj.$$is_singleton) {
2101      if (obj.$$prototype.$singleton_method_undefined && !obj.$$prototype.$singleton_method_undefined.$$stub) {
2102        obj.$$prototype.$singleton_method_undefined(jsid.substr(1));
2103      }
2104    }
2105    else {
2106      if (obj.$method_undefined && !obj.$method_undefined.$$stub) {
2107        obj.$method_undefined(jsid.substr(1));
2108      }
2109    }
2110  };
2111
2112  function is_method_body(body) {
2113    return (typeof(body) === "function" && !body.$$stub);
2114  }
2115
2116  Opal.alias = function(obj, name, old) {
2117    var id     = $jsid(name),
2118        old_id = $jsid(old),
2119        body,
2120        alias;
2121
2122    // Aliasing on main means aliasing on Object...
2123    if (typeof obj.$$prototype === 'undefined') {
2124      obj = Opal.Object;
2125    }
2126
2127    body = obj.$$prototype[old_id];
2128
2129    // When running inside #instance_eval the alias refers to class methods.
2130    if (obj.$$eval) {
2131      return Opal.alias(Opal.get_singleton_class(obj), name, old);
2132    }
2133
2134    if (!is_method_body(body)) {
2135      var ancestor = obj.$$super;
2136
2137      while (typeof(body) !== "function" && ancestor) {
2138        body     = ancestor[old_id];
2139        ancestor = ancestor.$$super;
2140      }
2141
2142      if (!is_method_body(body) && obj.$$is_module) {
2143        // try to look into Object
2144        body = Opal.Object.$$prototype[old_id];
2145      }
2146
2147      if (!is_method_body(body)) {
2148        $raise(Opal.NameError, "undefined method `" + old + "' for class `" + obj.$name() + "'");
2149      }
2150    }
2151
2152    // If the body is itself an alias use the original body
2153    // to keep the max depth at 1.
2154    if (body.$$alias_of) body = body.$$alias_of;
2155
2156    // We need a wrapper because otherwise properties
2157    // would be overwritten on the original body.
2158    alias = function() {
2159      var block = alias.$$p, args, i, ii;
2160
2161      args = new Array(arguments.length);
2162      for(i = 0, ii = arguments.length; i < ii; i++) {
2163        args[i] = arguments[i];
2164      }
2165
2166      alias.$$p = null;
2167
2168      return Opal.send(this, body, args, block);
2169    };
2170
2171    // Assign the 'length' value with defineProperty because
2172    // in strict mode the property is not writable.
2173    // It doesn't work in older browsers (like Chrome 38), where
2174    // an exception is thrown breaking Opal altogether.
2175    try {
2176      Object.defineProperty(alias, 'length', { value: body.length });
2177    } catch (e) {}
2178
2179    // Try to make the browser pick the right name
2180    alias.displayName       = name;
2181
2182    alias.$$arity           = body.$$arity == null ? body.length : body.$$arity;
2183    alias.$$parameters      = body.$$parameters;
2184    alias.$$source_location = body.$$source_location;
2185    alias.$$alias_of        = body;
2186    alias.$$alias_name      = name;
2187
2188    Opal.defn(obj, id, alias);
2189
2190    return obj;
2191  };
2192
2193  Opal.alias_gvar = function(new_name, old_name) {
2194    Object.defineProperty($gvars, new_name, {
2195      configurable: true,
2196      enumerable: true,
2197      get: function() {
2198        return $gvars[old_name];
2199      },
2200      set: function(new_value) {
2201        $gvars[old_name] = new_value;
2202      }
2203    });
2204    return nil;
2205  };
2206
2207  Opal.alias_native = function(obj, name, native_name) {
2208    var id   = $jsid(name),
2209        body = obj.$$prototype[native_name];
2210
2211    if (typeof(body) !== "function" || body.$$stub) {
2212      $raise(Opal.NameError, "undefined native method `" + native_name + "' for class `" + obj.$name() + "'");
2213    }
2214
2215    Opal.defn(obj, id, body);
2216
2217    return obj;
2218  };
2219
2220
2221  // Hashes
2222  // ------
2223
2224  Opal.hash_init = function(hash) {
2225    hash.$$smap = Object.create(null);
2226    hash.$$map  = Object.create(null);
2227    hash.$$keys = [];
2228  };
2229
2230  Opal.hash_clone = function(from_hash, to_hash) {
2231    to_hash.$$none = from_hash.$$none;
2232    to_hash.$$proc = from_hash.$$proc;
2233
2234    for (var i = 0, keys = from_hash.$$keys, smap = from_hash.$$smap, len = keys.length, key, value; i < len; i++) {
2235      key = keys[i];
2236
2237      if (key.$$is_string) {
2238        value = smap[key];
2239      } else {
2240        value = key.value;
2241        key = key.key;
2242      }
2243
2244      Opal.hash_put(to_hash, key, value);
2245    }
2246  };
2247
2248  Opal.hash_put = function(hash, key, value) {
2249    if (key.$$is_string) {
2250      if (!$has_own(hash.$$smap, key)) {
2251        hash.$$keys.push(key);
2252      }
2253      hash.$$smap[key] = value;
2254      return;
2255    }
2256
2257    var key_hash, bucket, last_bucket;
2258    key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash();
2259
2260    if (!$has_own(hash.$$map, key_hash)) {
2261      bucket = {key: key, key_hash: key_hash, value: value};
2262      hash.$$keys.push(bucket);
2263      hash.$$map[key_hash] = bucket;
2264      return;
2265    }
2266
2267    bucket = hash.$$map[key_hash];
2268
2269    while (bucket) {
2270      if (key === bucket.key || key['$eql?'](bucket.key)) {
2271        last_bucket = undefined;
2272        bucket.value = value;
2273        break;
2274      }
2275      last_bucket = bucket;
2276      bucket = bucket.next;
2277    }
2278
2279    if (last_bucket) {
2280      bucket = {key: key, key_hash: key_hash, value: value};
2281      hash.$$keys.push(bucket);
2282      last_bucket.next = bucket;
2283    }
2284  };
2285
2286  Opal.hash_get = function(hash, key) {
2287    if (key.$$is_string) {
2288      if ($has_own(hash.$$smap, key)) {
2289        return hash.$$smap[key];
2290      }
2291      return;
2292    }
2293
2294    var key_hash, bucket;
2295    key_hash = hash.$$by_identity ? Opal.id(key) : key.$hash();
2296
2297    if ($has_own(hash.$$map, key_hash)) {
2298      bucket = hash.$$map[key_hash];
2299
2300      while (bucket) {
2301        if (key === bucket.key || key['$eql?'](bucket.key)) {
2302          return bucket.value;
2303        }
2304        bucket = bucket.next;
2305      }
2306    }
2307  };
2308
2309  Opal.hash_delete = function(hash, key) {
2310    var i, keys = hash.$$keys, length = keys.length, value, key_tmp;
2311
2312    if (key.$$is_string) {
2313      if (typeof key !== "string") key = key.valueOf();
2314
2315      if (!$has_own(hash.$$smap, key)) {
2316        return;
2317      }
2318
2319      for (i = 0; i < length; i++) {
2320        key_tmp = keys[i];
2321
2322        if (key_tmp.$$is_string && typeof key_tmp !== "string") {
2323          key_tmp = key_tmp.valueOf();
2324        }
2325
2326        if (key_tmp === key) {
2327          keys.splice(i, 1);
2328          break;
2329        }
2330      }
2331
2332      value = hash.$$smap[key];
2333      delete hash.$$smap[key];
2334      return value;
2335    }
2336
2337    var key_hash = key.$hash();
2338
2339    if (!$has_own(hash.$$map, key_hash)) {
2340      return;
2341    }
2342
2343    var bucket = hash.$$map[key_hash], last_bucket;
2344
2345    while (bucket) {
2346      if (key === bucket.key || key['$eql?'](bucket.key)) {
2347        value = bucket.value;
2348
2349        for (i = 0; i < length; i++) {
2350          if (keys[i] === bucket) {
2351            keys.splice(i, 1);
2352            break;
2353          }
2354        }
2355
2356        if (last_bucket && bucket.next) {
2357          last_bucket.next = bucket.next;
2358        }
2359        else if (last_bucket) {
2360          delete last_bucket.next;
2361        }
2362        else if (bucket.next) {
2363          hash.$$map[key_hash] = bucket.next;
2364        }
2365        else {
2366          delete hash.$$map[key_hash];
2367        }
2368
2369        return value;
2370      }
2371      last_bucket = bucket;
2372      bucket = bucket.next;
2373    }
2374  };
2375
2376  Opal.hash_rehash = function(hash) {
2377    for (var i = 0, length = hash.$$keys.length, key_hash, bucket, last_bucket; i < length; i++) {
2378
2379      if (hash.$$keys[i].$$is_string) {
2380        continue;
2381      }
2382
2383      key_hash = hash.$$keys[i].key.$hash();
2384
2385      if (key_hash === hash.$$keys[i].key_hash) {
2386        continue;
2387      }
2388
2389      bucket = hash.$$map[hash.$$keys[i].key_hash];
2390      last_bucket = undefined;
2391
2392      while (bucket) {
2393        if (bucket === hash.$$keys[i]) {
2394          if (last_bucket && bucket.next) {
2395            last_bucket.next = bucket.next;
2396          }
2397          else if (last_bucket) {
2398            delete last_bucket.next;
2399          }
2400          else if (bucket.next) {
2401            hash.$$map[hash.$$keys[i].key_hash] = bucket.next;
2402          }
2403          else {
2404            delete hash.$$map[hash.$$keys[i].key_hash];
2405          }
2406          break;
2407        }
2408        last_bucket = bucket;
2409        bucket = bucket.next;
2410      }
2411
2412      hash.$$keys[i].key_hash = key_hash;
2413
2414      if (!$has_own(hash.$$map, key_hash)) {
2415        hash.$$map[key_hash] = hash.$$keys[i];
2416        continue;
2417      }
2418
2419      bucket = hash.$$map[key_hash];
2420      last_bucket = undefined;
2421
2422      while (bucket) {
2423        if (bucket === hash.$$keys[i]) {
2424          last_bucket = undefined;
2425          break;
2426        }
2427        last_bucket = bucket;
2428        bucket = bucket.next;
2429      }
2430
2431      if (last_bucket) {
2432        last_bucket.next = hash.$$keys[i];
2433      }
2434    }
2435  };
2436
2437  Opal.hash = function() {
2438    var arguments_length = arguments.length, args, hash, i, length, key, value;
2439
2440    if (arguments_length === 1 && arguments[0].$$is_hash) {
2441      return arguments[0];
2442    }
2443
2444    hash = new Opal.Hash();
2445    Opal.hash_init(hash);
2446
2447    if (arguments_length === 1) {
2448      args = arguments[0];
2449
2450      if (arguments[0].$$is_array) {
2451        length = args.length;
2452
2453        for (i = 0; i < length; i++) {
2454          if (args[i].length !== 2) {
2455            $raise(Opal.ArgumentError, "value not of length 2: " + args[i].$inspect());
2456          }
2457
2458          key = args[i][0];
2459          value = args[i][1];
2460
2461          Opal.hash_put(hash, key, value);
2462        }
2463
2464        return hash;
2465      }
2466      else {
2467        args = arguments[0];
2468        for (key in args) {
2469          if ($has_own(args, key)) {
2470            value = args[key];
2471
2472            Opal.hash_put(hash, key, value);
2473          }
2474        }
2475
2476        return hash;
2477      }
2478    }
2479
2480    if (arguments_length % 2 !== 0) {
2481      $raise(Opal.ArgumentError, "odd number of arguments for Hash");
2482    }
2483
2484    for (i = 0; i < arguments_length; i += 2) {
2485      key = arguments[i];
2486      value = arguments[i + 1];
2487
2488      Opal.hash_put(hash, key, value);
2489    }
2490
2491    return hash;
2492  };
2493
2494  // A faster Hash creator for hashes that just use symbols and
2495  // strings as keys. The map and keys array can be constructed at
2496  // compile time, so they are just added here by the constructor
2497  // function.
2498  //
2499  Opal.hash2 = function(keys, smap) {
2500    var hash = new Opal.Hash();
2501
2502    hash.$$smap = smap;
2503    hash.$$map  = Object.create(null);
2504    hash.$$keys = keys;
2505
2506    return hash;
2507  };
2508
2509  // Create a new range instance with first and last values, and whether the
2510  // range excludes the last value.
2511  //
2512  Opal.range = function(first, last, exc) {
2513    var range         = new Opal.Range();
2514        range.begin   = first;
2515        range.end     = last;
2516        range.excl    = exc;
2517
2518    return range;
2519  };
2520
2521  var reserved_ivar_names = [
2522    // properties
2523    "constructor", "displayName", "__count__", "__noSuchMethod__",
2524    "__parent__", "__proto__",
2525    // methods
2526    "hasOwnProperty", "valueOf"
2527  ];
2528
2529  // Get the ivar name for a given name.
2530  // Mostly adds a trailing $ to reserved names.
2531  //
2532  Opal.ivar = function(name) {
2533    if (reserved_ivar_names.indexOf(name) !== -1) {
2534      name += "$";
2535    }
2536
2537    return name;
2538  };
2539
2540  // Support for #freeze
2541  // -------------------
2542
2543  // helper that can be used from methods
2544  function $deny_frozen_access(obj) {
2545    if (obj.$$frozen) {
2546      $raise(Opal.FrozenError, "can't modify frozen " + (obj.$class()) + ": " + (obj), Opal.hash2(["receiver"], {"receiver": obj}));
2547    }
2548  }  Opal.deny_frozen_access = $deny_frozen_access;
2549
2550  // common #freeze runtime support
2551  Opal.freeze = function(obj) {
2552    $prop(obj, "$$frozen", true);
2553
2554    // set $$id
2555    if (!obj.hasOwnProperty('$$id')) { $prop(obj, '$$id', $uid()); }
2556
2557    if (obj.hasOwnProperty('$$meta')) {
2558      // freeze $$meta if it has already been set
2559      obj.$$meta.$freeze();
2560    } else {
2561      // ensure $$meta can be set lazily, $$meta is frozen when set in runtime.js
2562      $prop(obj, '$$meta', null);
2563    }
2564
2565    // $$comparable is used internally and set multiple times
2566    // defining it before sealing ensures it can be modified later on
2567    if (!obj.hasOwnProperty('$$comparable')) { $prop(obj, '$$comparable', null); }
2568
2569    // seal the Object
2570    Object.seal(obj);
2571
2572    return obj;
2573  };
2574
2575  // freze props, make setters of instance variables throw FrozenError
2576  Opal.freeze_props = function(obj) {
2577    var prop, prop_type, desc;
2578
2579    for(prop in obj) {
2580      prop_type = typeof(prop);
2581
2582      // prop_type "object" here is a String(), skip $ props
2583      if ((prop_type === "string" || prop_type === "object") && prop[0] === '$') {
2584        continue;
2585      }
2586
2587      desc = Object.getOwnPropertyDescriptor(obj, prop);
2588      if (desc && desc.enumerable && desc.writable) {
2589        // create closure to retain current value as cv
2590        // for Opal 2.0 let for cv should do the trick, instead of a function
2591        (function() {
2592          // set v to undefined, as if the property is not set
2593          var cv = obj[prop];
2594          Object.defineProperty(obj, prop, {
2595            get: function() { return cv; },
2596            set: function(_val) { $deny_frozen_access(obj); },
2597            enumerable: true
2598          });
2599        })();
2600      }
2601    }
2602  };
2603
2604  // Regexps
2605  // -------
2606
2607  // Escape Regexp special chars letting the resulting string be used to build
2608  // a new Regexp.
2609  //
2610  Opal.escape_regexp = function(str) {
2611    return str.replace(/([-[\]\/{}()*+?.^$\\| ])/g, '\\$1')
2612              .replace(/[\n]/g, '\\n')
2613              .replace(/[\r]/g, '\\r')
2614              .replace(/[\f]/g, '\\f')
2615              .replace(/[\t]/g, '\\t');
2616  };
2617
2618  // Create a global Regexp from a RegExp object and cache the result
2619  // on the object itself ($$g attribute).
2620  //
2621  Opal.global_regexp = function(pattern) {
2622    if (pattern.global) {
2623      return pattern; // RegExp already has the global flag
2624    }
2625    if (pattern.$$g == null) {
2626      pattern.$$g = new RegExp(pattern.source, (pattern.multiline ? 'gm' : 'g') + (pattern.ignoreCase ? 'i' : ''));
2627    } else {
2628      pattern.$$g.lastIndex = null; // reset lastIndex property
2629    }
2630    return pattern.$$g;
2631  };
2632
2633  // Create a global multiline Regexp from a RegExp object and cache the result
2634  // on the object itself ($$gm or $$g attribute).
2635  //
2636  Opal.global_multiline_regexp = function(pattern) {
2637    var result, flags;
2638
2639    // RegExp already has the global and multiline flag
2640    if (pattern.global && pattern.multiline) return pattern;
2641
2642    flags = 'gm' + (pattern.ignoreCase ? 'i' : '');
2643    if (pattern.multiline) {
2644      // we are using the $$g attribute because the Regexp is already multiline
2645      if (pattern.$$g == null) {
2646        pattern.$$g = new RegExp(pattern.source, flags);
2647      }
2648      result = pattern.$$g;
2649    } else {
2650      if (pattern.$$gm == null) {
2651        pattern.$$gm = new RegExp(pattern.source, flags);
2652      }
2653      result = pattern.$$gm;
2654    }
2655    result.lastIndex = null; // reset lastIndex property
2656    return result;
2657  };
2658
2659  // Combine multiple regexp parts together
2660  Opal.regexp = function(parts, flags) {
2661    var part;
2662    var ignoreCase = typeof flags !== 'undefined' && flags && flags.indexOf('i') >= 0;
2663
2664    for (var i = 0, ii = parts.length; i < ii; i++) {
2665      part = parts[i];
2666      if (part instanceof RegExp) {
2667        if (part.ignoreCase !== ignoreCase)
2668          Opal.Kernel.$warn(
2669            "ignore case doesn't match for " + part.source.$inspect(),
2670            Opal.hash({uplevel: 1})
2671          );
2672
2673        part = part.source;
2674      }
2675      if (part === '') part = '(?:' + part + ')';
2676      parts[i] = part;
2677    }
2678
2679    if (flags) {
2680      return new RegExp(parts.join(''), flags);
2681    } else {
2682      return new RegExp(parts.join(''));
2683    }
2684  };
2685
2686  // Require system
2687  // --------------
2688
2689  Opal.modules         = {};
2690  Opal.loaded_features = ['corelib/runtime'];
2691  Opal.current_dir     = '.';
2692  Opal.require_table   = {'corelib/runtime': true};
2693
2694  Opal.normalize = function(path) {
2695    var parts, part, new_parts = [], SEPARATOR = '/';
2696
2697    if (Opal.current_dir !== '.') {
2698      path = Opal.current_dir.replace(/\/*$/, '/') + path;
2699    }
2700
2701    path = path.replace(/^\.\//, '');
2702    path = path.replace(/\.(rb|opal|js)$/, '');
2703    parts = path.split(SEPARATOR);
2704
2705    for (var i = 0, ii = parts.length; i < ii; i++) {
2706      part = parts[i];
2707      if (part === '') continue;
2708      (part === '..') ? new_parts.pop() : new_parts.push(part);
2709    }
2710
2711    return new_parts.join(SEPARATOR);
2712  };
2713
2714  Opal.loaded = function(paths) {
2715    var i, l, path;
2716
2717    for (i = 0, l = paths.length; i < l; i++) {
2718      path = Opal.normalize(paths[i]);
2719
2720      if (Opal.require_table[path]) {
2721        continue;
2722      }
2723
2724      Opal.loaded_features.push(path);
2725      Opal.require_table[path] = true;
2726    }
2727  };
2728
2729  Opal.load_normalized = function(path) {
2730    Opal.loaded([path]);
2731
2732    var module = Opal.modules[path];
2733
2734    if (module) {
2735      var retval = module(Opal);
2736      if (typeof Promise !== 'undefined' && retval instanceof Promise) {
2737        // A special case of require having an async top:
2738        // We will need to await it.
2739        return retval.then($return_val(true));
2740      }
2741    }
2742    else {
2743      var severity = Opal.config.missing_require_severity;
2744      var message  = 'cannot load such file -- ' + path;
2745
2746      if (severity === "error") {
2747        $raise(Opal.LoadError, message);
2748      }
2749      else if (severity === "warning") {
2750        console.warn('WARNING: LoadError: ' + message);
2751      }
2752    }
2753
2754    return true;
2755  };
2756
2757  Opal.load = function(path) {
2758    path = Opal.normalize(path);
2759
2760    return Opal.load_normalized(path);
2761  };
2762
2763  Opal.require = function(path) {
2764    path = Opal.normalize(path);
2765
2766    if (Opal.require_table[path]) {
2767      return false;
2768    }
2769
2770    return Opal.load_normalized(path);
2771  };
2772
2773
2774  // Strings
2775  // -------
2776
2777  Opal.encodings = Object.create(null);
2778
2779  // Sets the encoding on a string, will treat string literals as frozen strings
2780  // raising a FrozenError.
2781  //
2782  // @param str [String] the string on which the encoding should be set
2783  // @param name [String] the canonical name of the encoding
2784  // @param type [String] possible values are either `"encoding"`, `"internal_encoding"`, or `undefined
2785  Opal.set_encoding = function(str, name, type) {
2786    if (typeof type === "undefined") type = "encoding";
2787    if (typeof str === 'string' || str.$$frozen === true)
2788      $raise(Opal.FrozenError, "can't modify frozen String");
2789
2790    var encoding = Opal.find_encoding(name);
2791
2792    if (encoding === str[type]) { return str; }
2793
2794    str[type] = encoding;
2795
2796    return str;
2797  };
2798
2799  // Fetches the encoding for the given name or raises ArgumentError.
2800  Opal.find_encoding = function(name) {
2801    var register = Opal.encodings;
2802    var encoding = register[name] || register[name.toUpperCase()];
2803    if (!encoding) $raise(Opal.ArgumentError, "unknown encoding name - " + name);
2804    return encoding;
2805  };
2806
2807  // @returns a String object with the encoding set from a string literal
2808  Opal.enc = function(str, name) {
2809    var dup = new String(str);
2810    dup = Opal.set_encoding(dup, name);
2811    dup.internal_encoding = dup.encoding;
2812    return dup
2813  };
2814
2815  // @returns a String object with the internal encoding set to Binary
2816  Opal.binary = function(str) {
2817    var dup = new String(str);
2818    return Opal.set_encoding(dup, "binary", "internal_encoding");
2819  };
2820
2821  Opal.last_promise = null;
2822  Opal.promise_unhandled_exception = false;
2823
2824  // Run a block of code, but if it returns a Promise, don't run the next
2825  // one, but queue it.
2826  Opal.queue = function(proc) {
2827    if (Opal.last_promise) {
2828      // The async path is taken only if anything before returned a
2829      // Promise(V2).
2830      Opal.last_promise = Opal.last_promise.then(function() {
2831        if (!Opal.promise_unhandled_exception) return proc(Opal);
2832      })['catch'](function(error) {
2833        if (Opal.respond_to(error, '$full_message')) {
2834          error = error.$full_message();
2835        }
2836        console.error(error);
2837        // Abort further execution
2838        Opal.promise_unhandled_exception = true;
2839        Opal.exit(1);
2840      });
2841      return Opal.last_promise;
2842    }
2843    else {
2844      var ret = proc(Opal);
2845      if (typeof Promise === 'function' && typeof ret === 'object' && ret instanceof Promise) {
2846        Opal.last_promise = ret;
2847      }
2848      return ret;
2849    }
2850  };
2851
2852  // Operator helpers
2853  // ----------------
2854
2855  function are_both_numbers(l,r) { return typeof(l) === 'number' && typeof(r) === 'number' }
2856
2857  Opal.rb_plus   = function(l,r) { return are_both_numbers(l,r) ? l + r : l['$+'](r); };
2858  Opal.rb_minus  = function(l,r) { return are_both_numbers(l,r) ? l - r : l['$-'](r); };
2859  Opal.rb_times  = function(l,r) { return are_both_numbers(l,r) ? l * r : l['$*'](r); };
2860  Opal.rb_divide = function(l,r) { return are_both_numbers(l,r) ? l / r : l['$/'](r); };
2861  Opal.rb_lt     = function(l,r) { return are_both_numbers(l,r) ? l < r : l['$<'](r); };
2862  Opal.rb_gt     = function(l,r) { return are_both_numbers(l,r) ? l > r : l['$>'](r); };
2863  Opal.rb_le     = function(l,r) { return are_both_numbers(l,r) ? l <= r : l['$<='](r); };
2864  Opal.rb_ge     = function(l,r) { return are_both_numbers(l,r) ? l >= r : l['$>='](r); };
2865
2866  // Optimized helpers for calls like $truthy((a)['$==='](b)) -> $eqeqeq(a, b)
2867  function are_both_numbers_or_strings(lhs, rhs) {
2868    return (typeof lhs === 'number' && typeof rhs === 'number') ||
2869           (typeof lhs === 'string' && typeof rhs === 'string');
2870  }
2871
2872  function $eqeq(lhs, rhs) {
2873    return are_both_numbers_or_strings(lhs,rhs) ? lhs === rhs : $truthy((lhs)['$=='](rhs));
2874  }  Opal.eqeq = $eqeq;
2875  Opal.eqeqeq = function(lhs, rhs) {
2876    return are_both_numbers_or_strings(lhs,rhs) ? lhs === rhs : $truthy((lhs)['$==='](rhs));
2877  };
2878  Opal.neqeq = function(lhs, rhs) {
2879    return are_both_numbers_or_strings(lhs,rhs) ? lhs !== rhs : $truthy((lhs)['$!='](rhs));
2880  };
2881  Opal.not = function(arg) {
2882    if (undefined === arg || null === arg || false === arg || nil === arg) return true;
2883    if (true === arg || arg['$!'].$$pristine) return false;
2884    return $truthy(arg['$!']());
2885  };
2886
2887  // Shortcuts - optimized function generators for simple kinds of functions
2888  function $return_val(arg) {
2889    return function() {
2890      return arg;
2891    }
2892  }
2893  Opal.return_val = $return_val;
2894
2895  Opal.return_self = function() {
2896    return this;
2897  };
2898  Opal.return_ivar = function(ivar) {
2899    return function() {
2900      if (this[ivar] == null) { return nil; }
2901      return this[ivar];
2902    }
2903  };
2904  Opal.assign_ivar = function(ivar) {
2905    return function(val) {
2906      $deny_frozen_access(this);
2907      return this[ivar] = val;
2908    }
2909  };
2910  Opal.assign_ivar_val = function(ivar, static_val) {
2911    return function() {
2912      $deny_frozen_access(this);
2913      return this[ivar] = static_val;
2914    }
2915  };
2916
2917  // Primitives for handling parameters
2918  Opal.ensure_kwargs = function(kwargs) {
2919    if (kwargs == null) {
2920      return Opal.hash2([], {});
2921    } else if (kwargs.$$is_hash) {
2922      return kwargs;
2923    } else {
2924      $raise(Opal.ArgumentError, 'expected kwargs');
2925    }
2926  };
2927
2928  Opal.get_kwarg = function(kwargs, key) {
2929    if (!$has_own(kwargs.$$smap, key)) {
2930      $raise(Opal.ArgumentError, 'missing keyword: '+key);
2931    }
2932    return kwargs.$$smap[key];
2933  };
2934
2935  // Arrays of size > 32 elements that contain only strings,
2936  // symbols, integers and nils are compiled as a self-extracting
2937  // string.
2938  Opal.large_array_unpack = function(str) {
2939    var array = str.split(","), length = array.length, i;
2940    for (i = 0; i < length; i++) {
2941      switch(array[i][0]) {
2942        case undefined:
2943          array[i] = nil;
2944          break;
2945        case '-':
2946        case '0':
2947        case '1':
2948        case '2':
2949        case '3':
2950        case '4':
2951        case '5':
2952        case '6':
2953        case '7':
2954        case '8':
2955        case '9':
2956          array[i] = +array[i];
2957      }
2958    }
2959    return array;
2960  };
2961
2962  // Initialization
2963  // --------------
2964  Opal.BasicObject = BasicObject = $allocate_class('BasicObject', null);
2965  Opal.Object      = _Object     = $allocate_class('Object', Opal.BasicObject);
2966  Opal.Module      = Module      = $allocate_class('Module', Opal.Object);
2967  Opal.Class       = Class       = $allocate_class('Class', Opal.Module);
2968  Opal.Opal        = _Opal       = $allocate_module('Opal');
2969  Opal.Kernel      = Kernel      = $allocate_module('Kernel');
2970
2971  $set_proto(Opal.BasicObject, Opal.Class.$$prototype);
2972  $set_proto(Opal.Object, Opal.Class.$$prototype);
2973  $set_proto(Opal.Module, Opal.Class.$$prototype);
2974  $set_proto(Opal.Class, Opal.Class.$$prototype);
2975
2976  // BasicObject can reach itself, avoid const_set to skip the $$base_module logic
2977  BasicObject.$$const.BasicObject = BasicObject;
2978
2979  // Assign basic constants
2980  $const_set(_Object, "BasicObject",  BasicObject);
2981  $const_set(_Object, "Object",       _Object);
2982  $const_set(_Object, "Module",       Module);
2983  $const_set(_Object, "Class",        Class);
2984  $const_set(_Object, "Opal",         _Opal);
2985  $const_set(_Object, "Kernel",       Kernel);
2986
2987  // Fix booted classes to have correct .class value
2988  BasicObject.$$class = Class;
2989  _Object.$$class     = Class;
2990  Module.$$class      = Class;
2991  Class.$$class       = Class;
2992  _Opal.$$class       = Module;
2993  Kernel.$$class      = Module;
2994
2995  // Forward .toString() to #to_s
2996  $prop(_Object.$$prototype, 'toString', function() {
2997    var to_s = this.$to_s();
2998    if (to_s.$$is_string && typeof(to_s) === 'object') {
2999      // a string created using new String('string')
3000      return to_s.valueOf();
3001    } else {
3002      return to_s;
3003    }
3004  });
3005
3006  // Make Kernel#require immediately available as it's needed to require all the
3007  // other corelib files.
3008  $prop(_Object.$$prototype, '$require', Opal.require);
3009
3010  // Instantiate the main object
3011  Opal.top = new _Object();
3012  Opal.top.$to_s = Opal.top.$inspect = $return_val('main');
3013  Opal.top.$define_method = top_define_method;
3014
3015  // Foward calls to define_method on the top object to Object
3016  function top_define_method() {
3017    var args = $slice(arguments);
3018    var block = top_define_method.$$p;
3019    top_define_method.$$p = null;
3020    return Opal.send(_Object, 'define_method', args, block)
3021  }
3022  // Nil
3023  Opal.NilClass = $allocate_class('NilClass', Opal.Object);
3024  $const_set(_Object, 'NilClass', Opal.NilClass);
3025  nil = Opal.nil = new Opal.NilClass();
3026  nil.$$id = nil_id;
3027  nil.call = nil.apply = function() { $raise(Opal.LocalJumpError, 'no block given'); };
3028  nil.$$frozen = true;
3029  nil.$$comparable = false;
3030  Object.seal(nil);
3031
3032  Opal.thrower = function(type) {
3033    var thrower = new Error('unexpected '+type);
3034    thrower.$thrower_type = type;
3035    thrower.$throw = function(value) {
3036      if (value == null) value = nil;
3037      thrower.$v = value;
3038      throw thrower;
3039    };
3040    return thrower;
3041  };
3042
3043  Opal.t_eval_return = Opal.thrower("return");
3044
3045  TypeError.$$super = Error;
3046
3047  // If enable-file-source-embed compiler option is enabled, each module loaded will add its
3048  // sources to this object
3049  Opal.file_sources = {};
3050}).call(undefined);
3051Opal.loaded(["corelib/runtime.js"]);
3052Opal.modules["corelib/helpers"] = function(Opal) {/* Generated by Opal 1.7.3 */
3053  var $type_error = Opal.type_error, $coerce_to = Opal.coerce_to, $module = Opal.module, $defs = Opal.defs, $slice = Opal.slice, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $Opal = Opal.Opal, nil = Opal.nil, $$$ = Opal.$$$;
3054
3055  Opal.add_stubs('===,raise,respond_to?,nil?,__send__,<=>,class,coerce_to!,new,to_s,__id__');
3056  return (function($base) {
3057    var self = $module($base, 'Opal');
3058
3059
3060
3061    $defs(self, '$bridge', function $$bridge(constructor, klass) {
3062
3063      return Opal.bridge(constructor, klass);
3064    });
3065    $defs(self, '$coerce_to!', function $Opal_coerce_to$excl$1(object, type, method, $a) {
3066      var $post_args, args, coerced = nil;
3067
3068
3069      $post_args = $slice(arguments, 3);
3070      args = $post_args;
3071      coerced = $coerce_to(object, type, method, args);
3072      if (!$eqeqeq(type, coerced)) {
3073        $Kernel.$raise($type_error(object, type, method, coerced));
3074      }      return coerced;
3075    }, -4);
3076    $defs(self, '$coerce_to?', function $Opal_coerce_to$ques$2(object, type, method, $a) {
3077      var $post_args, args, coerced = nil;
3078
3079
3080      $post_args = $slice(arguments, 3);
3081      args = $post_args;
3082      if (!$truthy(object['$respond_to?'](method))) {
3083        return nil
3084      }      coerced = $coerce_to(object, type, method, args);
3085      if ($truthy(coerced['$nil?']())) {
3086        return nil
3087      }      if (!$eqeqeq(type, coerced)) {
3088        $Kernel.$raise($type_error(object, type, method, coerced));
3089      }      return coerced;
3090    }, -4);
3091    $defs(self, '$try_convert', function $$try_convert(object, type, method) {
3092
3093
3094      if ($eqeqeq(type, object)) {
3095        return object
3096      }      if ($truthy(object['$respond_to?'](method))) {
3097        return object.$__send__(method)
3098      } else {
3099        return nil
3100      }    });
3101    $defs(self, '$compare', function $$compare(a, b) {
3102      var compare = nil;
3103
3104
3105      compare = a['$<=>'](b);
3106      if ($truthy(compare === nil)) {
3107        $Kernel.$raise($$$('ArgumentError'), "comparison of " + (a.$class()) + " with " + (b.$class()) + " failed");
3108      }      return compare;
3109    });
3110    $defs(self, '$destructure', function $$destructure(args) {
3111
3112
3113      if (args.length == 1) {
3114        return args[0];
3115      }
3116      else if (args.$$is_array) {
3117        return args;
3118      }
3119      else {
3120        var args_ary = new Array(args.length);
3121        for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = args[i]; }
3122
3123        return args_ary;
3124      }
3125
3126    });
3127    $defs(self, '$respond_to?', function $Opal_respond_to$ques$3(obj, method, include_all) {
3128
3129
3130      if (include_all == null) include_all = false;
3131
3132      if (obj == null || !obj.$$class) {
3133        return false;
3134      }
3135      return obj['$respond_to?'](method, include_all);
3136    }, -3);
3137    $defs(self, '$instance_variable_name!', function $Opal_instance_variable_name$excl$4(name) {
3138
3139
3140      name = $Opal['$coerce_to!'](name, $$$('String'), "to_str");
3141      if (!$truthy(/^@[a-zA-Z_][a-zA-Z0-9_]*?$/.test(name))) {
3142        $Kernel.$raise($$$('NameError').$new("'" + (name) + "' is not allowed as an instance variable name", name));
3143      }      return name;
3144    });
3145    $defs(self, '$class_variable_name!', function $Opal_class_variable_name$excl$5(name) {
3146
3147
3148      name = $Opal['$coerce_to!'](name, $$$('String'), "to_str");
3149      if ($truthy(name.length < 3 || name.slice(0,2) !== '@@')) {
3150        $Kernel.$raise($$$('NameError').$new("`" + (name) + "' is not allowed as a class variable name", name));
3151      }      return name;
3152    });
3153    $defs(self, '$const_name?', function $Opal_const_name$ques$6(const_name) {
3154
3155
3156      if (typeof const_name !== 'string') {
3157        (const_name = $Opal['$coerce_to!'](const_name, $$$('String'), "to_str"));
3158      }
3159
3160      return const_name[0] === const_name[0].toUpperCase()
3161
3162    });
3163    $defs(self, '$const_name!', function $Opal_const_name$excl$7(const_name) {
3164      var self = this;
3165
3166
3167      if ($truthy((($$$('::', 'String', 'skip_raise')) ? 'constant' : nil))) {
3168        const_name = $Opal['$coerce_to!'](const_name, $$$('String'), "to_str");
3169      }
3170      if (!const_name || const_name[0] != const_name[0].toUpperCase()) {
3171        self.$raise($$$('NameError'), "wrong constant name " + (const_name));
3172      }
3173      return const_name;
3174    });
3175    $defs(self, '$pristine', function $$pristine(owner_class, $a) {
3176      var $post_args, method_names;
3177
3178
3179      $post_args = $slice(arguments, 1);
3180      method_names = $post_args;
3181
3182      var method_name, method;
3183      for (var i = method_names.length - 1; i >= 0; i--) {
3184        method_name = method_names[i];
3185        method = owner_class.$$prototype[Opal.jsid(method_name)];
3186
3187        if (method && !method.$$stub) {
3188          method.$$pristine = true;
3189        }
3190      }
3191      return nil;
3192    }, -2);
3193    var inspect_stack = [];
3194    return $defs(self, '$inspect', function $$inspect(value) {
3195      var e = nil;
3196      var pushed = false;
3197
3198      return (function() { try {
3199      try {
3200
3201
3202        if (value === null) {
3203          // JS null value
3204          return 'null';
3205        }
3206        else if (value === undefined) {
3207          // JS undefined value
3208          return 'undefined';
3209        }
3210        else if (typeof value.$$class === 'undefined') {
3211          // JS object / other value that is not bridged
3212          return Object.prototype.toString.apply(value);
3213        }
3214        else if (typeof value.$inspect !== 'function' || value.$inspect.$$stub) {
3215          // BasicObject and friends
3216          return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">"
3217        }
3218        else if (inspect_stack.indexOf(value.$__id__()) !== -1) {
3219          // inspect recursing inside inspect to find out about the
3220          // same object
3221          return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">"
3222        }
3223        else {
3224          // anything supporting Opal
3225          inspect_stack.push(value.$__id__());
3226          pushed = true;
3227          return value.$inspect();
3228        }
3229      ;
3230        return nil;
3231      } catch ($err) {
3232        if (Opal.rescue($err, [$$$('Exception')])) {(e = $err);
3233          try {
3234            return "#<" + (value.$$class) + ":0x" + (value.$__id__().$to_s(16)) + ">"
3235          } finally { Opal.pop_exception(); }
3236        } else { throw $err; }
3237      }
3238      } finally {
3239        if (pushed) inspect_stack.pop();
3240      } })();    }, -1);
3241  })('::')
3242};
3243
3244Opal.modules["corelib/module"] = function(Opal) {/* Generated by Opal 1.7.3 */
3245  var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $const_set = Opal.const_set, $Object = Opal.Object, $return_ivar = Opal.return_ivar, $assign_ivar = Opal.assign_ivar, $ivar = Opal.ivar, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $prop = Opal.prop, $jsid = Opal.jsid, $klass = Opal.klass, $defs = Opal.defs, $send = Opal.send, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $Module = Opal.Module, $Kernel = Opal.Kernel, $rb_lt = Opal.rb_lt, $rb_gt = Opal.rb_gt, $slice = Opal.slice, $to_a = Opal.to_a, $hash2 = Opal.hash2, $Opal = Opal.Opal, $return_val = Opal.return_val, $eqeq = Opal.eqeq, $lambda = Opal.lambda, $range = Opal.range, $send2 = Opal.send2, $find_super = Opal.find_super, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
3246
3247  Opal.add_stubs('module_eval,to_proc,===,raise,equal?,<,>,nil?,attr_reader,attr_writer,warn,attr_accessor,const_name?,class_variable_name!,pristine,const_name!,=~,new,inject,split,const_get,==,start_with?,!~,bind,call,class,frozen?,name,append_features,included,cover?,size,merge,compile,proc,any?,prepend_features,prepended,to_s,__id__,constants,include?,copy_class_variables,copy_constants,class_exec,module_exec,inspect');
3248
3249  (function($base, $super, $parent_nesting) {
3250    var self = $klass($base, $super, 'Module');
3251
3252    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
3253
3254
3255    $defs(self, '$allocate', function $$allocate() {
3256      var self = this;
3257
3258
3259      var module = Opal.allocate_module(nil, function(){});
3260      // Link the prototype of Module subclasses
3261      if (self !== Opal.Module) Object.setPrototypeOf(module, self.$$prototype);
3262      return module;
3263
3264    });
3265
3266    $def(self, '$initialize', function $$initialize() {
3267      var block = $$initialize.$$p || nil, self = this;
3268
3269      $$initialize.$$p = null;
3270      if ((block !== nil)) {
3271        return $send(self, 'module_eval', [], block.$to_proc())
3272      } else {
3273        return nil
3274      }    });
3275
3276    $def(self, '$===', function $Module_$eq_eq_eq$1(object) {
3277      var self = this;
3278
3279
3280      if ($truthy(object == null)) {
3281        return false
3282      }      return Opal.is_a(object, self);    });
3283
3284    $def(self, '$<', function $Module_$lt$2(other) {
3285      var self = this;
3286
3287
3288      if (!$eqeqeq($Module, other)) {
3289        $Kernel.$raise($$$('TypeError'), "compared with non class/module");
3290      }
3291      var working = self,
3292          ancestors,
3293          i, length;
3294
3295      if (working === other) {
3296        return false;
3297      }
3298
3299      for (i = 0, ancestors = Opal.ancestors(self), length = ancestors.length; i < length; i++) {
3300        if (ancestors[i] === other) {
3301          return true;
3302        }
3303      }
3304
3305      for (i = 0, ancestors = Opal.ancestors(other), length = ancestors.length; i < length; i++) {
3306        if (ancestors[i] === self) {
3307          return false;
3308        }
3309      }
3310
3311      return nil;
3312    });
3313
3314    $def(self, '$<=', function $Module_$lt_eq$3(other) {
3315      var self = this, $ret_or_1 = nil;
3316
3317      if ($truthy(($ret_or_1 = self['$equal?'](other)))) {
3318        return $ret_or_1
3319      } else {
3320        return $rb_lt(self, other)
3321      }
3322    });
3323
3324    $def(self, '$>', function $Module_$gt$4(other) {
3325      var self = this;
3326
3327
3328      if (!$eqeqeq($Module, other)) {
3329        $Kernel.$raise($$$('TypeError'), "compared with non class/module");
3330      }      return $rb_lt(other, self);
3331    });
3332
3333    $def(self, '$>=', function $Module_$gt_eq$5(other) {
3334      var self = this, $ret_or_1 = nil;
3335
3336      if ($truthy(($ret_or_1 = self['$equal?'](other)))) {
3337        return $ret_or_1
3338      } else {
3339        return $rb_gt(self, other)
3340      }
3341    });
3342
3343    $def(self, '$<=>', function $Module_$lt_eq_gt$6(other) {
3344      var self = this, lt = nil;
3345
3346
3347
3348      if (self === other) {
3349        return 0;
3350      }
3351      if (!$eqeqeq($Module, other)) {
3352        return nil
3353      }      lt = $rb_lt(self, other);
3354      if ($truthy(lt['$nil?']())) {
3355        return nil
3356      }      if ($truthy(lt)) {
3357        return -1
3358      } else {
3359        return 1
3360      }    });
3361
3362    $def(self, '$alias_method', function $$alias_method(newname, oldname) {
3363      var self = this;
3364
3365
3366      $deny_frozen_access(self);
3367      newname = $coerce_to(newname, $$$('String'), 'to_str');
3368      oldname = $coerce_to(oldname, $$$('String'), 'to_str');
3369      Opal.alias(self, newname, oldname);
3370      return self;
3371    });
3372
3373    $def(self, '$alias_native', function $$alias_native(mid, jsid) {
3374      var self = this;
3375
3376
3377      if (jsid == null) jsid = mid;
3378      $deny_frozen_access(self);
3379      Opal.alias_native(self, mid, jsid);
3380      return self;
3381    }, -2);
3382
3383    $def(self, '$ancestors', function $$ancestors() {
3384      var self = this;
3385
3386      return Opal.ancestors(self);
3387    });
3388
3389    $def(self, '$append_features', function $$append_features(includer) {
3390      var self = this;
3391
3392
3393      $deny_frozen_access(includer);
3394      Opal.append_features(self, includer);
3395      return self;
3396    });
3397
3398    $def(self, '$attr_accessor', function $$attr_accessor($a) {
3399      var $post_args, names, self = this;
3400
3401
3402      $post_args = $slice(arguments);
3403      names = $post_args;
3404      $send(self, 'attr_reader', $to_a(names));
3405      return $send(self, 'attr_writer', $to_a(names));
3406    }, -1);
3407
3408    $def(self, '$attr', function $$attr($a) {
3409      var $post_args, args, self = this;
3410
3411
3412      $post_args = $slice(arguments);
3413      args = $post_args;
3414
3415      if (args.length == 2 && (args[1] === true || args[1] === false)) {
3416        self.$warn("optional boolean argument is obsoleted", $hash2(["uplevel"], {"uplevel": 1}));
3417
3418        args[1] ? self.$attr_accessor(args[0]) : self.$attr_reader(args[0]);
3419        return nil;
3420      }
3421      return $send(self, 'attr_reader', $to_a(args));
3422    }, -1);
3423
3424    $def(self, '$attr_reader', function $$attr_reader($a) {
3425      var $post_args, names, self = this;
3426
3427
3428      $post_args = $slice(arguments);
3429      names = $post_args;
3430
3431      $deny_frozen_access(self);
3432
3433      var proto = self.$$prototype;
3434
3435      for (var i = names.length - 1; i >= 0; i--) {
3436        var name = names[i],
3437            id   = $jsid(name),
3438            ivar = $ivar(name);
3439
3440        var body = $return_ivar(ivar);
3441
3442        // initialize the instance variable as nil
3443        Opal.prop(proto, ivar, nil);
3444
3445        body.$$parameters = [];
3446        body.$$arity = 0;
3447
3448        Opal.defn(self, id, body);
3449      }
3450      return nil;
3451    }, -1);
3452
3453    $def(self, '$attr_writer', function $$attr_writer($a) {
3454      var $post_args, names, self = this;
3455
3456
3457      $post_args = $slice(arguments);
3458      names = $post_args;
3459
3460      $deny_frozen_access(self);
3461
3462      var proto = self.$$prototype;
3463
3464      for (var i = names.length - 1; i >= 0; i--) {
3465        var name = names[i],
3466            id   = $jsid(name + '='),
3467            ivar = $ivar(name);
3468
3469        var body = $assign_ivar(ivar);
3470
3471        body.$$parameters = [['req']];
3472        body.$$arity = 1;
3473
3474        // initialize the instance variable as nil
3475        Opal.prop(proto, ivar, nil);
3476
3477        Opal.defn(self, id, body);
3478      }
3479      return nil;
3480    }, -1);
3481
3482    $def(self, '$autoload', function $$autoload(const$, path) {
3483      var self = this;
3484
3485
3486      $deny_frozen_access(self);
3487
3488      if (!$$('Opal')['$const_name?'](const$)) {
3489        $Kernel.$raise($$$('NameError'), "autoload must be constant name: " + (const$));
3490      }
3491
3492      if (path == "") {
3493        $Kernel.$raise($$$('ArgumentError'), "empty file name");
3494      }
3495
3496      if (!self.$$const.hasOwnProperty(const$)) {
3497        if (!self.$$autoload) {
3498          self.$$autoload = {};
3499        }
3500        Opal.const_cache_version++;
3501        self.$$autoload[const$] = { path: path, loaded: false, required: false, success: false, exception: false };
3502
3503        if (self.$const_added && !self.$const_added.$$pristine) {
3504          self.$const_added(const$);
3505        }
3506      }
3507      return nil;
3508
3509    });
3510
3511    $def(self, '$autoload?', function $Module_autoload$ques$7(const$) {
3512      var self = this;
3513
3514
3515      if (self.$$autoload && self.$$autoload[const$] && !self.$$autoload[const$].required && !self.$$autoload[const$].success) {
3516        return self.$$autoload[const$].path;
3517      }
3518
3519      var ancestors = self.$ancestors();
3520
3521      for (var i = 0, length = ancestors.length; i < length; i++) {
3522        if (ancestors[i].$$autoload && ancestors[i].$$autoload[const$] && !ancestors[i].$$autoload[const$].required && !ancestors[i].$$autoload[const$].success) {
3523          return ancestors[i].$$autoload[const$].path;
3524        }
3525      }
3526      return nil;
3527
3528    });
3529
3530    $def(self, '$class_variables', function $$class_variables() {
3531      var self = this;
3532
3533      return Object.keys(Opal.class_variables(self));
3534    });
3535
3536    $def(self, '$class_variable_get', function $$class_variable_get(name) {
3537      var self = this;
3538
3539
3540      name = $Opal['$class_variable_name!'](name);
3541      return Opal.class_variable_get(self, name, false);    });
3542
3543    $def(self, '$class_variable_set', function $$class_variable_set(name, value) {
3544      var self = this;
3545
3546
3547      $deny_frozen_access(self);
3548      name = $Opal['$class_variable_name!'](name);
3549      return Opal.class_variable_set(self, name, value);    });
3550
3551    $def(self, '$class_variable_defined?', function $Module_class_variable_defined$ques$8(name) {
3552      var self = this;
3553
3554
3555      name = $Opal['$class_variable_name!'](name);
3556      return Opal.class_variables(self).hasOwnProperty(name);    });
3557
3558    $def(self, '$const_added', $return_val(nil));
3559    $Opal.$pristine(self, "const_added");
3560
3561    $def(self, '$remove_class_variable', function $$remove_class_variable(name) {
3562      var self = this;
3563
3564
3565      $deny_frozen_access(self);
3566      name = $Opal['$class_variable_name!'](name);
3567
3568      if (Opal.hasOwnProperty.call(self.$$cvars, name)) {
3569        var value = self.$$cvars[name];
3570        delete self.$$cvars[name];
3571        return value;
3572      } else {
3573        $Kernel.$raise($$$('NameError'), "cannot remove " + (name) + " for " + (self));
3574      }
3575    });
3576
3577    $def(self, '$constants', function $$constants(inherit) {
3578      var self = this;
3579
3580
3581      if (inherit == null) inherit = true;
3582      return Opal.constants(self, inherit);    }, -1);
3583    $defs(self, '$constants', function $$constants(inherit) {
3584      var self = this;
3585
3586      if (inherit == null) {
3587        var nesting = (self.$$nesting || []).concat($Object),
3588            constant, constants = {},
3589            i, ii;
3590
3591        for(i = 0, ii = nesting.length; i < ii; i++) {
3592          for (constant in nesting[i].$$const) {
3593            constants[constant] = true;
3594          }
3595        }
3596        return Object.keys(constants);
3597      } else {
3598        return Opal.constants(self, inherit)
3599      }
3600    }, -1);
3601    $defs(self, '$nesting', function $$nesting() {
3602      var self = this;
3603
3604      return self.$$nesting || [];
3605    });
3606
3607    $def(self, '$const_defined?', function $Module_const_defined$ques$9(name, inherit) {
3608      var self = this;
3609
3610
3611      if (inherit == null) inherit = true;
3612      name = $$('Opal')['$const_name!'](name);
3613      if (!$truthy(name['$=~']($$$($Opal, 'CONST_NAME_REGEXP')))) {
3614        $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name));
3615      }
3616      var module, modules = [self], i, ii;
3617
3618      // Add up ancestors if inherit is true
3619      if (inherit) {
3620        modules = modules.concat(Opal.ancestors(self));
3621
3622        // Add Object's ancestors if it's a module – modules have no ancestors otherwise
3623        if (self.$$is_module) {
3624          modules = modules.concat([$Object]).concat(Opal.ancestors($Object));
3625        }
3626      }
3627
3628      for (i = 0, ii = modules.length; i < ii; i++) {
3629        module = modules[i];
3630        if (module.$$const[name] != null) { return true; }
3631        if (
3632          module.$$autoload &&
3633          module.$$autoload[name] &&
3634          !module.$$autoload[name].required &&
3635          !module.$$autoload[name].success
3636        ) {
3637          return true;
3638        }
3639      }
3640
3641      return false;
3642    }, -2);
3643
3644    $def(self, '$const_get', function $$const_get(name, inherit) {
3645      var self = this;
3646
3647
3648      if (inherit == null) inherit = true;
3649      name = $$('Opal')['$const_name!'](name);
3650
3651      if (name.indexOf('::') === 0 && name !== '::'){
3652        name = name.slice(2);
3653      }
3654      if ($truthy(name.indexOf('::') != -1 && name != '::')) {
3655        return $send(name.$split("::"), 'inject', [self], function $$10(o, c){
3656
3657          if (o == null) o = nil;
3658          if (c == null) c = nil;
3659          return o.$const_get(c);})
3660      }      if (!$truthy(name['$=~']($$$($Opal, 'CONST_NAME_REGEXP')))) {
3661        $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name));
3662      }
3663      if (inherit) {
3664        return Opal.$$([self], name);
3665      } else {
3666        return Opal.const_get_local(self, name);
3667      }
3668    }, -2);
3669
3670    $def(self, '$const_missing', function $$const_missing(name) {
3671      var self = this, full_const_name = nil;
3672
3673
3674      full_const_name = ($eqeq(self, $Object) ? (name) : ("" + (self) + "::" + (name)));
3675      return $Kernel.$raise($$$('NameError').$new("uninitialized constant " + (full_const_name), name));
3676    });
3677
3678    $def(self, '$const_set', function $$const_set(name, value) {
3679      var self = this;
3680
3681
3682      $deny_frozen_access(self);
3683      name = $Opal['$const_name!'](name);
3684      if (($truthy(name['$!~']($$$($Opal, 'CONST_NAME_REGEXP'))) || ($truthy(name['$start_with?']("::"))))) {
3685        $Kernel.$raise($$$('NameError').$new("wrong constant name " + (name), name));
3686      }      $const_set(self, name, value);
3687      return value;
3688    });
3689
3690    $def(self, '$public_constant', $return_val(nil));
3691
3692    $def(self, '$define_method', function $$define_method(name, method) {
3693      var block = $$define_method.$$p || nil, self = this, $ret_or_1 = nil, $ret_or_2 = nil;
3694
3695      $$define_method.$$p = null;
3696
3697      $deny_frozen_access(self);
3698
3699      if (method === undefined && block === nil)
3700        $Kernel.$raise($$$('ArgumentError'), "tried to create a Proc object without a block")
3701    ;
3702      block = ($truthy(($ret_or_1 = block)) ? ($ret_or_1) : ($eqeqeq($$$('Proc'), ($ret_or_2 = method)) ? (method) : ($eqeqeq($$$('Method'), $ret_or_2) ? (method.$to_proc().$$unbound) : ($eqeqeq($$$('UnboundMethod'), $ret_or_2) ? ($lambda(function $$11($a){var $post_args, args, self = $$11.$$s == null ? this : $$11.$$s, bound = nil;
3703
3704
3705        $post_args = $slice(arguments);
3706        args = $post_args;
3707        bound = method.$bind(self);
3708        return $send(bound, 'call', $to_a(args));}, {$$arity: -1, $$s: self})) : ($Kernel.$raise($$$('TypeError'), "wrong argument type " + (block.$class()) + " (expected Proc/Method)"))))));
3709
3710      if (typeof(Proxy) !== 'undefined') {
3711
3712        block.$$proxy_target = block;
3713        block = new Proxy(block, {
3714          apply: function(target, self, args) {
3715            var old_name = target.$$jsid;
3716            target.$$jsid = name;
3717            try {
3718              return target.apply(self, args);
3719            } catch(e) {
3720              if (e === target.$$brk || e === target.$$ret) return e.$v;
3721              throw e;
3722            } finally {
3723              target.$$jsid = old_name;
3724            }
3725          }
3726        });
3727      }
3728
3729      block.$$jsid        = name;
3730      block.$$s           = null;
3731      block.$$def         = block;
3732      block.$$define_meth = true;
3733
3734      return Opal.defn(self, $jsid(name), block);
3735    }, -2);
3736
3737    $def(self, '$freeze', function $$freeze() {
3738      var self = this;
3739
3740
3741      if ($truthy(self['$frozen?']())) {
3742        return self
3743      }
3744      if (!self.hasOwnProperty('$$base_module')) { $prop(self, '$$base_module', null); }
3745
3746      return $freeze(self);
3747    });
3748
3749    $def(self, '$remove_method', function $$remove_method($a) {
3750      var $post_args, names, self = this;
3751
3752
3753      $post_args = $slice(arguments);
3754      names = $post_args;
3755
3756      for (var i = 0; i < names.length; i++) {
3757        var name = names[i];
3758        if (!(typeof name === "string" || name.$$is_string)) {
3759          self.$raise($$$('TypeError'), "" + (self.$name()) + " is not a symbol nor a string");
3760        }
3761        $deny_frozen_access(self);
3762
3763        Opal.rdef(self, "$" + name);
3764      }
3765      return self;
3766    }, -1);
3767
3768    $def(self, '$singleton_class?', function $Module_singleton_class$ques$12() {
3769      var self = this;
3770
3771      return !!self.$$is_singleton;
3772    });
3773
3774    $def(self, '$include', function $$include($a) {
3775      var $post_args, mods, self = this;
3776
3777
3778      $post_args = $slice(arguments);
3779      mods = $post_args;
3780
3781      for (var i = mods.length - 1; i >= 0; i--) {
3782        var mod = mods[i];
3783
3784        if (!mod.$$is_module) {
3785          $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)");
3786        }
3787
3788        (mod).$append_features(self);
3789        (mod).$included(self);
3790      }
3791      return self;
3792    }, -1);
3793
3794    $def(self, '$included_modules', function $$included_modules() {
3795      var self = this;
3796
3797      return Opal.included_modules(self);
3798    });
3799
3800    $def(self, '$include?', function $Module_include$ques$13(mod) {
3801      var self = this;
3802
3803
3804      if (!mod.$$is_module) {
3805        $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)");
3806      }
3807
3808      var i, ii, mod2, ancestors = Opal.ancestors(self);
3809
3810      for (i = 0, ii = ancestors.length; i < ii; i++) {
3811        mod2 = ancestors[i];
3812        if (mod2 === mod && mod2 !== self) {
3813          return true;
3814        }
3815      }
3816
3817      return false;
3818
3819    });
3820
3821    $def(self, '$instance_method', function $$instance_method(name) {
3822      var self = this;
3823
3824
3825      var meth = self.$$prototype[$jsid(name)];
3826
3827      if (!meth || meth.$$stub) {
3828        $Kernel.$raise($$$('NameError').$new("undefined method `" + (name) + "' for class `" + (self.$name()) + "'", name));
3829      }
3830
3831      return $$$('UnboundMethod').$new(self, meth.$$owner || self, meth, name);
3832
3833    });
3834
3835    $def(self, '$instance_methods', function $$instance_methods(include_super) {
3836      var self = this;
3837
3838
3839      if (include_super == null) include_super = true;
3840
3841      if ($truthy(include_super)) {
3842        return Opal.instance_methods(self);
3843      } else {
3844        return Opal.own_instance_methods(self);
3845      }
3846    }, -1);
3847
3848    $def(self, '$included', $return_val(nil));
3849
3850    $def(self, '$extended', $return_val(nil));
3851
3852    $def(self, '$extend_object', function $$extend_object(object) {
3853
3854
3855      $deny_frozen_access(object);
3856      return nil;
3857    });
3858
3859    $def(self, '$method_added', function $$method_added($a) {
3860
3861
3862      $slice(arguments);
3863      return nil;
3864    }, -1);
3865
3866    $def(self, '$method_removed', function $$method_removed($a) {
3867
3868
3869      $slice(arguments);
3870      return nil;
3871    }, -1);
3872
3873    $def(self, '$method_undefined', function $$method_undefined($a) {
3874
3875
3876      $slice(arguments);
3877      return nil;
3878    }, -1);
3879
3880    $def(self, '$module_eval', function $$module_eval($a) {
3881      var block = $$module_eval.$$p || nil, $post_args, args, $b, self = this, string = nil, file = nil, default_eval_options = nil, $ret_or_1 = nil, compiling_options = nil, compiled = nil;
3882
3883      $$module_eval.$$p = null;
3884      $post_args = $slice(arguments);
3885      args = $post_args;
3886      if (($truthy(block['$nil?']()) && ($truthy(!!Opal.compile)))) {
3887
3888        if (!$truthy($range(1, 3, false)['$cover?'](args.$size()))) {
3889          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)");
3890        }        $b = [].concat($to_a(args)), (string = ($b[0] == null ? nil : $b[0])), (file = ($b[1] == null ? nil : $b[1])), (($b[2] == null ? nil : $b[2]));
3891        default_eval_options = $hash2(["file", "eval"], {"file": ($truthy(($ret_or_1 = file)) ? ($ret_or_1) : ("(eval)")), "eval": true});
3892        compiling_options = Opal.hash({ arity_check: false }).$merge(default_eval_options);
3893        compiled = $Opal.$compile(string, compiling_options);
3894        block = $send($Kernel, 'proc', [], function $$14(){var self = $$14.$$s == null ? this : $$14.$$s;
3895
3896          return new Function("Opal,self", "return " + compiled)(Opal, self);}, {$$s: self});
3897      } else if ($truthy(args['$any?']())) {
3898        $Kernel.$raise($$$('ArgumentError'), "" + ("wrong number of arguments (" + (args.$size()) + " for 0)") + "\n\n  NOTE:If you want to enable passing a String argument please add \"require 'opal-parser'\" to your script\n");
3899      }
3900      var old = block.$$s,
3901          result;
3902
3903      block.$$s = null;
3904      result = block.apply(self, [self]);
3905      block.$$s = old;
3906
3907      return result;
3908    }, -1);
3909
3910    $def(self, '$module_exec', function $$module_exec($a) {
3911      var block = $$module_exec.$$p || nil, $post_args, args, self = this;
3912
3913      $$module_exec.$$p = null;
3914      $post_args = $slice(arguments);
3915      args = $post_args;
3916
3917      if (block === nil) {
3918        $Kernel.$raise($$$('LocalJumpError'), "no block given");
3919      }
3920
3921      var block_self = block.$$s, result;
3922
3923      block.$$s = null;
3924      result = block.apply(self, args);
3925      block.$$s = block_self;
3926
3927      return result;
3928    }, -1);
3929
3930    $def(self, '$method_defined?', function $Module_method_defined$ques$15(method) {
3931      var self = this;
3932
3933
3934      var body = self.$$prototype[$jsid(method)];
3935      return (!!body) && !body.$$stub;
3936
3937    });
3938
3939    $def(self, '$module_function', function $$module_function($a) {
3940      var $post_args, methods, self = this;
3941
3942
3943      $post_args = $slice(arguments);
3944      methods = $post_args;
3945
3946      $deny_frozen_access(self);
3947
3948      if (methods.length === 0) {
3949        self.$$module_function = true;
3950        return nil;
3951      }
3952      else {
3953        for (var i = 0, length = methods.length; i < length; i++) {
3954          var meth = methods[i],
3955              id   = $jsid(meth),
3956              func = self.$$prototype[id];
3957
3958          Opal.defs(self, id, func);
3959        }
3960        return methods.length === 1 ? methods[0] : methods;
3961      }
3962    }, -1);
3963
3964    $def(self, '$name', function $$name() {
3965      var self = this;
3966
3967
3968      if (self.$$full_name) {
3969        return self.$$full_name;
3970      }
3971
3972      var result = [], base = self;
3973
3974      while (base) {
3975        // Give up if any of the ancestors is unnamed
3976        if (base.$$name === nil || base.$$name == null) return nil;
3977
3978        result.unshift(base.$$name);
3979
3980        base = base.$$base_module;
3981
3982        if (base === $Object) {
3983          break;
3984        }
3985      }
3986
3987      if (result.length === 0) {
3988        return nil;
3989      }
3990
3991      return self.$$full_name = result.join('::');
3992
3993    });
3994
3995    $def(self, '$prepend', function $$prepend($a) {
3996      var $post_args, mods, self = this;
3997
3998
3999      $post_args = $slice(arguments);
4000      mods = $post_args;
4001
4002      if (mods.length === 0) {
4003        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (given 0, expected 1+)");
4004      }
4005
4006      for (var i = mods.length - 1; i >= 0; i--) {
4007        var mod = mods[i];
4008
4009        if (!mod.$$is_module) {
4010          $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)");
4011        }
4012
4013        (mod).$prepend_features(self);
4014        (mod).$prepended(self);
4015      }
4016      return self;
4017    }, -1);
4018
4019    $def(self, '$prepend_features', function $$prepend_features(prepender) {
4020      var self = this;
4021
4022
4023
4024      $deny_frozen_access(prepender);
4025
4026      if (!self.$$is_module) {
4027        $Kernel.$raise($$$('TypeError'), "wrong argument type " + (self.$class()) + " (expected Module)");
4028      }
4029
4030      Opal.prepend_features(self, prepender)
4031    ;
4032      return self;
4033    });
4034
4035    $def(self, '$prepended', $return_val(nil));
4036
4037    $def(self, '$remove_const', function $$remove_const(name) {
4038      var self = this;
4039
4040
4041      $deny_frozen_access(self);
4042      return Opal.const_remove(self, name);    });
4043
4044    $def(self, '$to_s', function $$to_s() {
4045      var self = this, $ret_or_1 = nil;
4046
4047      if ($truthy(($ret_or_1 = Opal.Module.$name.call(self)))) {
4048        return $ret_or_1
4049      } else {
4050        return "#<" + (self.$$is_module ? 'Module' : 'Class') + ":0x" + (self.$__id__().$to_s(16)) + ">"
4051      }
4052    });
4053
4054    $def(self, '$undef_method', function $$undef_method($a) {
4055      var $post_args, names, self = this;
4056
4057
4058      $post_args = $slice(arguments);
4059      names = $post_args;
4060
4061      for (var i = 0; i < names.length; i++) {
4062        var name = names[i];
4063        if (!(typeof name === "string" || name.$$is_string)) {
4064          self.$raise($$$('TypeError'), "" + (self.$name()) + " is not a symbol nor a string");
4065        }
4066        $deny_frozen_access(self);
4067
4068        Opal.udef(self, "$" + names[i]);
4069      }
4070      return self;
4071    }, -1);
4072
4073    $def(self, '$instance_variables', function $$instance_variables() {
4074      var self = this, consts = nil;
4075
4076
4077      consts = (Opal.Module.$$nesting = $nesting, self.$constants());
4078
4079      var result = [];
4080
4081      for (var name in self) {
4082        if (self.hasOwnProperty(name) && name.charAt(0) !== '$' && name !== 'constructor' && !consts['$include?'](name)) {
4083          result.push('@' + name);
4084        }
4085      }
4086
4087      return result;
4088    });
4089
4090    $def(self, '$dup', function $$dup() {
4091      var $yield = $$dup.$$p || nil, self = this, copy = nil;
4092
4093      $$dup.$$p = null;
4094
4095      copy = $send2(self, $find_super(self, 'dup', $$dup, false, true), 'dup', [], $yield);
4096      copy.$copy_class_variables(self);
4097      copy.$copy_constants(self);
4098      return copy;
4099    });
4100
4101    $def(self, '$copy_class_variables', function $$copy_class_variables(other) {
4102      var self = this;
4103
4104
4105      for (var name in other.$$cvars) {
4106        self.$$cvars[name] = other.$$cvars[name];
4107      }
4108
4109    });
4110
4111    $def(self, '$copy_constants', function $$copy_constants(other) {
4112      var self = this;
4113
4114
4115      var name, other_constants = other.$$const;
4116
4117      for (name in other_constants) {
4118        $const_set(self, name, other_constants[name]);
4119      }
4120
4121    });
4122
4123    $def(self, '$refine', function $$refine(klass) {
4124      var block = $$refine.$$p || nil, $a, self = this, refinement_module = nil, m = nil, klass_id = nil;
4125
4126      $$refine.$$p = null;
4127      $a = [self, nil, nil], (refinement_module = $a[0]), (m = $a[1]), (klass_id = $a[2]);
4128
4129      klass_id = Opal.id(klass);
4130      if (typeof self.$$refine_modules === "undefined") {
4131        self.$$refine_modules = Object.create(null);
4132      }
4133      if (typeof self.$$refine_modules[klass_id] === "undefined") {
4134        m = self.$$refine_modules[klass_id] = $$$('Refinement').$new();
4135      }
4136      else {
4137        m = self.$$refine_modules[klass_id];
4138      }
4139      m.refinement_module = refinement_module;
4140      m.refined_class = klass
4141    ;
4142      $send(m, 'class_exec', [], block.$to_proc());
4143      return m;
4144    });
4145
4146    $def(self, '$refinements', function $$refinements() {
4147      var self = this;
4148
4149
4150      var refine_modules = self.$$refine_modules, hash = $hash2([], {});      if (typeof refine_modules === "undefined") return hash;
4151      for (var id in refine_modules) {
4152        hash['$[]='](refine_modules[id].refined_class, refine_modules[id]);
4153      }
4154      return hash;
4155
4156    });
4157
4158    $def(self, '$using', function $$using(mod) {
4159
4160      return $Kernel.$raise("Module#using is not permitted in methods")
4161    });
4162    $alias(self, "class_eval", "module_eval");
4163    $alias(self, "class_exec", "module_exec");
4164    return $alias(self, "inspect", "to_s");
4165  })('::', null, $nesting);
4166  return (function($base, $super) {
4167    var self = $klass($base, $super, 'Refinement');
4168
4169    var $proto = self.$$prototype;
4170
4171    $proto.refinement_module = $proto.refined_class = nil;
4172
4173    self.$attr_reader("refined_class");
4174    return $def(self, '$inspect', function $$inspect() {
4175      var $yield = $$inspect.$$p || nil, self = this;
4176
4177      $$inspect.$$p = null;
4178      if ($truthy(self.refinement_module)) {
4179        return "#<refinement:" + (self.refined_class.$inspect()) + "@" + (self.refinement_module.$inspect()) + ">"
4180      } else {
4181        return $send2(self, $find_super(self, 'inspect', $$inspect, false, true), 'inspect', [], $yield)
4182      }
4183    });
4184  })('::', $Module);
4185};
4186
4187Opal.modules["corelib/class"] = function(Opal) {/* Generated by Opal 1.7.3 */
4188  var $klass = Opal.klass, $send = Opal.send, $defs = Opal.defs, $def = Opal.def, $rb_plus = Opal.rb_plus, $return_val = Opal.return_val, $slice = Opal.slice, $send2 = Opal.send2, $find_super = Opal.find_super, $Kernel = Opal.Kernel, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
4189
4190  Opal.add_stubs('require,class_eval,to_proc,+,subclasses,flatten,map,initialize_copy,allocate,name,to_s,raise');
4191
4192  self.$require("corelib/module");
4193  return (function($base, $super, $parent_nesting) {
4194    var self = $klass($base, $super, 'Class');
4195
4196    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
4197
4198
4199    $defs(self, '$new', function $Class_new$1(superclass) {
4200      var block = $Class_new$1.$$p || nil;
4201
4202      $Class_new$1.$$p = null;
4203      if (superclass == null) superclass = $$('Object');
4204
4205      if (!superclass.$$is_class) {
4206        throw Opal.TypeError.$new("superclass must be a Class");
4207      }
4208
4209      var klass = Opal.allocate_class(nil, superclass);
4210      superclass.$inherited(klass);
4211      ((block !== nil) ? ($send((klass), 'class_eval', [], block.$to_proc())) : nil);
4212      return klass;
4213    }, -1);
4214
4215    $def(self, '$allocate', function $$allocate() {
4216      var self = this;
4217
4218
4219      var obj = new self.$$constructor();
4220      obj.$$id = Opal.uid();
4221      return obj;
4222
4223    });
4224
4225    $def(self, '$descendants', function $$descendants() {
4226      var self = this;
4227
4228      return $rb_plus(self.$subclasses(), $send(self.$subclasses(), 'map', [], "descendants".$to_proc()).$flatten())
4229    });
4230
4231    $def(self, '$inherited', $return_val(nil));
4232
4233    $def(self, '$initialize_dup', function $$initialize_dup(original) {
4234      var self = this;
4235
4236
4237      self.$initialize_copy(original);
4238
4239      self.$$name = null;
4240      self.$$full_name = null;
4241    });
4242
4243    $def(self, '$new', function $Class_new$2($a) {
4244      var block = $Class_new$2.$$p || nil, $post_args, args, self = this;
4245
4246      $Class_new$2.$$p = null;
4247      $post_args = $slice(arguments);
4248      args = $post_args;
4249
4250      var object = self.$allocate();
4251      Opal.send(object, object.$initialize, args, block);
4252      return object;
4253    }, -1);
4254
4255    $def(self, '$subclasses', function $$subclasses() {
4256      var self = this;
4257
4258
4259      if (typeof WeakRef !== 'undefined') {
4260        var i, subclass, out = [];
4261        for (i = 0; i < self.$$subclasses.length; i++) {
4262          subclass = self.$$subclasses[i].deref();
4263          if (subclass !== undefined) {
4264            out.push(subclass);
4265          }
4266        }
4267        return out;
4268      }
4269      else {
4270        return self.$$subclasses;
4271      }
4272
4273    });
4274
4275    $def(self, '$superclass', function $$superclass() {
4276      var self = this;
4277
4278      return self.$$super || nil;
4279    });
4280
4281    $def(self, '$to_s', function $$to_s() {
4282      var self = this;
4283
4284      $$to_s.$$p = null;
4285
4286      var singleton_of = self.$$singleton_of;
4287
4288      if (singleton_of && singleton_of.$$is_a_module) {
4289        return "#<Class:" + ((singleton_of).$name()) + ">";
4290      }
4291      else if (singleton_of) {
4292        // a singleton class created from an object
4293        return "#<Class:#<" + ((singleton_of.$$class).$name()) + ":0x" + ((Opal.id(singleton_of)).$to_s(16)) + ">>";
4294      }
4295
4296      return $send2(self, $find_super(self, 'to_s', $$to_s, false, true), 'to_s', [], null);
4297
4298    });
4299
4300    $def(self, '$attached_object', function $$attached_object() {
4301      var self = this;
4302
4303
4304      if (self.$$singleton_of != null) {
4305        return self.$$singleton_of;
4306      }
4307      else {
4308        $Kernel.$raise($$$('TypeError'), "`" + (self) + "' is not a singleton class");
4309      }
4310
4311    });
4312    return $alias(self, "inspect", "to_s");
4313  })('::', null, $nesting);
4314};
4315
4316Opal.modules["corelib/basic_object"] = function(Opal) {/* Generated by Opal 1.7.3 */
4317  var $klass = Opal.klass, $slice = Opal.slice, $def = Opal.def, $alias = Opal.alias, $return_val = Opal.return_val, $Opal = Opal.Opal, $truthy = Opal.truthy, $range = Opal.range, $Kernel = Opal.Kernel, $to_a = Opal.to_a, $hash2 = Opal.hash2, $send = Opal.send, $eqeq = Opal.eqeq, $rb_ge = Opal.rb_ge, nil = Opal.nil, $$$ = Opal.$$$;
4318
4319  Opal.add_stubs('==,raise,inspect,pristine,!,nil?,cover?,size,merge,compile,proc,[],first,>=,length,instance_variable_get,any?,new,caller');
4320  return (function($base, $super) {
4321    var self = $klass($base, $super, 'BasicObject');
4322
4323
4324
4325
4326    $def(self, '$initialize', function $$initialize($a) {
4327
4328
4329      $slice(arguments);
4330      return nil;
4331    }, -1);
4332
4333    $def(self, '$==', function $BasicObject_$eq_eq$1(other) {
4334      var self = this;
4335
4336      return self === other;
4337    });
4338
4339    $def(self, '$eql?', function $BasicObject_eql$ques$2(other) {
4340      var self = this;
4341
4342      return self['$=='](other)
4343    });
4344    $alias(self, "equal?", "==");
4345
4346    $def(self, '$__id__', function $$__id__() {
4347      var self = this;
4348
4349
4350      if (self.$$id != null) {
4351        return self.$$id;
4352      }
4353      Opal.prop(self, '$$id', Opal.uid());
4354      return self.$$id;
4355
4356    });
4357
4358    $def(self, '$__send__', function $$__send__(symbol, $a) {
4359      var block = $$__send__.$$p || nil, $post_args, args, self = this;
4360
4361      $$__send__.$$p = null;
4362      $post_args = $slice(arguments, 1);
4363      args = $post_args;
4364
4365      if (!symbol.$$is_string) {
4366        self.$raise($$$('TypeError'), "" + (self.$inspect()) + " is not a symbol nor a string");
4367      }
4368
4369      var func = self[Opal.jsid(symbol)];
4370
4371      if (func) {
4372        if (block !== nil) {
4373          func.$$p = block;
4374        }
4375
4376        return func.apply(self, args);
4377      }
4378
4379      if (block !== nil) {
4380        self.$method_missing.$$p = block;
4381      }
4382
4383      return self.$method_missing.apply(self, [symbol].concat(args));
4384    }, -2);
4385
4386    $def(self, '$!', $return_val(false));
4387    $Opal.$pristine("!");
4388
4389    $def(self, '$!=', function $BasicObject_$not_eq$3(other) {
4390      var self = this;
4391
4392      return self['$=='](other)['$!']()
4393    });
4394
4395    $def(self, '$instance_eval', function $$instance_eval($a) {
4396      var block = $$instance_eval.$$p || nil, $post_args, args, $b, self = this, string = nil, file = nil, default_eval_options = nil, $ret_or_1 = nil, compiling_options = nil, compiled = nil;
4397
4398      $$instance_eval.$$p = null;
4399      $post_args = $slice(arguments);
4400      args = $post_args;
4401      if (($truthy(block['$nil?']()) && ($truthy(!!Opal.compile)))) {
4402
4403        if (!$truthy($range(1, 3, false)['$cover?'](args.$size()))) {
4404          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)");
4405        }        $b = [].concat($to_a(args)), (string = ($b[0] == null ? nil : $b[0])), (file = ($b[1] == null ? nil : $b[1])), (($b[2] == null ? nil : $b[2]));
4406        default_eval_options = $hash2(["file", "eval"], {"file": ($truthy(($ret_or_1 = file)) ? ($ret_or_1) : ("(eval)")), "eval": true});
4407        compiling_options = Opal.hash({ arity_check: false }).$merge(default_eval_options);
4408        compiled = $Opal.$compile(string, compiling_options);
4409        block = $send($Kernel, 'proc', [], function $$4(){var self = $$4.$$s == null ? this : $$4.$$s;
4410
4411          return new Function("Opal,self", "return " + compiled)(Opal, self);}, {$$s: self});
4412      } else if ((($truthy(block['$nil?']()) && ($truthy($rb_ge(args.$length(), 1)))) && ($eqeq(args.$first()['$[]'](0), "@")))) {
4413        return self.$instance_variable_get(args.$first())
4414      } else if ($truthy(args['$any?']())) {
4415        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$size()) + " for 0)");
4416      }
4417      var old = block.$$s,
4418          result;
4419
4420      block.$$s = null;
4421
4422      // Need to pass $$eval so that method definitions know if this is
4423      // being done on a class/module. Cannot be compiler driven since
4424      // send(:instance_eval) needs to work.
4425      if (self.$$is_a_module) {
4426        self.$$eval = true;
4427        try {
4428          result = block.call(self, self);
4429        }
4430        finally {
4431          self.$$eval = false;
4432        }
4433      }
4434      else {
4435        result = block.call(self, self);
4436      }
4437
4438      block.$$s = old;
4439
4440      return result;
4441    }, -1);
4442
4443    $def(self, '$instance_exec', function $$instance_exec($a) {
4444      var block = $$instance_exec.$$p || nil, $post_args, args, self = this;
4445
4446      $$instance_exec.$$p = null;
4447      $post_args = $slice(arguments);
4448      args = $post_args;
4449      if (!$truthy(block)) {
4450        $Kernel.$raise($$$('ArgumentError'), "no block given");
4451      }
4452      var block_self = block.$$s,
4453          result;
4454
4455      block.$$s = null;
4456
4457      if (self.$$is_a_module) {
4458        self.$$eval = true;
4459        try {
4460          result = block.apply(self, args);
4461        }
4462        finally {
4463          self.$$eval = false;
4464        }
4465      }
4466      else {
4467        result = block.apply(self, args);
4468      }
4469
4470      block.$$s = block_self;
4471
4472      return result;
4473    }, -1);
4474
4475    $def(self, '$singleton_method_added', function $$singleton_method_added($a) {
4476
4477
4478      $slice(arguments);
4479      return nil;
4480    }, -1);
4481
4482    $def(self, '$singleton_method_removed', function $$singleton_method_removed($a) {
4483
4484
4485      $slice(arguments);
4486      return nil;
4487    }, -1);
4488
4489    $def(self, '$singleton_method_undefined', function $$singleton_method_undefined($a) {
4490
4491
4492      $slice(arguments);
4493      return nil;
4494    }, -1);
4495
4496    $def(self, '$method_missing', function $$method_missing(symbol, $a) {
4497      var $post_args, args, self = this, inspect_result = nil;
4498
4499      $$method_missing.$$p = null;
4500      $post_args = $slice(arguments, 1);
4501      args = $post_args;
4502      inspect_result = $Opal.$inspect(self);
4503      return $Kernel.$raise($$$('NoMethodError').$new("undefined method `" + (symbol) + "' for " + (inspect_result), symbol, args), nil, $Kernel.$caller(1));
4504    }, -2);
4505    $Opal.$pristine(self, "method_missing");
4506    return $def(self, '$respond_to_missing?', function $BasicObject_respond_to_missing$ques$5(method_name, include_all) {
4507      return false;
4508    }, -2);
4509  })('::', null)
4510};
4511
4512Opal.modules["corelib/kernel"] = function(Opal) {/* Generated by Opal 1.7.3 */
4513  var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $Opal = Opal.Opal, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $freeze_props = Opal.freeze_props, $jsid = Opal.jsid, $module = Opal.module, $return_val = Opal.return_val, $def = Opal.def, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $ensure_kwargs = Opal.ensure_kwargs, $eqeq = Opal.eqeq, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $eqeqeq = Opal.eqeqeq, $return_self = Opal.return_self, $rb_le = Opal.rb_le, $extract_kwargs = Opal.extract_kwargs, $rb_lt = Opal.rb_lt, $Object = Opal.Object, $alias = Opal.alias, $klass = Opal.klass, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
4514
4515  Opal.add_stubs('!,=~,==,object_id,raise,new,class,coerce_to?,<<,map,caller,nil?,allocate,copy_instance_variables,copy_singleton_methods,initialize_clone,frozen?,freeze,initialize_copy,define_method,singleton_class,to_proc,initialize_dup,for,empty?,pop,call,append_features,extend_object,extended,gets,__id__,include?,each,instance_variables,instance_variable_get,inspect,+,to_s,instance_variable_name!,respond_to?,to_int,coerce_to!,Integer,===,enum_for,result,any?,print,format,puts,<=,length,[],readline,<,first,split,to_str,exception,backtrace,rand,respond_to_missing?,pristine,try_convert!,expand_path,join,start_with?,new_seed,srand,tag,value,open,is_a?,__send__,yield_self,include');
4516
4517  (function($base, $parent_nesting) {
4518    var self = $module($base, 'Kernel');
4519
4520    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
4521
4522
4523
4524    $def(self, '$=~', $return_val(false));
4525
4526    $def(self, '$!~', function $Kernel_$excl_tilde$1(obj) {
4527      var self = this;
4528
4529      return self['$=~'](obj)['$!']()
4530    });
4531
4532    $def(self, '$===', function $Kernel_$eq_eq_eq$2(other) {
4533      var self = this, $ret_or_1 = nil;
4534
4535      if ($truthy(($ret_or_1 = self.$object_id()['$=='](other.$object_id())))) {
4536        return $ret_or_1
4537      } else {
4538        return self['$=='](other)
4539      }
4540    });
4541
4542    $def(self, '$<=>', function $Kernel_$lt_eq_gt$3(other) {
4543      var self = this;
4544
4545
4546      // set guard for infinite recursion
4547      self.$$comparable = true;
4548
4549      var x = self['$=='](other);
4550
4551      if (x && x !== nil) {
4552        return 0;
4553      }
4554
4555      return nil;
4556
4557    });
4558
4559    $def(self, '$method', function $$method(name) {
4560      var self = this;
4561
4562
4563      var meth = self[$jsid(name)];
4564
4565      if (!meth || meth.$$stub) {
4566        $Kernel.$raise($$$('NameError').$new("undefined method `" + (name) + "' for class `" + (self.$class()) + "'", name));
4567      }
4568
4569      return $$$('Method').$new(self, meth.$$owner || self.$class(), meth, name);
4570
4571    });
4572
4573    $def(self, '$methods', function $$methods(all) {
4574      var self = this;
4575
4576
4577      if (all == null) all = true;
4578
4579      if ($truthy(all)) {
4580        return Opal.methods(self);
4581      } else {
4582        return Opal.own_methods(self);
4583      }
4584    }, -1);
4585
4586    $def(self, '$public_methods', function $$public_methods(all) {
4587      var self = this;
4588
4589
4590      if (all == null) all = true;
4591
4592      if ($truthy(all)) {
4593        return Opal.methods(self);
4594      } else {
4595        return Opal.receiver_methods(self);
4596      }
4597    }, -1);
4598
4599    $def(self, '$Array', function $$Array(object) {
4600
4601
4602      var coerced;
4603
4604      if (object === nil) {
4605        return [];
4606      }
4607
4608      if (object.$$is_array) {
4609        return object;
4610      }
4611
4612      coerced = $Opal['$coerce_to?'](object, $$$('Array'), "to_ary");
4613      if (coerced !== nil) { return coerced; }
4614
4615      coerced = $Opal['$coerce_to?'](object, $$$('Array'), "to_a");
4616      if (coerced !== nil) { return coerced; }
4617
4618      return [object];
4619
4620    });
4621
4622    $def(self, '$at_exit', function $$at_exit() {
4623      var block = $$at_exit.$$p || nil, $ret_or_1 = nil;
4624      if ($gvars.__at_exit__ == null) $gvars.__at_exit__ = nil;
4625
4626      $$at_exit.$$p = null;
4627      $gvars.__at_exit__ = ($truthy(($ret_or_1 = $gvars.__at_exit__)) ? ($ret_or_1) : ([]));
4628      $gvars.__at_exit__['$<<'](block);
4629      return block;
4630    });
4631
4632    $def(self, '$caller', function $$caller(start, length) {
4633
4634
4635      if (start == null) start = 1;
4636      if (length == null) length = nil;
4637
4638      var stack, result;
4639
4640      stack = new Error().$backtrace();
4641      result = [];
4642
4643      for (var i = start + 1, ii = stack.length; i < ii; i++) {
4644        if (!stack[i].match(/runtime\.js/)) {
4645          result.push(stack[i]);
4646        }
4647      }
4648      if (length != nil) result = result.slice(0, length);
4649      return result;
4650    }, -1);
4651
4652    $def(self, '$caller_locations', function $$caller_locations($a) {
4653      var $post_args, args, self = this;
4654
4655
4656      $post_args = $slice(arguments);
4657      args = $post_args;
4658      return $send($send(self, 'caller', $to_a(args)), 'map', [], function $$4(loc){
4659
4660        if (loc == null) loc = nil;
4661        return $$$($$$($$$('Thread'), 'Backtrace'), 'Location').$new(loc);});
4662    }, -1);
4663
4664    $def(self, '$class', function $Kernel_class$5() {
4665      var self = this;
4666
4667      return self.$$class;
4668    });
4669
4670    $def(self, '$copy_instance_variables', function $$copy_instance_variables(other) {
4671      var self = this;
4672
4673
4674      var keys = Object.keys(other), i, ii, name;
4675      for (i = 0, ii = keys.length; i < ii; i++) {
4676        name = keys[i];
4677        if (name.charAt(0) !== '$' && other.hasOwnProperty(name)) {
4678          self[name] = other[name];
4679        }
4680      }
4681
4682    });
4683
4684    $def(self, '$copy_singleton_methods', function $$copy_singleton_methods(other) {
4685      var self = this;
4686
4687
4688      var i, name, names, length;
4689
4690      if (other.hasOwnProperty('$$meta') && other.$$meta !== null) {
4691        var other_singleton_class = Opal.get_singleton_class(other);
4692        var self_singleton_class = Opal.get_singleton_class(self);
4693        names = Object.getOwnPropertyNames(other_singleton_class.$$prototype);
4694
4695        for (i = 0, length = names.length; i < length; i++) {
4696          name = names[i];
4697          if (Opal.is_method(name)) {
4698            self_singleton_class.$$prototype[name] = other_singleton_class.$$prototype[name];
4699          }
4700        }
4701
4702        self_singleton_class.$$const = Object.assign({}, other_singleton_class.$$const);
4703        Object.setPrototypeOf(
4704          self_singleton_class.$$prototype,
4705          Object.getPrototypeOf(other_singleton_class.$$prototype)
4706        );
4707      }
4708
4709      for (i = 0, names = Object.getOwnPropertyNames(other), length = names.length; i < length; i++) {
4710        name = names[i];
4711        if (name.charAt(0) === '$' && name.charAt(1) !== '$' && other.hasOwnProperty(name)) {
4712          self[name] = other[name];
4713        }
4714      }
4715
4716    });
4717
4718    $def(self, '$clone', function $$clone($kwargs) {
4719      var freeze, self = this, copy = nil;
4720
4721
4722      $kwargs = $ensure_kwargs($kwargs);
4723
4724      freeze = $kwargs.$$smap["freeze"];if (freeze == null) freeze = nil;
4725      if (!(($truthy(freeze['$nil?']()) || ($eqeq(freeze, true))) || ($eqeq(freeze, false)))) {
4726        self.$raise($$('ArgumentError'), "unexpected value for freeze: " + (freeze.$class()));
4727      }      copy = self.$class().$allocate();
4728      copy.$copy_instance_variables(self);
4729      copy.$copy_singleton_methods(self);
4730      copy.$initialize_clone(self, $hash2(["freeze"], {"freeze": freeze}));
4731      if (($eqeq(freeze, true) || (($truthy(freeze['$nil?']()) && ($truthy(self['$frozen?']())))))) {
4732        copy.$freeze();
4733      }      return copy;
4734    }, -1);
4735
4736    $def(self, '$initialize_clone', function $$initialize_clone(other, $kwargs) {
4737      var self = this;
4738
4739
4740      $kwargs = $ensure_kwargs($kwargs);
4741
4742      $kwargs.$$smap["freeze"];      self.$initialize_copy(other);
4743      return self;
4744    }, -2);
4745
4746    $def(self, '$define_singleton_method', function $$define_singleton_method(name, method) {
4747      var block = $$define_singleton_method.$$p || nil, self = this;
4748
4749      $$define_singleton_method.$$p = null;
4750      return $send(self.$singleton_class(), 'define_method', [name, method], block.$to_proc());
4751    }, -2);
4752
4753    $def(self, '$dup', function $$dup() {
4754      var self = this, copy = nil;
4755
4756
4757      copy = self.$class().$allocate();
4758      copy.$copy_instance_variables(self);
4759      copy.$initialize_dup(self);
4760      return copy;
4761    });
4762
4763    $def(self, '$initialize_dup', function $$initialize_dup(other) {
4764      var self = this;
4765
4766      return self.$initialize_copy(other)
4767    });
4768
4769    $def(self, '$enum_for', function $$enum_for($a, $b) {
4770      var block = $$enum_for.$$p || nil, $post_args, method, args, self = this;
4771
4772      $$enum_for.$$p = null;
4773      $post_args = $slice(arguments);
4774
4775      if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each";
4776      args = $post_args;
4777      return $send($$$('Enumerator'), 'for', [self, method].concat($to_a(args)), block.$to_proc());
4778    }, -1);
4779
4780    $def(self, '$equal?', function $Kernel_equal$ques$6(other) {
4781      var self = this;
4782
4783      return self === other;
4784    });
4785
4786    $def(self, '$exit', function $$exit(status) {
4787      var $ret_or_1 = nil, block = nil;
4788      if ($gvars.__at_exit__ == null) $gvars.__at_exit__ = nil;
4789
4790
4791      if (status == null) status = true;
4792      $gvars.__at_exit__ = ($truthy(($ret_or_1 = $gvars.__at_exit__)) ? ($ret_or_1) : ([]));
4793      while (!($truthy($gvars.__at_exit__['$empty?']()))) {
4794
4795        block = $gvars.__at_exit__.$pop();
4796        block.$call();
4797      }
4798      if (status.$$is_boolean) {
4799        status = status ? 0 : 1;
4800      } else {
4801        status = $coerce_to(status, $$$('Integer'), 'to_int');
4802      }
4803
4804      Opal.exit(status);
4805      return nil;
4806    }, -1);
4807
4808    $def(self, '$extend', function $$extend($a) {
4809      var $post_args, mods, self = this;
4810
4811
4812      $post_args = $slice(arguments);
4813      mods = $post_args;
4814
4815      if (mods.length == 0) {
4816        self.$raise($$$('ArgumentError'), "wrong number of arguments (given 0, expected 1+)");
4817      }
4818
4819      $deny_frozen_access(self);
4820
4821      var singleton = self.$singleton_class();
4822
4823      for (var i = mods.length - 1; i >= 0; i--) {
4824        var mod = mods[i];
4825
4826        if (!mod.$$is_module) {
4827          $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((mod).$class()) + " (expected Module)");
4828        }
4829
4830        (mod).$append_features(singleton);
4831        (mod).$extend_object(self);
4832        (mod).$extended(self);
4833      }
4834      return self;
4835    }, -1);
4836
4837    $def(self, '$freeze', function $$freeze() {
4838      var self = this;
4839
4840
4841      if ($truthy(self['$frozen?']())) {
4842        return self
4843      }
4844      if (typeof(self) === "object") {
4845        $freeze_props(self);
4846        return $freeze(self);
4847      }
4848      return self;
4849    });
4850
4851    $def(self, '$frozen?', function $Kernel_frozen$ques$7() {
4852      var self = this;
4853
4854
4855      switch (typeof(self)) {
4856      case "string":
4857      case "symbol":
4858      case "number":
4859      case "boolean":
4860        return true;
4861      case "object":
4862        return (self.$$frozen || false);
4863      default:
4864        return false;
4865      }
4866
4867    });
4868
4869    $def(self, '$gets', function $$gets($a) {
4870      var $post_args, args;
4871      if ($gvars.stdin == null) $gvars.stdin = nil;
4872
4873
4874      $post_args = $slice(arguments);
4875      args = $post_args;
4876      return $send($gvars.stdin, 'gets', $to_a(args));
4877    }, -1);
4878
4879    $def(self, '$hash', function $$hash() {
4880      var self = this;
4881
4882      return self.$__id__()
4883    });
4884
4885    $def(self, '$initialize_copy', $return_val(nil));
4886    var inspect_stack = [];
4887
4888    $def(self, '$inspect', function $$inspect() {
4889      var self = this, ivs = nil, id = nil, pushed = nil, e = nil;
4890
4891      return (function() { try {
4892      try {
4893
4894        ivs = "";
4895        id = self.$__id__();
4896        if ($truthy((inspect_stack)['$include?'](id))) {
4897          ivs = " ...";
4898        } else {
4899
4900          (inspect_stack)['$<<'](id);
4901          pushed = true;
4902          $send(self.$instance_variables(), 'each', [], function $$8(i){var self = $$8.$$s == null ? this : $$8.$$s, ivar = nil, inspect = nil;
4903
4904
4905            if (i == null) i = nil;
4906            ivar = self.$instance_variable_get(i);
4907            inspect = $$('Opal').$inspect(ivar);
4908            return (ivs = $rb_plus(ivs, " " + (i) + "=" + (inspect)));}, {$$s: self});
4909        };
4910        return "#<" + (self.$class()) + ":0x" + (id.$to_s(16)) + (ivs) + ">";
4911      } catch ($err) {
4912        if (Opal.rescue($err, [$$('StandardError')])) {(e = $err);
4913          try {
4914            return "#<" + (self.$class()) + ":0x" + (id.$to_s(16)) + ">"
4915          } finally { Opal.pop_exception(); }
4916        } else { throw $err; }
4917      }
4918      } finally {
4919        ($truthy(pushed) ? ((inspect_stack).$pop()) : nil);
4920      } })()
4921    });
4922
4923    $def(self, '$instance_of?', function $Kernel_instance_of$ques$9(klass) {
4924      var self = this;
4925
4926
4927      if (!klass.$$is_class && !klass.$$is_module) {
4928        $Kernel.$raise($$$('TypeError'), "class or module required");
4929      }
4930
4931      return self.$$class === klass;
4932
4933    });
4934
4935    $def(self, '$instance_variable_defined?', function $Kernel_instance_variable_defined$ques$10(name) {
4936      var self = this;
4937
4938
4939      name = $Opal['$instance_variable_name!'](name);
4940      return Opal.hasOwnProperty.call(self, name.substr(1));    });
4941
4942    $def(self, '$instance_variable_get', function $$instance_variable_get(name) {
4943      var self = this;
4944
4945
4946      name = $Opal['$instance_variable_name!'](name);
4947
4948      var ivar = self[Opal.ivar(name.substr(1))];
4949
4950      return ivar == null ? nil : ivar;
4951    });
4952
4953    $def(self, '$instance_variable_set', function $$instance_variable_set(name, value) {
4954      var self = this;
4955
4956
4957      $deny_frozen_access(self);
4958      name = $Opal['$instance_variable_name!'](name);
4959      return self[Opal.ivar(name.substr(1))] = value;    });
4960
4961    $def(self, '$remove_instance_variable', function $$remove_instance_variable(name) {
4962      var self = this;
4963
4964
4965      name = $Opal['$instance_variable_name!'](name);
4966
4967      var key = Opal.ivar(name.substr(1)),
4968          val;
4969      if (self.hasOwnProperty(key)) {
4970        val = self[key];
4971        delete self[key];
4972        return val;
4973      }
4974      return $Kernel.$raise($$$('NameError'), "instance variable " + (name) + " not defined");
4975    });
4976
4977    $def(self, '$instance_variables', function $$instance_variables() {
4978      var self = this;
4979
4980
4981      var result = [], ivar;
4982
4983      for (var name in self) {
4984        if (self.hasOwnProperty(name) && name.charAt(0) !== '$') {
4985          if (name.substr(-1) === '$') {
4986            ivar = name.slice(0, name.length - 1);
4987          } else {
4988            ivar = name;
4989          }
4990          result.push('@' + ivar);
4991        }
4992      }
4993
4994      return result;
4995
4996    });
4997
4998    $def(self, '$Integer', function $$Integer(value, base) {
4999
5000      var i, str, base_digits;
5001
5002      if (!value.$$is_string) {
5003        if (base !== undefined) {
5004          $Kernel.$raise($$$('ArgumentError'), "base specified for non string value");
5005        }
5006        if (value === nil) {
5007          $Kernel.$raise($$$('TypeError'), "can't convert nil into Integer");
5008        }
5009        if (value.$$is_number) {
5010          if (value === Infinity || value === -Infinity || isNaN(value)) {
5011            $Kernel.$raise($$$('FloatDomainError'), value);
5012          }
5013          return Math.floor(value);
5014        }
5015        if (value['$respond_to?']("to_int")) {
5016          i = value.$to_int();
5017          if (i !== nil) {
5018            return i;
5019          }
5020        }
5021        return $Opal['$coerce_to!'](value, $$$('Integer'), "to_i");
5022      }
5023
5024      if (value === "0") {
5025        return 0;
5026      }
5027
5028      if (base === undefined) {
5029        base = 0;
5030      } else {
5031        base = $coerce_to(base, $$$('Integer'), 'to_int');
5032        if (base === 1 || base < 0 || base > 36) {
5033          $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base));
5034        }
5035      }
5036
5037      str = value.toLowerCase();
5038
5039      str = str.replace(/(\d)_(?=\d)/g, '$1');
5040
5041      str = str.replace(/^(\s*[+-]?)(0[bodx]?)/, function (_, head, flag) {
5042        switch (flag) {
5043        case '0b':
5044          if (base === 0 || base === 2) {
5045            base = 2;
5046            return head;
5047          }
5048          // no-break
5049        case '0':
5050        case '0o':
5051          if (base === 0 || base === 8) {
5052            base = 8;
5053            return head;
5054          }
5055          // no-break
5056        case '0d':
5057          if (base === 0 || base === 10) {
5058            base = 10;
5059            return head;
5060          }
5061          // no-break
5062        case '0x':
5063          if (base === 0 || base === 16) {
5064            base = 16;
5065            return head;
5066          }
5067          // no-break
5068        }
5069        $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\"");
5070      });
5071
5072      base = (base === 0 ? 10 : base);
5073
5074      base_digits = '0-' + (base <= 10 ? base - 1 : '9a-' + String.fromCharCode(97 + (base - 11)));
5075
5076      if (!(new RegExp('^\\s*[+-]?[' + base_digits + ']+\\s*$')).test(str)) {
5077        $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\"");
5078      }
5079
5080      i = parseInt(str, base);
5081
5082      if (isNaN(i)) {
5083        $Kernel.$raise($$$('ArgumentError'), "invalid value for Integer(): \"" + (value) + "\"");
5084      }
5085
5086      return i;
5087    }, -2);
5088
5089    $def(self, '$Float', function $$Float(value) {
5090
5091
5092      var str;
5093
5094      if (value === nil) {
5095        $Kernel.$raise($$$('TypeError'), "can't convert nil into Float");
5096      }
5097
5098      if (value.$$is_string) {
5099        str = value.toString();
5100
5101        str = str.replace(/(\d)_(?=\d)/g, '$1');
5102
5103        //Special case for hex strings only:
5104        if (/^\s*[-+]?0[xX][0-9a-fA-F]+\s*$/.test(str)) {
5105          return $Kernel.$Integer(str);
5106        }
5107
5108        if (!/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/.test(str)) {
5109          $Kernel.$raise($$$('ArgumentError'), "invalid value for Float(): \"" + (value) + "\"");
5110        }
5111
5112        return parseFloat(str);
5113      }
5114
5115      return $Opal['$coerce_to!'](value, $$$('Float'), "to_f");
5116
5117    });
5118
5119    $def(self, '$Hash', function $$Hash(arg) {
5120
5121
5122      if (($truthy(arg['$nil?']()) || ($eqeq(arg, [])))) {
5123        return $hash2([], {})
5124      }      if ($eqeqeq($$$('Hash'), arg)) {
5125        return arg
5126      }      return $Opal['$coerce_to!'](arg, $$$('Hash'), "to_hash");
5127    });
5128
5129    $def(self, '$is_a?', function $Kernel_is_a$ques$11(klass) {
5130      var self = this;
5131
5132
5133      if (!klass.$$is_class && !klass.$$is_module) {
5134        $Kernel.$raise($$$('TypeError'), "class or module required");
5135      }
5136
5137      return Opal.is_a(self, klass);
5138
5139    });
5140
5141    $def(self, '$itself', $return_self);
5142
5143    $def(self, '$lambda', function $$lambda() {
5144      var block = $$lambda.$$p || nil;
5145
5146      $$lambda.$$p = null;
5147      return Opal.lambda(block);    });
5148
5149    $def(self, '$load', function $$load(file) {
5150
5151
5152      file = $Opal['$coerce_to!'](file, $$$('String'), "to_str");
5153      return Opal.load(file);
5154    });
5155
5156    $def(self, '$loop', function $$loop() {
5157      var $yield = $$loop.$$p || nil, self = this, e = nil;
5158
5159      $$loop.$$p = null;
5160
5161      if (!($yield !== nil)) {
5162        return $send(self, 'enum_for', ["loop"], function $$12(){
5163          return $$$($$$('Float'), 'INFINITY')})
5164      }      while ($truthy(true)) {
5165
5166        try {
5167          Opal.yieldX($yield, []);
5168        } catch ($err) {
5169          if (Opal.rescue($err, [$$$('StopIteration')])) {(e = $err);
5170            try {
5171              return e.$result()
5172            } finally { Opal.pop_exception(); }
5173          } else { throw $err; }
5174        }      }      return self;
5175    });
5176
5177    $def(self, '$nil?', $return_val(false));
5178
5179    $def(self, '$printf', function $$printf($a) {
5180      var $post_args, args, self = this;
5181
5182
5183      $post_args = $slice(arguments);
5184      args = $post_args;
5185      if ($truthy(args['$any?']())) {
5186        self.$print($send(self, 'format', $to_a(args)));
5187      }      return nil;
5188    }, -1);
5189
5190    $def(self, '$proc', function $$proc() {
5191      var block = $$proc.$$p || nil;
5192
5193      $$proc.$$p = null;
5194      if (!$truthy(block)) {
5195        $Kernel.$raise($$$('ArgumentError'), "tried to create Proc object without a block");
5196      }      block.$$is_lambda = false;
5197      return block;
5198    });
5199
5200    $def(self, '$puts', function $$puts($a) {
5201      var $post_args, strs;
5202      if ($gvars.stdout == null) $gvars.stdout = nil;
5203
5204
5205      $post_args = $slice(arguments);
5206      strs = $post_args;
5207      return $send($gvars.stdout, 'puts', $to_a(strs));
5208    }, -1);
5209
5210    $def(self, '$p', function $$p($a) {
5211      var $post_args, args;
5212
5213
5214      $post_args = $slice(arguments);
5215      args = $post_args;
5216      $send(args, 'each', [], function $$13(obj){        if ($gvars.stdout == null) $gvars.stdout = nil;
5217
5218
5219        if (obj == null) obj = nil;
5220        return $gvars.stdout.$puts(obj.$inspect());});
5221      if ($truthy($rb_le(args.$length(), 1))) {
5222        return args['$[]'](0)
5223      } else {
5224        return args
5225      }    }, -1);
5226
5227    $def(self, '$print', function $$print($a) {
5228      var $post_args, strs;
5229      if ($gvars.stdout == null) $gvars.stdout = nil;
5230
5231
5232      $post_args = $slice(arguments);
5233      strs = $post_args;
5234      return $send($gvars.stdout, 'print', $to_a(strs));
5235    }, -1);
5236
5237    $def(self, '$readline', function $$readline($a) {
5238      var $post_args, args;
5239      if ($gvars.stdin == null) $gvars.stdin = nil;
5240
5241
5242      $post_args = $slice(arguments);
5243      args = $post_args;
5244      return $send($gvars.stdin, 'readline', $to_a(args));
5245    }, -1);
5246
5247    $def(self, '$warn', function $$warn($a, $b) {
5248      var $post_args, $kwargs, strs, uplevel, $c, $d, self = this, location = nil;
5249      if ($gvars.VERBOSE == null) $gvars.VERBOSE = nil;
5250      if ($gvars.stderr == null) $gvars.stderr = nil;
5251
5252
5253      $post_args = $slice(arguments);
5254      $kwargs = $extract_kwargs($post_args);
5255      $kwargs = $ensure_kwargs($kwargs);
5256      strs = $post_args;
5257
5258      uplevel = $kwargs.$$smap["uplevel"];if (uplevel == null) uplevel = nil;
5259      if ($truthy(uplevel)) {
5260
5261        uplevel = $Opal['$coerce_to!'](uplevel, $$$('Integer'), "to_str");
5262        if ($truthy($rb_lt(uplevel, 0))) {
5263          $Kernel.$raise($$$('ArgumentError'), "negative level (" + (uplevel) + ")");
5264        }        location = ($c = ($d = self.$caller($rb_plus(uplevel, 1), 1).$first(), ($d === nil || $d == null) ? nil : $d.$split(":in `")), ($c === nil || $c == null) ? nil : $c.$first());
5265        if ($truthy(location)) {
5266          location = "" + (location) + ": ";
5267        }        strs = $send(strs, 'map', [], function $$14(s){
5268
5269          if (s == null) s = nil;
5270          return "" + (location) + "warning: " + (s);});
5271      }      if (($truthy($gvars.VERBOSE['$nil?']()) || ($truthy(strs['$empty?']())))) {
5272        return nil
5273      } else {
5274        return $send($gvars.stderr, 'puts', $to_a(strs))
5275      }    }, -1);
5276
5277    $def(self, '$raise', function $$raise(exception, string, backtrace) {
5278            if ($gvars["!"] == null) $gvars["!"] = nil;
5279      if ($gvars["@"] == null) $gvars["@"] = nil;
5280      if (string == null) string = nil;
5281      if (backtrace == null) backtrace = nil;
5282
5283      if (exception == null && $gvars["!"] !== nil) {
5284        throw $gvars["!"];
5285      }
5286      if (exception == null) {
5287        exception = $$$('RuntimeError').$new("");
5288      }
5289      else if ($respond_to(exception, '$to_str')) {
5290        exception = $$$('RuntimeError').$new(exception.$to_str());
5291      }
5292      // using respond_to? and not an undefined check to avoid method_missing matching as true
5293      else if (exception.$$is_class && $respond_to(exception, '$exception')) {
5294        exception = exception.$exception(string);
5295      }
5296      else if (exception.$$is_exception) ;
5297      else {
5298        exception = $$$('TypeError').$new("exception class/object expected");
5299      }
5300
5301      if (backtrace !== nil) {
5302        exception.$set_backtrace(backtrace);
5303      }
5304
5305      if ($gvars["!"] !== nil) {
5306        Opal.exceptions.push($gvars["!"]);
5307      }
5308
5309      $gvars["!"] = exception;
5310      $gvars["@"] = (exception).$backtrace();
5311
5312      throw exception;
5313    }, -1);
5314
5315    $def(self, '$rand', function $$rand(max) {
5316
5317      if (max === undefined) {
5318        return $$$($$$('Random'), 'DEFAULT').$rand();
5319      }
5320
5321      if (max.$$is_number) {
5322        if (max < 0) {
5323          max = Math.abs(max);
5324        }
5325
5326        if (max % 1 !== 0) {
5327          max = max.$to_i();
5328        }
5329
5330        if (max === 0) {
5331          max = undefined;
5332        }
5333      }
5334      return $$$($$$('Random'), 'DEFAULT').$rand(max);
5335    }, -1);
5336
5337    $def(self, '$respond_to?', function $Kernel_respond_to$ques$15(name, include_all) {
5338      var self = this;
5339
5340
5341      if (include_all == null) include_all = false;
5342
5343      var body = self[$jsid(name)];
5344
5345      if (typeof(body) === "function" && !body.$$stub) {
5346        return true;
5347      }
5348
5349      if (self['$respond_to_missing?'].$$pristine === true) {
5350        return false;
5351      } else {
5352        return self['$respond_to_missing?'](name, include_all);
5353      }
5354    }, -2);
5355
5356    $def(self, '$respond_to_missing?', function $Kernel_respond_to_missing$ques$16(method_name, include_all) {
5357      return false;
5358    }, -2);
5359    $Opal.$pristine(self, "respond_to?", "respond_to_missing?");
5360
5361    $def(self, '$require', function $$require(file) {
5362
5363
5364      // As Object.require refers to Kernel.require once Kernel has been loaded the String
5365      // class may not be available yet, the coercion requires both  String and Array to be loaded.
5366      if (typeof file !== 'string' && Opal.String && Opal.Array) {
5367        (file = $Opal['$coerce_to!'](file, $$$('String'), "to_str"));
5368      }
5369      return Opal.require(file)
5370
5371    });
5372
5373    $def(self, '$require_relative', function $$require_relative(file) {
5374
5375
5376      $Opal['$try_convert!'](file, $$$('String'), "to_str");
5377      file = $$$('File').$expand_path($$$('File').$join(Opal.current_file, "..", file));
5378      return Opal.require(file);
5379    });
5380
5381    $def(self, '$require_tree', function $$require_tree(path, $kwargs) {
5382      var autoload;
5383
5384
5385      $kwargs = $ensure_kwargs($kwargs);
5386
5387      autoload = $kwargs.$$smap["autoload"];if (autoload == null) autoload = false;
5388
5389      var result = [];
5390
5391      path = $$$('File').$expand_path(path);
5392      path = Opal.normalize(path);
5393      if (path === '.') path = '';
5394      for (var name in Opal.modules) {
5395        if ((name)['$start_with?'](path)) {
5396          if(!autoload) {
5397            result.push([name, Opal.require(name)]);
5398          } else {
5399            result.push([name, true]); // do nothing, delegated to a autoloading
5400          }
5401        }
5402      }
5403
5404      return result;
5405    }, -2);
5406
5407    $def(self, '$singleton_class', function $$singleton_class() {
5408      var self = this;
5409
5410      return Opal.get_singleton_class(self);
5411    });
5412
5413    $def(self, '$sleep', function $$sleep(seconds) {
5414
5415
5416      if (seconds == null) seconds = nil;
5417
5418      if (seconds === nil) {
5419        $Kernel.$raise($$$('TypeError'), "can't convert NilClass into time interval");
5420      }
5421      if (!seconds.$$is_number) {
5422        $Kernel.$raise($$$('TypeError'), "can't convert " + (seconds.$class()) + " into time interval");
5423      }
5424      if (seconds < 0) {
5425        $Kernel.$raise($$$('ArgumentError'), "time interval must be positive");
5426      }
5427      var get_time = Opal.global.performance ?
5428        function() {return performance.now()} :
5429        function() {return new Date()};
5430
5431      var t = get_time();
5432      while (get_time() - t <= seconds * 1000);
5433      return Math.round(seconds);
5434    }, -1);
5435
5436    $def(self, '$srand', function $$srand(seed) {
5437
5438
5439      if (seed == null) seed = $$('Random').$new_seed();
5440      return $$$('Random').$srand(seed);
5441    }, -1);
5442
5443    $def(self, '$String', function $$String(str) {
5444      var $ret_or_1 = nil;
5445
5446      if ($truthy(($ret_or_1 = $Opal['$coerce_to?'](str, $$$('String'), "to_str")))) {
5447        return $ret_or_1
5448      } else {
5449        return $Opal['$coerce_to!'](str, $$$('String'), "to_s")
5450      }
5451    });
5452
5453    $def(self, '$tap', function $$tap() {
5454      var block = $$tap.$$p || nil, self = this;
5455
5456      $$tap.$$p = null;
5457      Opal.yield1(block, self);
5458      return self;
5459    });
5460
5461    $def(self, '$to_proc', $return_self);
5462
5463    $def(self, '$to_s', function $$to_s() {
5464      var self = this;
5465
5466      return "#<" + (self.$class()) + ":0x" + (self.$__id__().$to_s(16)) + ">"
5467    });
5468
5469    $def(self, '$catch', function $Kernel_catch$17(tag) {
5470      var $yield = $Kernel_catch$17.$$p || nil, $ret_or_1 = nil, e = nil;
5471
5472      $Kernel_catch$17.$$p = null;
5473
5474      if (tag == null) tag = nil;
5475      try {
5476
5477        tag = ($truthy(($ret_or_1 = tag)) ? ($ret_or_1) : ($Object.$new()));
5478        return Opal.yield1($yield, tag);;
5479      } catch ($err) {
5480        if (Opal.rescue($err, [$$$('UncaughtThrowError')])) {(e = $err);
5481          try {
5482
5483            if ($eqeq(e.$tag(), tag)) {
5484              return e.$value()
5485            };
5486            return $Kernel.$raise();
5487          } finally { Opal.pop_exception(); }
5488        } else { throw $err; }
5489      }    }, -1);
5490
5491    $def(self, '$throw', function $Kernel_throw$18(tag, obj) {
5492
5493
5494      if (obj == null) obj = nil;
5495      return $Kernel.$raise($$$('UncaughtThrowError').$new(tag, obj));
5496    }, -2);
5497
5498    $def(self, '$open', function $$open($a) {
5499      var block = $$open.$$p || nil, $post_args, args;
5500
5501      $$open.$$p = null;
5502      $post_args = $slice(arguments);
5503      args = $post_args;
5504      return $send($$$('File'), 'open', $to_a(args), block.$to_proc());
5505    }, -1);
5506
5507    $def(self, '$yield_self', function $$yield_self() {
5508      var $yield = $$yield_self.$$p || nil, self = this;
5509
5510      $$yield_self.$$p = null;
5511
5512      if (!($yield !== nil)) {
5513        return $send(self, 'enum_for', ["yield_self"], $return_val(1))
5514      }      return Opal.yield1($yield, self);    });
5515    $alias(self, "fail", "raise");
5516    $alias(self, "kind_of?", "is_a?");
5517    $alias(self, "object_id", "__id__");
5518    $alias(self, "public_send", "__send__");
5519    $alias(self, "send", "__send__");
5520    $alias(self, "then", "yield_self");
5521    return $alias(self, "to_enum", "enum_for");
5522  })('::', $nesting);
5523  return (function($base, $super) {
5524    var self = $klass($base, $super, 'Object');
5525
5526
5527
5528    delete $Object.$$prototype.$require;
5529    return self.$include($Kernel);
5530  })('::', null);
5531};
5532
5533Opal.modules["corelib/main"] = function(Opal) {/* Generated by Opal 1.7.3 */
5534  var $return_val = Opal.return_val, $def = Opal.def, $Object = Opal.Object, $slice = Opal.slice, $Kernel = Opal.Kernel, self = Opal.top; Opal.nil;
5535
5536  Opal.add_stubs('include,raise');
5537  return (function(self, $parent_nesting) {
5538
5539
5540
5541    $def(self, '$to_s', $return_val("main"));
5542
5543    $def(self, '$include', function $$include(mod) {
5544
5545      return $Object.$include(mod)
5546    });
5547
5548    $def(self, '$autoload', function $$autoload($a) {
5549      var $post_args, args;
5550
5551
5552      $post_args = $slice(arguments);
5553      args = $post_args;
5554      return Opal.Object.$autoload.apply(Opal.Object, args);    }, -1);
5555    return $def(self, '$using', function $$using(mod) {
5556
5557      return $Kernel.$raise("main.using is permitted only at toplevel")
5558    });
5559  })(Opal.get_singleton_class(self))
5560};
5561
5562Opal.modules["corelib/error/errno"] = function(Opal) {/* Generated by Opal 1.7.3 */
5563  var $module = Opal.module, $truthy = Opal.truthy, $rb_plus = Opal.rb_plus, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $klass = Opal.klass, nil = Opal.nil, $$$ = Opal.$$$;
5564
5565  Opal.add_stubs('+,errno,class,attr_reader');
5566
5567  (function($base, $parent_nesting) {
5568    var self = $module($base, 'Errno');
5569
5570    var errors = nil, klass = nil;
5571
5572
5573    errors = [["EINVAL", "Invalid argument", 22], ["EEXIST", "File exists", 17], ["EISDIR", "Is a directory", 21], ["EMFILE", "Too many open files", 24], ["ESPIPE", "Illegal seek", 29], ["EACCES", "Permission denied", 13], ["EPERM", "Operation not permitted", 1], ["ENOENT", "No such file or directory", 2], ["ENAMETOOLONG", "File name too long", 36]];
5574    klass = nil;
5575
5576    var i;
5577    for (i = 0; i < errors.length; i++) {
5578      (function() { // Create a closure
5579        var class_name = errors[i][0];
5580        var default_message = errors[i][1];
5581        var errno = errors[i][2];
5582
5583        klass = Opal.klass(self, Opal.SystemCallError, class_name);
5584        klass.errno = errno;
5585
5586        (function(self, $parent_nesting) {
5587
5588      return $def(self, '$new', function $new$1(name) {
5589        var self = this, message = nil;
5590
5591        $new$1.$$p = null;
5592
5593        if (name == null) name = nil;
5594        message = default_message;
5595        if ($truthy(name)) {
5596          message = $rb_plus(message, " - " + (name));
5597        }        return $send2(self, $find_super(self, 'new', $new$1, false, true), 'new', [message], null);
5598      }, -1)
5599    })(Opal.get_singleton_class(klass));
5600      })();
5601    }
5602  })('::');
5603  return (function($base, $super, $parent_nesting) {
5604    var self = $klass($base, $super, 'SystemCallError');
5605
5606
5607
5608    $def(self, '$errno', function $$errno() {
5609      var self = this;
5610
5611      return self.$class().$errno()
5612    });
5613    return (function(self, $parent_nesting) {
5614
5615      return self.$attr_reader("errno")
5616    })(Opal.get_singleton_class(self));
5617  })('::', $$$('StandardError'));
5618};
5619
5620Opal.modules["corelib/error"] = function(Opal) {/* Generated by Opal 1.7.3 */
5621  var $klass = Opal.klass, $slice = Opal.slice, $gvars = Opal.gvars, $defs = Opal.defs, $send = Opal.send, $to_a = Opal.to_a, $def = Opal.def, $truthy = Opal.truthy, $hash2 = Opal.hash2, $Kernel = Opal.Kernel, $not = Opal.not, $rb_plus = Opal.rb_plus, $eqeq = Opal.eqeq, $Object = Opal.Object, $ensure_kwargs = Opal.ensure_kwargs, $send2 = Opal.send2, $find_super = Opal.find_super, $module = Opal.module, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
5622
5623  Opal.add_stubs('new,map,backtrace,clone,to_s,merge,tty?,[],include?,raise,dup,empty?,!,caller,shift,+,class,join,cause,full_message,==,reverse,split,autoload,attr_reader,inspect');
5624
5625  (function($base, $super, $parent_nesting) {
5626    var self = $klass($base, $super, 'Exception');
5627
5628    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
5629
5630    $proto.message = nil;
5631
5632    Opal.prop(self.$$prototype, '$$is_exception', true);
5633    var stack_trace_limit;
5634    Error.stackTraceLimit = 100;
5635    $defs(self, '$new', function $Exception_new$1($a) {
5636      var $post_args, args, self = this;
5637      if ($gvars["!"] == null) $gvars["!"] = nil;
5638
5639
5640      $post_args = $slice(arguments);
5641      args = $post_args;
5642
5643      var message   = (args.length > 0) ? args[0] : nil;
5644      var error     = new self.$$constructor(message);
5645      error.name    = self.$$name;
5646      error.message = message;
5647      error.cause   = $gvars["!"];
5648      Opal.send(error, error.$initialize, args);
5649
5650      // Error.captureStackTrace() will use .name and .toString to build the
5651      // first line of the stack trace so it must be called after the error
5652      // has been initialized.
5653      // https://nodejs.org/dist/latest-v6.x/docs/api/errors.html
5654      if (Opal.config.enable_stack_trace && Error.captureStackTrace) {
5655        // Passing Kernel.raise will cut the stack trace from that point above
5656        Error.captureStackTrace(error, stack_trace_limit);
5657      }
5658
5659      return error;
5660    }, -1);
5661    stack_trace_limit = self.$new;
5662    $defs(self, '$exception', function $$exception($a) {
5663      var $post_args, args, self = this;
5664
5665
5666      $post_args = $slice(arguments);
5667      args = $post_args;
5668      return $send(self, 'new', $to_a(args));
5669    }, -1);
5670
5671    $def(self, '$initialize', function $$initialize($a) {
5672      var $post_args, args, self = this;
5673
5674
5675      $post_args = $slice(arguments);
5676      args = $post_args;
5677      return self.message = (args.length > 0) ? args[0] : nil;    }, -1);
5678
5679    // Convert backtrace from any format to Ruby format
5680    function correct_backtrace(backtrace) {
5681      var new_bt = [], m;
5682
5683      for (var i = 0; i < backtrace.length; i++) {
5684        var loc = backtrace[i];
5685        if (!loc || !loc.$$is_string) ;
5686        /* Chromium format */
5687        else if ((m = loc.match(/^    at (.*?) \((.*?)\)$/))) {
5688          new_bt.push(m[2] + ":in `" + m[1] + "'");
5689        }
5690        else if ((m = loc.match(/^    at (.*?)$/))) {
5691          new_bt.push(m[1] + ":in `undefined'");
5692        }
5693        /* Node format */
5694        else if ((m = loc.match(/^  from (.*?)$/))) {
5695          new_bt.push(m[1]);
5696        }
5697        /* Mozilla/Apple format */
5698        else if ((m = loc.match(/^(.*?)@(.*?)$/))) {
5699          new_bt.push(m[2] + ':in `' + m[1] + "'");
5700        }
5701      }
5702
5703      return new_bt;
5704    }
5705
5706    $def(self, '$backtrace', function $$backtrace() {
5707      var self = this;
5708
5709
5710      if (self.backtrace) {
5711        // nil is a valid backtrace
5712        return self.backtrace;
5713      }
5714
5715      var backtrace = self.stack;
5716
5717      if (typeof(backtrace) !== 'undefined' && backtrace.$$is_string) {
5718        return self.backtrace = correct_backtrace(backtrace.split("\n"));
5719      }
5720      else if (backtrace) {
5721        return self.backtrace = correct_backtrace(backtrace);
5722      }
5723
5724      return [];
5725
5726    });
5727
5728    $def(self, '$backtrace_locations', function $$backtrace_locations() {
5729      var $a, self = this;
5730
5731
5732      if (self.backtrace_locations) return self.backtrace_locations;
5733      self.backtrace_locations = ($a = self.$backtrace(), ($a === nil || $a == null) ? nil : $send($a, 'map', [], function $$2(loc){
5734
5735        if (loc == null) loc = nil;
5736        return $$$($$$($$$('Thread'), 'Backtrace'), 'Location').$new(loc);}));
5737      return self.backtrace_locations;
5738
5739    });
5740
5741    $def(self, '$cause', function $$cause() {
5742      var self = this;
5743
5744      return self.cause || nil;
5745    });
5746
5747    $def(self, '$exception', function $$exception(str) {
5748      var self = this;
5749
5750
5751      if (str == null) str = nil;
5752
5753      if (str === nil || self === str) {
5754        return self;
5755      }
5756
5757      var cloned = self.$clone();
5758      cloned.message = str;
5759      if (self.backtrace) cloned.backtrace = self.backtrace.$dup();
5760      cloned.stack = self.stack;
5761      cloned.cause = self.cause;
5762      return cloned;
5763    }, -1);
5764
5765    $def(self, '$message', function $$message() {
5766      var self = this;
5767
5768      return self.$to_s()
5769    });
5770
5771    $def(self, '$full_message', function $$full_message(kwargs) {
5772      var $b, self = this, $ret_or_1 = nil, highlight = nil, order = nil, bold_underline = nil, bold = nil, reset = nil, bt = nil, first = nil, msg = nil;
5773      if ($gvars.stderr == null) $gvars.stderr = nil;
5774
5775
5776      if (kwargs == null) kwargs = nil;
5777      if (!$truthy((($$('Hash', 'skip_raise')) ? 'constant' : nil))) {
5778        return "" + (self.message) + "\n" + (self.stack)
5779      }      kwargs = $hash2(["highlight", "order"], {"highlight": $gvars.stderr['$tty?'](), "order": "top"}).$merge(($truthy(($ret_or_1 = kwargs)) ? ($ret_or_1) : ($hash2([], {}))));
5780      $b = [kwargs['$[]']("highlight"), kwargs['$[]']("order")], (highlight = $b[0]), (order = $b[1]);
5781      if (!$truthy([true, false]['$include?'](highlight))) {
5782        $Kernel.$raise($$$('ArgumentError'), "expected true or false as highlight: " + (highlight));
5783      }      if (!$truthy(["top", "bottom"]['$include?'](order))) {
5784        $Kernel.$raise($$$('ArgumentError'), "expected :top or :bottom as order: " + (order));
5785      }      if ($truthy(highlight)) {
5786
5787        bold_underline = "\u001b[1;4m";
5788        bold = "\u001b[1m";
5789        reset = "\u001b[m";
5790      } else {
5791        bold_underline = (bold = (reset = ""));
5792      }      bt = self.$backtrace().$dup();
5793      if (($not(bt) || ($truthy(bt['$empty?']())))) {
5794        bt = self.$caller();
5795      }      first = bt.$shift();
5796      msg = "" + (first) + ": ";
5797      msg = $rb_plus(msg, "" + (bold) + (self.$to_s()) + " (" + (bold_underline) + (self.$class()) + (reset) + (bold) + ")" + (reset) + "\n");
5798      msg = $rb_plus(msg, $send(bt, 'map', [], function $$3(loc){
5799
5800        if (loc == null) loc = nil;
5801        return "\tfrom " + (loc) + "\n";}).$join());
5802      if ($truthy(self.$cause())) {
5803        msg = $rb_plus(msg, self.$cause().$full_message($hash2(["highlight"], {"highlight": highlight})));
5804      }      if ($eqeq(order, "bottom")) {
5805
5806        msg = msg.$split("\n").$reverse().$join("\n");
5807        msg = $rb_plus("" + (bold) + "Traceback" + (reset) + " (most recent call last):\n", msg);
5808      }      return msg;
5809    }, -1);
5810
5811    $def(self, '$inspect', function $$inspect() {
5812      var self = this, as_str = nil;
5813
5814
5815      as_str = self.$to_s();
5816      if ($truthy(as_str['$empty?']())) {
5817        return self.$class().$to_s()
5818      } else {
5819        return "#<" + (self.$class().$to_s()) + ": " + (self.$to_s()) + ">"
5820      }    });
5821
5822    $def(self, '$set_backtrace', function $$set_backtrace(backtrace) {
5823      var self = this;
5824
5825
5826      var valid = true, i, ii;
5827
5828      if (backtrace === nil) {
5829        self.backtrace = nil;
5830        self.stack = '';
5831      } else if (backtrace.$$is_string) {
5832        self.backtrace = [backtrace];
5833        self.stack = '  from ' + backtrace;
5834      } else {
5835        if (backtrace.$$is_array) {
5836          for (i = 0, ii = backtrace.length; i < ii; i++) {
5837            if (!backtrace[i].$$is_string) {
5838              valid = false;
5839              break;
5840            }
5841          }
5842        } else {
5843          valid = false;
5844        }
5845
5846        if (valid === false) {
5847          $Kernel.$raise($$$('TypeError'), "backtrace must be Array of String");
5848        }
5849
5850        self.backtrace = backtrace;
5851        self.stack = $send((backtrace), 'map', [], function $$4(i){
5852
5853        if (i == null) i = nil;
5854        return $rb_plus("  from ", i);}).join("\n");
5855      }
5856
5857      return backtrace;
5858
5859    });
5860    return $def(self, '$to_s', function $$to_s() {
5861      var self = this, $ret_or_1 = nil, $ret_or_2 = nil;
5862
5863      if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = self.message)) ? (self.message.$to_s()) : ($ret_or_2))))) {
5864        return $ret_or_1
5865      } else {
5866        return self.$class().$to_s()
5867      }
5868    });
5869  })('::', Error, $nesting);
5870  $klass('::', $$$('Exception'), 'ScriptError');
5871  $klass('::', $$$('ScriptError'), 'SyntaxError');
5872  $klass('::', $$$('ScriptError'), 'LoadError');
5873  $klass('::', $$$('ScriptError'), 'NotImplementedError');
5874  $klass('::', $$$('Exception'), 'SystemExit');
5875  $klass('::', $$$('Exception'), 'NoMemoryError');
5876  $klass('::', $$$('Exception'), 'SignalException');
5877  $klass('::', $$$('SignalException'), 'Interrupt');
5878  $klass('::', $$$('Exception'), 'SecurityError');
5879  $klass('::', $$$('Exception'), 'SystemStackError');
5880  $klass('::', $$$('Exception'), 'StandardError');
5881  $klass('::', $$$('StandardError'), 'EncodingError');
5882  $klass('::', $$$('StandardError'), 'ZeroDivisionError');
5883  $klass('::', $$$('StandardError'), 'NameError');
5884  $klass('::', $$$('NameError'), 'NoMethodError');
5885  $klass('::', $$$('StandardError'), 'RuntimeError');
5886  $klass('::', $$$('RuntimeError'), 'FrozenError');
5887  $klass('::', $$$('StandardError'), 'LocalJumpError');
5888  $klass('::', $$$('StandardError'), 'TypeError');
5889  $klass('::', $$$('StandardError'), 'ArgumentError');
5890  $klass('::', $$$('ArgumentError'), 'UncaughtThrowError');
5891  $klass('::', $$$('StandardError'), 'IndexError');
5892  $klass('::', $$$('IndexError'), 'StopIteration');
5893  $klass('::', $$$('StopIteration'), 'ClosedQueueError');
5894  $klass('::', $$$('IndexError'), 'KeyError');
5895  $klass('::', $$$('StandardError'), 'RangeError');
5896  $klass('::', $$$('RangeError'), 'FloatDomainError');
5897  $klass('::', $$$('StandardError'), 'IOError');
5898  $klass('::', $$$('IOError'), 'EOFError');
5899  $klass('::', $$$('StandardError'), 'SystemCallError');
5900  $klass('::', $$$('StandardError'), 'RegexpError');
5901  $klass('::', $$$('StandardError'), 'ThreadError');
5902  $klass('::', $$$('StandardError'), 'FiberError');
5903  $Object.$autoload("Errno", "corelib/error/errno");
5904  (function($base, $super) {
5905    var self = $klass($base, $super, 'FrozenError');
5906
5907
5908
5909    self.$attr_reader("receiver");
5910    return $def(self, '$initialize', function $$initialize(message, $kwargs) {
5911      var receiver, self = this;
5912
5913      $$initialize.$$p = null;
5914
5915      $kwargs = $ensure_kwargs($kwargs);
5916
5917      receiver = $kwargs.$$smap["receiver"];if (receiver == null) receiver = nil;
5918      $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null);
5919      return (self.receiver = receiver);
5920    }, -2);
5921  })('::', $$$('RuntimeError'));
5922  (function($base, $super) {
5923    var self = $klass($base, $super, 'UncaughtThrowError');
5924
5925    var $proto = self.$$prototype;
5926
5927    $proto.tag = nil;
5928
5929    self.$attr_reader("tag", "value");
5930    return $def(self, '$initialize', function $$initialize(tag, value) {
5931      var self = this;
5932
5933      $$initialize.$$p = null;
5934
5935      if (value == null) value = nil;
5936      self.tag = tag;
5937      self.value = value;
5938      return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', ["uncaught throw " + (self.tag.$inspect())], null);
5939    }, -2);
5940  })('::', $$$('ArgumentError'));
5941  (function($base, $super) {
5942    var self = $klass($base, $super, 'NameError');
5943
5944
5945
5946    self.$attr_reader("name");
5947    return $def(self, '$initialize', function $$initialize(message, name) {
5948      var self = this;
5949
5950      $$initialize.$$p = null;
5951
5952      if (name == null) name = nil;
5953      $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null);
5954      return (self.name = name);
5955    }, -2);
5956  })('::', null);
5957  (function($base, $super) {
5958    var self = $klass($base, $super, 'NoMethodError');
5959
5960
5961
5962    self.$attr_reader("args");
5963    return $def(self, '$initialize', function $$initialize(message, name, args) {
5964      var self = this;
5965
5966      $$initialize.$$p = null;
5967
5968      if (name == null) name = nil;
5969      if (args == null) args = [];
5970      $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message, name], null);
5971      return (self.args = args);
5972    }, -2);
5973  })('::', null);
5974  (function($base, $super) {
5975    var self = $klass($base, $super, 'StopIteration');
5976
5977
5978    return self.$attr_reader("result")
5979  })('::', null);
5980  (function($base, $super) {
5981    var self = $klass($base, $super, 'KeyError');
5982
5983    var $proto = self.$$prototype;
5984
5985    $proto.receiver = $proto.key = nil;
5986
5987
5988    $def(self, '$initialize', function $$initialize(message, $kwargs) {
5989      var receiver, key, self = this;
5990
5991      $$initialize.$$p = null;
5992
5993      $kwargs = $ensure_kwargs($kwargs);
5994
5995      receiver = $kwargs.$$smap["receiver"];if (receiver == null) receiver = nil;
5996
5997      key = $kwargs.$$smap["key"];if (key == null) key = nil;
5998      $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [message], null);
5999      self.receiver = receiver;
6000      return (self.key = key);
6001    }, -2);
6002
6003    $def(self, '$receiver', function $$receiver() {
6004      var self = this, $ret_or_1 = nil;
6005
6006      if ($truthy(($ret_or_1 = self.receiver))) {
6007        return $ret_or_1
6008      } else {
6009        return $Kernel.$raise($$$('ArgumentError'), "no receiver is available")
6010      }
6011    });
6012    return $def(self, '$key', function $$key() {
6013      var self = this, $ret_or_1 = nil;
6014
6015      if ($truthy(($ret_or_1 = self.key))) {
6016        return $ret_or_1
6017      } else {
6018        return $Kernel.$raise($$$('ArgumentError'), "no key is available")
6019      }
6020    });
6021  })('::', null);
6022  return (function($base, $parent_nesting) {
6023    var self = $module($base, 'JS');
6024
6025    var $nesting = [self].concat($parent_nesting);
6026
6027    return ($klass($nesting[0], null, 'Error'), nil)
6028  })('::', $nesting);
6029};
6030
6031Opal.modules["corelib/constants"] = function(Opal) {/* Generated by Opal 1.7.3 */
6032  var $const_set = Opal.const_set; Opal.nil; var $$$ = Opal.$$$;
6033
6034
6035  $const_set('::', 'RUBY_PLATFORM', "opal");
6036  $const_set('::', 'RUBY_ENGINE', "opal");
6037  $const_set('::', 'RUBY_VERSION', "3.2.0");
6038  $const_set('::', 'RUBY_ENGINE_VERSION', "1.7.3");
6039  $const_set('::', 'RUBY_RELEASE_DATE', "2023-03-23");
6040  $const_set('::', 'RUBY_PATCHLEVEL', 0);
6041  $const_set('::', 'RUBY_REVISION', "0");
6042  $const_set('::', 'RUBY_COPYRIGHT', "opal - Copyright (C) 2011-2023 Adam Beynon and the Opal contributors");
6043  return $const_set('::', 'RUBY_DESCRIPTION', "opal " + ($$$('RUBY_ENGINE_VERSION')) + " (" + ($$$('RUBY_RELEASE_DATE')) + " revision " + ($$$('RUBY_REVISION')) + ")");
6044};
6045
6046Opal.modules["opal/base"] = function(Opal) {/* Generated by Opal 1.7.3 */
6047  var $Object = Opal.Object; Opal.nil;
6048
6049  Opal.add_stubs('require');
6050
6051  $Object.$require("corelib/runtime");
6052  $Object.$require("corelib/helpers");
6053  $Object.$require("corelib/module");
6054  $Object.$require("corelib/class");
6055  $Object.$require("corelib/basic_object");
6056  $Object.$require("corelib/kernel");
6057  $Object.$require("corelib/main");
6058  $Object.$require("corelib/error");
6059  return $Object.$require("corelib/constants");
6060};
6061
6062Opal.modules["corelib/nil"] = function(Opal) {/* Generated by Opal 1.7.3 */
6063  var $klass = Opal.klass, $Kernel = Opal.Kernel, $def = Opal.def, $return_val = Opal.return_val, $ensure_kwargs = Opal.ensure_kwargs, $NilClass = Opal.NilClass, $slice = Opal.slice, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$;
6064
6065  Opal.add_stubs('raise,name,new,>,length,Rational,to_i');
6066  return (function($base, $super, $parent_nesting) {
6067    var self = $klass($base, $super, 'NilClass');
6068
6069
6070    self.$$prototype.$$meta = self;
6071    (function(self, $parent_nesting) {
6072
6073
6074
6075      $def(self, '$allocate', function $$allocate() {
6076        var self = this;
6077
6078        return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name()))
6079      });
6080
6081
6082      Opal.udef(self, '$' + "new");      return nil;    })(Opal.get_singleton_class(self));
6083
6084    $def(self, '$!', $return_val(true));
6085
6086    $def(self, '$&', $return_val(false));
6087
6088    $def(self, '$|', function $NilClass_$$1(other) {
6089
6090      return other !== false && other !== nil;
6091    });
6092
6093    $def(self, '$^', function $NilClass_$$2(other) {
6094
6095      return other !== false && other !== nil;
6096    });
6097
6098    $def(self, '$==', function $NilClass_$eq_eq$3(other) {
6099
6100      return other === nil;
6101    });
6102
6103    $def(self, '$dup', $return_val(nil));
6104
6105    $def(self, '$clone', function $$clone($kwargs) {
6106
6107
6108      $kwargs = $ensure_kwargs($kwargs);
6109
6110      $kwargs.$$smap["freeze"];      return nil;
6111    }, -1);
6112
6113    $def(self, '$inspect', $return_val("nil"));
6114
6115    $def(self, '$nil?', $return_val(true));
6116
6117    $def(self, '$singleton_class', function $$singleton_class() {
6118
6119      return $NilClass
6120    });
6121
6122    $def(self, '$to_a', function $$to_a() {
6123
6124      return []
6125    });
6126
6127    $def(self, '$to_h', function $$to_h() {
6128
6129      return Opal.hash();
6130    });
6131
6132    $def(self, '$to_i', $return_val(0));
6133
6134    $def(self, '$to_s', $return_val(""));
6135
6136    $def(self, '$to_c', function $$to_c() {
6137
6138      return $$$('Complex').$new(0, 0)
6139    });
6140
6141    $def(self, '$rationalize', function $$rationalize($a) {
6142      var $post_args, args;
6143
6144
6145      $post_args = $slice(arguments);
6146      args = $post_args;
6147      if ($truthy($rb_gt(args.$length(), 1))) {
6148        $Kernel.$raise($$$('ArgumentError'));
6149      }      return $Kernel.$Rational(0, 1);
6150    }, -1);
6151
6152    $def(self, '$to_r', function $$to_r() {
6153
6154      return $Kernel.$Rational(0, 1)
6155    });
6156
6157    $def(self, '$instance_variables', function $$instance_variables() {
6158
6159      return []
6160    });
6161    return $alias(self, "to_f", "to_i");
6162  })('::', null)
6163};
6164
6165Opal.modules["corelib/boolean"] = function(Opal) {/* Generated by Opal 1.7.3 */
6166  var $klass = Opal.klass, $Kernel = Opal.Kernel, $def = Opal.def, $return_self = Opal.return_self, $ensure_kwargs = Opal.ensure_kwargs, $slice = Opal.slice, $truthy = Opal.truthy, $send2 = Opal.send2, $find_super = Opal.find_super, $to_a = Opal.to_a, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$;
6167
6168  Opal.add_stubs('raise,name,==,to_s,__id__');
6169
6170  (function($base, $super, $parent_nesting) {
6171    var self = $klass($base, $super, 'Boolean');
6172
6173
6174    Opal.prop(self.$$prototype, '$$is_boolean', true);
6175
6176    var properties = ['$$class', '$$meta'];
6177
6178    for (var i = 0; i < properties.length; i++) {
6179      Object.defineProperty(self.$$prototype, properties[i], {
6180        configurable: true,
6181        enumerable: false,
6182        get: function() {
6183          return this == true  ? Opal.TrueClass :
6184                 this == false ? Opal.FalseClass :
6185                                 Opal.Boolean;
6186        }
6187      });
6188    }
6189
6190    Object.defineProperty(self.$$prototype, "$$id", {
6191      configurable: true,
6192      enumerable: false,
6193      get: function() {
6194        return this == true  ? 2 :
6195               this == false ? 0 :
6196                               nil;
6197      }
6198    });
6199    (function(self, $parent_nesting) {
6200
6201
6202
6203      $def(self, '$allocate', function $$allocate() {
6204        var self = this;
6205
6206        return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name()))
6207      });
6208
6209
6210      Opal.udef(self, '$' + "new");      return nil;    })(Opal.get_singleton_class(self));
6211
6212    $def(self, '$__id__', function $$__id__() {
6213      var self = this;
6214
6215      return self.valueOf() ? 2 : 0;
6216    });
6217
6218    $def(self, '$!', function $Boolean_$excl$1() {
6219      var self = this;
6220
6221      return self != true;
6222    });
6223
6224    $def(self, '$&', function $Boolean_$$2(other) {
6225      var self = this;
6226
6227      return (self == true) ? (other !== false && other !== nil) : false;
6228    });
6229
6230    $def(self, '$|', function $Boolean_$$3(other) {
6231      var self = this;
6232
6233      return (self == true) ? true : (other !== false && other !== nil);
6234    });
6235
6236    $def(self, '$^', function $Boolean_$$4(other) {
6237      var self = this;
6238
6239      return (self == true) ? (other === false || other === nil) : (other !== false && other !== nil);
6240    });
6241
6242    $def(self, '$==', function $Boolean_$eq_eq$5(other) {
6243      var self = this;
6244
6245      return (self == true) === other.valueOf();
6246    });
6247
6248    $def(self, '$singleton_class', function $$singleton_class() {
6249      var self = this;
6250
6251      return self.$$meta;
6252    });
6253
6254    $def(self, '$to_s', function $$to_s() {
6255      var self = this;
6256
6257      return (self == true) ? 'true' : 'false';
6258    });
6259
6260    $def(self, '$dup', $return_self);
6261
6262    $def(self, '$clone', function $$clone($kwargs) {
6263      var self = this;
6264
6265
6266      $kwargs = $ensure_kwargs($kwargs);
6267
6268      $kwargs.$$smap["freeze"];      return self;
6269    }, -1);
6270
6271    $def(self, '$method_missing', function $$method_missing(method, $a) {
6272      var block = $$method_missing.$$p || nil, $post_args, args, self = this;
6273
6274      $$method_missing.$$p = null;
6275      $post_args = $slice(arguments, 1);
6276      args = $post_args;
6277      var body = self.$$class.$$prototype[Opal.jsid(method)];
6278      if (!$truthy(typeof body !== 'undefined' && !body.$$stub)) {
6279        $send2(self, $find_super(self, 'method_missing', $$method_missing, false, true), 'method_missing', [method].concat($to_a(args)), block);
6280      }      return Opal.send(self, body, args, block);
6281    }, -2);
6282
6283    $def(self, '$respond_to_missing?', function $Boolean_respond_to_missing$ques$6(method, _include_all) {
6284      var self = this;
6285      var body = self.$$class.$$prototype[Opal.jsid(method)];
6286      return typeof body !== 'undefined' && !body.$$stub;    }, -2);
6287    $alias(self, "eql?", "==");
6288    $alias(self, "equal?", "==");
6289    $alias(self, "inspect", "to_s");
6290    return $alias(self, "object_id", "__id__");
6291  })('::', Boolean);
6292  $klass('::', $$$('Boolean'), 'TrueClass');
6293  return ($klass('::', $$$('Boolean'), 'FalseClass'), nil);
6294};
6295
6296Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */
6297  var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$;
6298
6299  Opal.add_stubs('>,<,===,raise,class,<=>,equal?');
6300  return (function($base) {
6301    var self = $module($base, 'Comparable');
6302
6303    var $ret_or_1 = nil;
6304
6305
6306
6307    function normalize(what) {
6308      if (Opal.is_a(what, Opal.Integer)) { return what; }
6309
6310      if ($rb_gt(what, 0)) { return 1; }
6311      if ($rb_lt(what, 0)) { return -1; }
6312      return 0;
6313    }
6314
6315    function fail_comparison(lhs, rhs) {
6316      var class_name;
6317      (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class));
6318      $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed");
6319    }
6320
6321    function cmp_or_fail(lhs, rhs) {
6322      var cmp = (lhs)['$<=>'](rhs);
6323      if (!$truthy(cmp)) fail_comparison(lhs, rhs);
6324      return normalize(cmp);
6325    }
6326
6327    $def(self, '$==', function $Comparable_$eq_eq$1(other) {
6328      var self = this, cmp = nil;
6329
6330
6331      if ($truthy(self['$equal?'](other))) {
6332        return true
6333      }
6334      if (self["$<=>"] == Opal.Kernel["$<=>"]) {
6335        return false;
6336      }
6337
6338      // check for infinite recursion
6339      if (self.$$comparable) {
6340        self.$$comparable = false;
6341        return false;
6342      }
6343      if (!$truthy((cmp = self['$<=>'](other)))) {
6344        return false
6345      }      return normalize(cmp) == 0;    });
6346
6347    $def(self, '$>', function $Comparable_$gt$2(other) {
6348      var self = this;
6349
6350      return cmp_or_fail(self, other) > 0;
6351    });
6352
6353    $def(self, '$>=', function $Comparable_$gt_eq$3(other) {
6354      var self = this;
6355
6356      return cmp_or_fail(self, other) >= 0;
6357    });
6358
6359    $def(self, '$<', function $Comparable_$lt$4(other) {
6360      var self = this;
6361
6362      return cmp_or_fail(self, other) < 0;
6363    });
6364
6365    $def(self, '$<=', function $Comparable_$lt_eq$5(other) {
6366      var self = this;
6367
6368      return cmp_or_fail(self, other) <= 0;
6369    });
6370
6371    $def(self, '$between?', function $Comparable_between$ques$6(min, max) {
6372      var self = this;
6373
6374
6375      if ($rb_lt(self, min)) {
6376        return false
6377      }      if ($rb_gt(self, max)) {
6378        return false
6379      }      return true;
6380    });
6381    return $def(self, '$clamp', function $$clamp(min, max) {
6382      var self = this;
6383
6384
6385      if (max == null) max = nil;
6386
6387      var c, excl;
6388
6389      if (max === nil) {
6390        // We are dealing with a new Ruby 2.7 behaviour that we are able to
6391        // provide a single Range argument instead of 2 Comparables.
6392
6393        if (!Opal.is_a(min, Opal.Range)) {
6394          $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)");
6395        }
6396
6397        excl = min.excl;
6398        max = min.end;
6399        min = min.begin;
6400
6401        if (max !== nil && excl) {
6402          $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range");
6403        }
6404      }
6405
6406      if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) {
6407        $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument");
6408      }
6409
6410      if (min !== nil) {
6411        c = cmp_or_fail(self, min);
6412
6413        if (c == 0) return self;
6414        if (c < 0) return min;
6415      }
6416
6417      if (max !== nil) {
6418        c = cmp_or_fail(self, max);
6419
6420        if (c > 0) return max;
6421      }
6422
6423      return self;
6424    }, -2);
6425  })('::')
6426};
6427
6428Opal.modules["corelib/regexp"] = function(Opal) {/* Generated by Opal 1.7.3 */
6429  var $coerce_to = Opal.coerce_to, $prop = Opal.prop, $freeze = Opal.freeze, $klass = Opal.klass, $const_set = Opal.const_set, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $truthy = Opal.truthy, $gvars = Opal.gvars, $slice = Opal.slice, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $alias = Opal.alias, $send = Opal.send, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $ensure_kwargs = Opal.ensure_kwargs, $rb_ge = Opal.rb_ge, $to_a = Opal.to_a, $eqeqeq = Opal.eqeqeq, $rb_minus = Opal.rb_minus, $return_ivar = Opal.return_ivar, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
6430
6431  Opal.add_stubs('nil?,[],raise,escape,options,to_str,new,join,coerce_to!,!,match,coerce_to?,begin,frozen?,uniq,map,scan,source,to_proc,transform_values,group_by,each_with_index,+,last,=~,==,attr_reader,>=,length,is_a?,include?,names,regexp,named_captures,===,captures,-,inspect,empty?,each,to_a');
6432
6433  $klass('::', $$$('StandardError'), 'RegexpError');
6434  (function($base, $super, $parent_nesting) {
6435    var self = $klass($base, $super, 'Regexp');
6436
6437    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
6438
6439
6440    $const_set(self, 'IGNORECASE', 1);
6441    $const_set(self, 'EXTENDED', 2);
6442    $const_set(self, 'MULTILINE', 4);
6443    Opal.prop(self.$$prototype, '$$is_regexp', true);
6444    (function(self, $parent_nesting) {
6445      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
6446
6447
6448
6449      $def(self, '$allocate', function $$allocate() {
6450        var $yield = $$allocate.$$p || nil, self = this, allocated = nil;
6451
6452        $$allocate.$$p = null;
6453
6454        allocated = $send2(self, $find_super(self, 'allocate', $$allocate, false, true), 'allocate', [], $yield);
6455        allocated.uninitialized = true;
6456        return allocated;
6457      });
6458
6459      $def(self, '$escape', function $$escape(string) {
6460
6461        return Opal.escape_regexp(string);
6462      });
6463
6464      $def(self, '$last_match', function $$last_match(n) {
6465                if ($gvars["~"] == null) $gvars["~"] = nil;
6466
6467
6468        if (n == null) n = nil;
6469        if ($truthy(n['$nil?']())) {
6470          return $gvars["~"]
6471        } else if ($truthy($gvars["~"])) {
6472          return $gvars["~"]['$[]'](n)
6473        } else {
6474          return nil
6475        }      }, -1);
6476
6477      $def(self, '$union', function $$union($a) {
6478        var $post_args, parts, self = this;
6479
6480
6481        $post_args = $slice(arguments);
6482        parts = $post_args;
6483
6484        var is_first_part_array, quoted_validated, part, options, each_part_options;
6485        if (parts.length == 0) {
6486          return /(?!)/;
6487        }
6488        // return fast if there's only one element
6489        if (parts.length == 1 && parts[0].$$is_regexp) {
6490          return parts[0];
6491        }
6492        // cover the 2 arrays passed as arguments case
6493        is_first_part_array = parts[0].$$is_array;
6494        if (parts.length > 1 && is_first_part_array) {
6495          $Kernel.$raise($$$('TypeError'), "no implicit conversion of Array into String");
6496        }
6497        // deal with splat issues (related to https://github.com/opal/opal/issues/858)
6498        if (is_first_part_array) {
6499          parts = parts[0];
6500        }
6501        options = undefined;
6502        quoted_validated = [];
6503        for (var i=0; i < parts.length; i++) {
6504          part = parts[i];
6505          if (part.$$is_string) {
6506            quoted_validated.push(self.$escape(part));
6507          }
6508          else if (part.$$is_regexp) {
6509            each_part_options = (part).$options();
6510            if (options != undefined && options != each_part_options) {
6511              $Kernel.$raise($$$('TypeError'), "All expressions must use the same options");
6512            }
6513            options = each_part_options;
6514            quoted_validated.push('('+part.source+')');
6515          }
6516          else {
6517            quoted_validated.push(self.$escape((part).$to_str()));
6518          }
6519        }
6520        return self.$new((quoted_validated).$join("|"), options);
6521      }, -1);
6522
6523      $def(self, '$new', function $new$1(regexp, options) {
6524
6525        if (regexp.$$is_regexp) {
6526          return new RegExp(regexp);
6527        }
6528
6529        regexp = $Opal['$coerce_to!'](regexp, $$$('String'), "to_str");
6530
6531        if (regexp.charAt(regexp.length - 1) === '\\' && regexp.charAt(regexp.length - 2) !== '\\') {
6532          $Kernel.$raise($$$('RegexpError'), "too short escape sequence: /" + (regexp) + "/");
6533        }
6534
6535        regexp = regexp.replace('\\A', '^').replace('\\z', '$');
6536
6537        if (options === undefined || options['$!']()) {
6538          return new RegExp(regexp);
6539        }
6540
6541        if (options.$$is_number) {
6542          var temp = '';
6543          if ($$('IGNORECASE') & options) { temp += 'i'; }
6544          if ($$('MULTILINE')  & options) { temp += 'm'; }
6545          options = temp;
6546        }
6547        else {
6548          options = 'i';
6549        }
6550
6551        return new RegExp(regexp, options);
6552      }, -2);
6553      $alias(self, "compile", "new");
6554      return $alias(self, "quote", "escape");
6555    })(Opal.get_singleton_class(self), $nesting);
6556
6557    $def(self, '$==', function $Regexp_$eq_eq$2(other) {
6558      var self = this;
6559
6560      return other instanceof RegExp && self.toString() === other.toString();
6561    });
6562
6563    $def(self, '$===', function $Regexp_$eq_eq_eq$3(string) {
6564      var self = this;
6565
6566      return self.$match($Opal['$coerce_to?'](string, $$$('String'), "to_str")) !== nil
6567    });
6568
6569    $def(self, '$=~', function $Regexp_$eq_tilde$4(string) {
6570      var self = this, $ret_or_1 = nil;
6571      if ($gvars["~"] == null) $gvars["~"] = nil;
6572
6573      if ($truthy(($ret_or_1 = self.$match(string)))) {
6574        return $gvars["~"].$begin(0)
6575      } else {
6576        return $ret_or_1
6577      }
6578    });
6579
6580    $def(self, '$freeze', function $$freeze() {
6581      var self = this;
6582
6583
6584      if ($truthy(self['$frozen?']())) {
6585        return self
6586      }
6587      if (!self.hasOwnProperty('$$g')) { $prop(self, '$$g', null); }
6588      if (!self.hasOwnProperty('$$gm')) { $prop(self, '$$gm', null); }
6589
6590      return $freeze(self);
6591    });
6592
6593    $def(self, '$inspect', function $$inspect() {
6594      var self = this;
6595
6596
6597      var regexp_format = /^\/(.*)\/([^\/]*)$/;
6598      var value = self.toString();
6599      var matches = regexp_format.exec(value);
6600      if (matches) {
6601        var regexp_pattern = matches[1];
6602        var regexp_flags = matches[2];
6603        var chars = regexp_pattern.split('');
6604        var chars_length = chars.length;
6605        var char_escaped = false;
6606        var regexp_pattern_escaped = '';
6607        for (var i = 0; i < chars_length; i++) {
6608          var current_char = chars[i];
6609          if (!char_escaped && current_char == '/') {
6610            regexp_pattern_escaped = regexp_pattern_escaped.concat('\\');
6611          }
6612          regexp_pattern_escaped = regexp_pattern_escaped.concat(current_char);
6613          if (current_char == '\\') {
6614            if (char_escaped) {
6615              // does not over escape
6616              char_escaped = false;
6617            } else {
6618              char_escaped = true;
6619            }
6620          } else {
6621            char_escaped = false;
6622          }
6623        }
6624        return '/' + regexp_pattern_escaped + '/' + regexp_flags;
6625      } else {
6626        return value;
6627      }
6628
6629    });
6630
6631    $def(self, '$match', function $$match(string, pos) {
6632      var block = $$match.$$p || nil, self = this;
6633      if ($gvars["~"] == null) $gvars["~"] = nil;
6634
6635      $$match.$$p = null;
6636
6637      if (self.uninitialized) {
6638        $Kernel.$raise($$$('TypeError'), "uninitialized Regexp");
6639      }
6640
6641      if (pos === undefined) {
6642        if (string === nil) return ($gvars["~"] = nil);
6643        var m = self.exec($coerce_to(string, $$$('String'), 'to_str'));
6644        if (m) {
6645          ($gvars["~"] = $$$('MatchData').$new(self, m));
6646          return block === nil ? $gvars["~"] : Opal.yield1(block, $gvars["~"]);
6647        } else {
6648          return ($gvars["~"] = nil);
6649        }
6650      }
6651
6652      pos = $coerce_to(pos, $$$('Integer'), 'to_int');
6653
6654      if (string === nil) {
6655        return ($gvars["~"] = nil);
6656      }
6657
6658      string = $coerce_to(string, $$$('String'), 'to_str');
6659
6660      if (pos < 0) {
6661        pos += string.length;
6662        if (pos < 0) {
6663          return ($gvars["~"] = nil);
6664        }
6665      }
6666
6667      // global RegExp maintains state, so not using self/this
6668      var md, re = Opal.global_regexp(self);
6669
6670      while (true) {
6671        md = re.exec(string);
6672        if (md === null) {
6673          return ($gvars["~"] = nil);
6674        }
6675        if (md.index >= pos) {
6676          ($gvars["~"] = $$$('MatchData').$new(re, md));
6677          return block === nil ? $gvars["~"] : Opal.yield1(block, $gvars["~"]);
6678        }
6679        re.lastIndex = md.index + 1;
6680      }
6681    }, -2);
6682
6683    $def(self, '$match?', function $Regexp_match$ques$5(string, pos) {
6684      var self = this;
6685
6686      if (self.uninitialized) {
6687        $Kernel.$raise($$$('TypeError'), "uninitialized Regexp");
6688      }
6689
6690      if (pos === undefined) {
6691        return string === nil ? false : self.test($coerce_to(string, $$$('String'), 'to_str'));
6692      }
6693
6694      pos = $coerce_to(pos, $$$('Integer'), 'to_int');
6695
6696      if (string === nil) {
6697        return false;
6698      }
6699
6700      string = $coerce_to(string, $$$('String'), 'to_str');
6701
6702      if (pos < 0) {
6703        pos += string.length;
6704        if (pos < 0) {
6705          return false;
6706        }
6707      }
6708
6709      // global RegExp maintains state, so not using self/this
6710      var md, re = Opal.global_regexp(self);
6711
6712      md = re.exec(string);
6713      if (md === null || md.index < pos) {
6714        return false;
6715      } else {
6716        return true;
6717      }
6718    }, -2);
6719
6720    $def(self, '$names', function $$names() {
6721      var self = this;
6722
6723      return $send(self.$source().$scan(/\(?<(\w+)>/, $hash2(["no_matchdata"], {"no_matchdata": true})), 'map', [], "first".$to_proc()).$uniq()
6724    });
6725
6726    $def(self, '$named_captures', function $$named_captures() {
6727      var self = this;
6728
6729      return $send($send($send(self.$source().$scan(/\(?<(\w+)>/, $hash2(["no_matchdata"], {"no_matchdata": true})), 'map', [], "first".$to_proc()).$each_with_index(), 'group_by', [], "first".$to_proc()), 'transform_values', [], function $$6(i){
6730
6731        if (i == null) i = nil;
6732        return $send(i, 'map', [], function $$7(j){
6733
6734          if (j == null) j = nil;
6735          return $rb_plus(j.$last(), 1);});})
6736    });
6737
6738    $def(self, '$~', function $Regexp_$$8() {
6739      var self = this;
6740      if ($gvars._ == null) $gvars._ = nil;
6741
6742      return self['$=~']($gvars._)
6743    });
6744
6745    $def(self, '$source', function $$source() {
6746      var self = this;
6747
6748      return self.source;
6749    });
6750
6751    $def(self, '$options', function $$options() {
6752      var self = this;
6753
6754
6755      if (self.uninitialized) {
6756        $Kernel.$raise($$$('TypeError'), "uninitialized Regexp");
6757      }
6758      var result = 0;
6759      // should be supported in IE6 according to https://msdn.microsoft.com/en-us/library/7f5z26w4(v=vs.94).aspx
6760      if (self.multiline) {
6761        result |= $$('MULTILINE');
6762      }
6763      if (self.ignoreCase) {
6764        result |= $$('IGNORECASE');
6765      }
6766      return result;
6767
6768    });
6769
6770    $def(self, '$casefold?', function $Regexp_casefold$ques$9() {
6771      var self = this;
6772
6773      return self.ignoreCase;
6774    });
6775    $alias(self, "eql?", "==");
6776    return $alias(self, "to_s", "source");
6777  })('::', RegExp, $nesting);
6778  return (function($base, $super, $parent_nesting) {
6779    var self = $klass($base, $super, 'MatchData');
6780
6781    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
6782
6783    $proto.matches = nil;
6784
6785    self.$attr_reader("post_match", "pre_match", "regexp", "string");
6786
6787    $def(self, '$initialize', function $$initialize(regexp, match_groups, $kwargs) {
6788      var no_matchdata, self = this;
6789
6790
6791      $kwargs = $ensure_kwargs($kwargs);
6792
6793      no_matchdata = $kwargs.$$smap["no_matchdata"];if (no_matchdata == null) no_matchdata = false;
6794      if (!$truthy(no_matchdata)) {
6795        $gvars["~"] = self;
6796      }      self.regexp = regexp;
6797      self.begin = match_groups.index;
6798      self.string = match_groups.input;
6799      self.pre_match = match_groups.input.slice(0, match_groups.index);
6800      self.post_match = match_groups.input.slice(match_groups.index + match_groups[0].length);
6801      self.matches = [];
6802
6803      for (var i = 0, length = match_groups.length; i < length; i++) {
6804        var group = match_groups[i];
6805
6806        if (group == null) {
6807          self.matches.push(nil);
6808        }
6809        else {
6810          self.matches.push(group);
6811        }
6812      }
6813    }, -3);
6814
6815    $def(self, '$match', function $$match(idx) {
6816      var self = this, match = nil;
6817
6818      if ($truthy((match = self['$[]'](idx)))) {
6819        return match
6820      } else if (($truthy(idx['$is_a?']($$('Integer'))) && ($truthy($rb_ge(idx, self.$length()))))) {
6821        return $Kernel.$raise($$$('IndexError'), "index " + (idx) + " out of matches")
6822      } else {
6823        return nil
6824      }
6825    });
6826
6827    $def(self, '$match_length', function $$match_length(idx) {
6828      var $a, self = this;
6829
6830      return ($a = self.$match(idx), ($a === nil || $a == null) ? nil : $a.$length())
6831    });
6832
6833    $def(self, '$[]', function $MatchData_$$$10($a) {
6834      var $post_args, args, self = this;
6835
6836
6837      $post_args = $slice(arguments);
6838      args = $post_args;
6839
6840      if (args[0].$$is_string) {
6841        if (self.$regexp().$names()['$include?'](args['$[]'](0))['$!']()) {
6842          $Kernel.$raise($$$('IndexError'), "undefined group name reference: " + (args['$[]'](0)));
6843        }
6844        return self.$named_captures()['$[]'](args['$[]'](0))
6845      }
6846      else {
6847        return $send(self.matches, '[]', $to_a(args))
6848      }
6849    }, -1);
6850
6851    $def(self, '$offset', function $$offset(n) {
6852      var self = this;
6853
6854
6855      if (n !== 0) {
6856        $Kernel.$raise($$$('ArgumentError'), "MatchData#offset only supports 0th element");
6857      }
6858      return [self.begin, self.begin + self.matches[n].length];
6859
6860    });
6861
6862    $def(self, '$==', function $MatchData_$eq_eq$11(other) {
6863      var self = this, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, $ret_or_4 = nil;
6864
6865
6866      if (!$eqeqeq($$$('MatchData'), other)) {
6867        return false
6868      }      if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = ($truthy(($ret_or_4 = self.string == other.string)) ? (self.regexp.toString() == other.regexp.toString()) : ($ret_or_4)))) ? (self.pre_match == other.pre_match) : ($ret_or_3)))) ? (self.post_match == other.post_match) : ($ret_or_2))))) {
6869        return self.begin == other.begin;
6870      } else {
6871        return $ret_or_1
6872      }    });
6873
6874    $def(self, '$begin', function $$begin(n) {
6875      var self = this;
6876
6877
6878      if (n !== 0) {
6879        $Kernel.$raise($$$('ArgumentError'), "MatchData#begin only supports 0th element");
6880      }
6881      return self.begin;
6882
6883    });
6884
6885    $def(self, '$end', function $$end(n) {
6886      var self = this;
6887
6888
6889      if (n !== 0) {
6890        $Kernel.$raise($$$('ArgumentError'), "MatchData#end only supports 0th element");
6891      }
6892      return self.begin + self.matches[n].length;
6893
6894    });
6895
6896    $def(self, '$captures', function $$captures() {
6897      var self = this;
6898
6899      return self.matches.slice(1)
6900    });
6901
6902    $def(self, '$named_captures', function $$named_captures() {
6903      var self = this, matches = nil;
6904
6905
6906      matches = self.$captures();
6907      return $send(self.$regexp().$named_captures(), 'transform_values', [], function $$12(i){
6908
6909        if (i == null) i = nil;
6910        return matches['$[]']($rb_minus(i.$last(), 1));});
6911    });
6912
6913    $def(self, '$names', function $$names() {
6914      var self = this;
6915
6916      return self.$regexp().$names()
6917    });
6918
6919    $def(self, '$inspect', function $$inspect() {
6920      var self = this;
6921
6922
6923      var str = "#<MatchData " + (self.matches[0]).$inspect();
6924
6925      if (self.$regexp().$names()['$empty?']()) {
6926        for (var i = 1, length = self.matches.length; i < length; i++) {
6927          str += " " + i + ":" + (self.matches[i]).$inspect();
6928        }
6929      }
6930      else {
6931        $send(self.$named_captures(), 'each', [], function $$13(k, v){
6932
6933        if (k == null) k = nil;
6934        if (v == null) v = nil;
6935        return                str += " " + k + ":" + v.$inspect();});
6936      }
6937
6938      return str + ">";
6939
6940    });
6941
6942    $def(self, '$length', function $$length() {
6943      var self = this;
6944
6945      return self.matches.length
6946    });
6947
6948    $def(self, '$to_a', $return_ivar("matches"));
6949
6950    $def(self, '$to_s', function $$to_s() {
6951      var self = this;
6952
6953      return self.matches[0]
6954    });
6955
6956    $def(self, '$values_at', function $$values_at($a) {
6957      var $post_args, args, self = this;
6958
6959
6960      $post_args = $slice(arguments);
6961      args = $post_args;
6962
6963      var i, a, index, values = [];
6964
6965      for (i = 0; i < args.length; i++) {
6966
6967        if (args[i].$$is_range) {
6968          a = (args[i]).$to_a();
6969          a.unshift(i, 1);
6970          Array.prototype.splice.apply(args, a);
6971        }
6972
6973        index = $Opal['$coerce_to!'](args[i], $$$('Integer'), "to_int");
6974
6975        if (index < 0) {
6976          index += self.matches.length;
6977          if (index < 0) {
6978            values.push(nil);
6979            continue;
6980          }
6981        }
6982
6983        values.push(self.matches[index]);
6984      }
6985
6986      return values;
6987    }, -1);
6988    $alias(self, "eql?", "==");
6989    return $alias(self, "size", "length");
6990  })($nesting[0], null, $nesting);
6991};
6992
6993Opal.modules["corelib/string"] = function(Opal) {/* Generated by Opal 1.7.3 */
6994  var $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $global_multiline_regexp = Opal.global_multiline_regexp, $prop = Opal.prop, $klass = Opal.klass, $def = Opal.def, $Opal = Opal.Opal, $defs = Opal.defs, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $gvars = Opal.gvars, $rb_divide = Opal.rb_divide, $rb_plus = Opal.rb_plus, $eqeq = Opal.eqeq, $hash2 = Opal.hash2, $alias = Opal.alias, $const_set = Opal.const_set, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$;
6995
6996  Opal.add_stubs('require,include,coerce_to?,initialize,===,format,raise,respond_to?,to_s,to_str,<=>,==,=~,new,force_encoding,casecmp,empty?,ljust,ceil,/,+,rjust,floor,coerce_to!,nil?,class,copy_singleton_methods,initialize_clone,initialize_dup,enum_for,chomp,[],to_i,length,each_line,to_proc,to_a,match,match?,captures,proc,succ,escape,include?,upcase,unicode_normalize,dup,__id__,next,intern,pristine');
6997
6998  self.$require("corelib/comparable");
6999  self.$require("corelib/regexp");
7000  (function($base, $super, $parent_nesting) {
7001    var self = $klass($base, $super, 'String');
7002
7003    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
7004
7005
7006    self.$include($$$('Comparable'));
7007
7008    Opal.prop(self.$$prototype, '$$is_string', true);
7009
7010    $def(self, '$__id__', function $$__id__() {
7011      var self = this;
7012
7013      return self.toString();
7014    });
7015    $defs(self, '$try_convert', function $$try_convert(what) {
7016
7017      return $Opal['$coerce_to?'](what, $$$('String'), "to_str")
7018    });
7019    $defs(self, '$new', function $String_new$1($a) {
7020      var $post_args, args, self = this;
7021
7022
7023      $post_args = $slice(arguments);
7024      args = $post_args;
7025
7026      var str = args[0] || "";
7027      var opts = args[args.length-1];
7028      str = $coerce_to(str, $$$('String'), 'to_str');
7029      if (opts && opts.$$is_hash) {
7030        if (opts.$$smap.encoding) str = str.$force_encoding(opts.$$smap.encoding);
7031      }
7032      str = new self.$$constructor(str);
7033      if (!str.$initialize.$$pristine) $send((str), 'initialize', $to_a(args));
7034      return str;
7035    }, -1);
7036
7037    $def(self, '$initialize', function $$initialize($a, $b) {
7038      var $post_args, $kwargs;
7039
7040
7041      $post_args = $slice(arguments);
7042      $kwargs = $extract_kwargs($post_args);
7043      $kwargs = $ensure_kwargs($kwargs);
7044
7045      if ($post_args.length > 0) $post_args.shift();
7046      $kwargs.$$smap["encoding"];
7047      $kwargs.$$smap["capacity"];      return nil;
7048    }, -1);
7049
7050    $def(self, '$%', function $String_$percent$2(data) {
7051      var self = this;
7052
7053      if ($eqeqeq($$$('Array'), data)) {
7054        return $send(self, 'format', [self].concat($to_a(data)))
7055      } else {
7056        return self.$format(self, data)
7057      }
7058    });
7059
7060    $def(self, '$*', function $String_$$3(count) {
7061      var self = this;
7062
7063
7064      count = $coerce_to(count, $$$('Integer'), 'to_int');
7065
7066      if (count < 0) {
7067        $Kernel.$raise($$$('ArgumentError'), "negative argument");
7068      }
7069
7070      if (count === 0) {
7071        return '';
7072      }
7073
7074      var result = '',
7075          string = self.toString();
7076
7077      // All credit for the bit-twiddling magic code below goes to Mozilla
7078      // polyfill implementation of String.prototype.repeat() posted here:
7079      // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
7080
7081      if (string.length * count >= 1 << 28) {
7082        $Kernel.$raise($$$('RangeError'), "multiply count must not overflow maximum string size");
7083      }
7084
7085      for (;;) {
7086        if ((count & 1) === 1) {
7087          result += string;
7088        }
7089        count >>>= 1;
7090        if (count === 0) {
7091          break;
7092        }
7093        string += string;
7094      }
7095
7096      return result;
7097
7098    });
7099
7100    $def(self, '$+', function $String_$plus$4(other) {
7101      var self = this;
7102
7103
7104      other = $coerce_to(other, $$$('String'), 'to_str');
7105
7106      if (other == "" && self.$$class === Opal.String) return self;
7107      if (self == "" && other.$$class === Opal.String) return other;
7108      var out = self + other;
7109      if (self.encoding === out.encoding && other.encoding === out.encoding) return out;
7110      if (self.encoding.name === "UTF-8" || other.encoding.name === "UTF-8") return out;
7111      return Opal.enc(out, self.encoding);
7112    });
7113
7114    $def(self, '$<=>', function $String_$lt_eq_gt$5(other) {
7115      var self = this;
7116
7117      if ($truthy(other['$respond_to?']("to_str"))) {
7118
7119        other = other.$to_str().$to_s();
7120        return self > other ? 1 : (self < other ? -1 : 0);      } else {
7121
7122        var cmp = other['$<=>'](self);
7123
7124        if (cmp === nil) {
7125          return nil;
7126        }
7127        else {
7128          return cmp > 0 ? -1 : (cmp < 0 ? 1 : 0);
7129        }
7130
7131      }
7132    });
7133
7134    $def(self, '$==', function $String_$eq_eq$6(other) {
7135      var self = this;
7136
7137
7138      if (other.$$is_string) {
7139        return self.toString() === other.toString();
7140      }
7141      if ($respond_to(other, '$to_str')) {
7142        return other['$=='](self);
7143      }
7144      return false;
7145
7146    });
7147
7148    $def(self, '$=~', function $String_$eq_tilde$7(other) {
7149      var self = this;
7150
7151
7152      if (other.$$is_string) {
7153        $Kernel.$raise($$$('TypeError'), "type mismatch: String given");
7154      }
7155
7156      return other['$=~'](self);
7157
7158    });
7159
7160    $def(self, '$[]', function $String_$$$8(index, length) {
7161      var self = this;
7162
7163      var size = self.length, exclude, range;
7164
7165      if (index.$$is_range) {
7166        exclude = index.excl;
7167        range   = index;
7168        length  = index.end === nil ? -1 : $coerce_to(index.end, $$$('Integer'), 'to_int');
7169        index   = index.begin === nil ? 0 : $coerce_to(index.begin, $$$('Integer'), 'to_int');
7170
7171        if (Math.abs(index) > size) {
7172          return nil;
7173        }
7174
7175        if (index < 0) {
7176          index += size;
7177        }
7178
7179        if (length < 0) {
7180          length += size;
7181        }
7182
7183        if (!exclude || range.end === nil) {
7184          length += 1;
7185        }
7186
7187        length = length - index;
7188
7189        if (length < 0) {
7190          length = 0;
7191        }
7192
7193        return self.substr(index, length);
7194      }
7195
7196
7197      if (index.$$is_string) {
7198        if (length != null) {
7199          $Kernel.$raise($$$('TypeError'));
7200        }
7201        return self.indexOf(index) !== -1 ? index : nil;
7202      }
7203
7204
7205      if (index.$$is_regexp) {
7206        var match = self.match(index);
7207
7208        if (match === null) {
7209          ($gvars["~"] = nil);
7210          return nil;
7211        }
7212
7213        ($gvars["~"] = $$$('MatchData').$new(index, match));
7214
7215        if (length == null) {
7216          return match[0];
7217        }
7218
7219        length = $coerce_to(length, $$$('Integer'), 'to_int');
7220
7221        if (length < 0 && -length < match.length) {
7222          return match[length += match.length];
7223        }
7224
7225        if (length >= 0 && length < match.length) {
7226          return match[length];
7227        }
7228
7229        return nil;
7230      }
7231
7232
7233      index = $coerce_to(index, $$$('Integer'), 'to_int');
7234
7235      if (index < 0) {
7236        index += size;
7237      }
7238
7239      if (length == null) {
7240        if (index >= size || index < 0) {
7241          return nil;
7242        }
7243        return self.substr(index, 1);
7244      }
7245
7246      length = $coerce_to(length, $$$('Integer'), 'to_int');
7247
7248      if (length < 0) {
7249        return nil;
7250      }
7251
7252      if (index > size || index < 0) {
7253        return nil;
7254      }
7255
7256      return self.substr(index, length);
7257    }, -2);
7258
7259    $def(self, '$b', function $$b() {
7260      var self = this;
7261
7262      return (new String(self)).$force_encoding("binary")
7263    });
7264
7265    $def(self, '$capitalize', function $$capitalize() {
7266      var self = this;
7267
7268      return self.charAt(0).toUpperCase() + self.substr(1).toLowerCase();
7269    });
7270
7271    $def(self, '$casecmp', function $$casecmp(other) {
7272      var self = this;
7273
7274
7275      if (!$truthy(other['$respond_to?']("to_str"))) {
7276        return nil
7277      }      other = ($coerce_to(other, $$$('String'), 'to_str')).$to_s();
7278
7279      var ascii_only = /^[\x00-\x7F]*$/;
7280      if (ascii_only.test(self) && ascii_only.test(other)) {
7281        self = self.toLowerCase();
7282        other = other.toLowerCase();
7283      }
7284      return self['$<=>'](other);
7285    });
7286
7287    $def(self, '$casecmp?', function $String_casecmp$ques$9(other) {
7288      var self = this;
7289
7290
7291      var cmp = self.$casecmp(other);
7292      if (cmp === nil) {
7293        return nil;
7294      } else {
7295        return cmp === 0;
7296      }
7297
7298    });
7299
7300    $def(self, '$center', function $$center(width, padstr) {
7301      var self = this;
7302
7303
7304      if (padstr == null) padstr = " ";
7305      width = $coerce_to(width, $$$('Integer'), 'to_int');
7306      padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s();
7307      if ($truthy(padstr['$empty?']())) {
7308        $Kernel.$raise($$$('ArgumentError'), "zero width padding");
7309      }      if ($truthy(width <= self.length)) {
7310        return self
7311      }
7312      var ljustified = self.$ljust($rb_divide($rb_plus(width, self.length), 2).$ceil(), padstr),
7313          rjustified = self.$rjust($rb_divide($rb_plus(width, self.length), 2).$floor(), padstr);
7314
7315      return rjustified + ljustified.slice(self.length);
7316    }, -2);
7317
7318    $def(self, '$chomp', function $$chomp(separator) {
7319      var self = this;
7320      if ($gvars["/"] == null) $gvars["/"] = nil;
7321
7322
7323      if (separator == null) separator = $gvars["/"];
7324      if ($truthy(separator === nil || self.length === 0)) {
7325        return self
7326      }      separator = $Opal['$coerce_to!'](separator, $$$('String'), "to_str").$to_s();
7327
7328      var result;
7329
7330      if (separator === "\n") {
7331        result = self.replace(/\r?\n?$/, '');
7332      }
7333      else if (separator === "") {
7334        result = self.replace(/(\r?\n)+$/, '');
7335      }
7336      else if (self.length >= separator.length) {
7337        var tail = self.substr(self.length - separator.length, separator.length);
7338
7339        if (tail === separator) {
7340          result = self.substr(0, self.length - separator.length);
7341        }
7342      }
7343
7344      if (result != null) {
7345        return result;
7346      }
7347      return self;
7348    }, -1);
7349
7350    $def(self, '$chop', function $$chop() {
7351      var self = this;
7352
7353
7354      var length = self.length, result;
7355
7356      if (length <= 1) {
7357        result = "";
7358      } else if (self.charAt(length - 1) === "\n" && self.charAt(length - 2) === "\r") {
7359        result = self.substr(0, length - 2);
7360      } else {
7361        result = self.substr(0, length - 1);
7362      }
7363
7364      return result;
7365
7366    });
7367
7368    $def(self, '$chr', function $$chr() {
7369      var self = this;
7370
7371      return self.charAt(0);
7372    });
7373
7374    $def(self, '$clone', function $$clone($kwargs) {
7375      var freeze, self = this, copy = nil;
7376
7377
7378      $kwargs = $ensure_kwargs($kwargs);
7379
7380      freeze = $kwargs.$$smap["freeze"];if (freeze == null) freeze = nil;
7381      if (!(($truthy(freeze['$nil?']()) || ($eqeq(freeze, true))) || ($eqeq(freeze, false)))) {
7382        self.$raise($$('ArgumentError'), "unexpected value for freeze: " + (freeze.$class()));
7383      }      copy = new String(self);
7384      copy.$copy_singleton_methods(self);
7385      copy.$initialize_clone(self, $hash2(["freeze"], {"freeze": freeze}));
7386      if ($eqeq(freeze, true)) {
7387        if (!copy.$$frozen) { copy.$$frozen = true; }
7388      } else if ($truthy(freeze['$nil?']())) {
7389        if (self.$$frozen) { copy.$$frozen = true; }
7390      }      return copy;
7391    }, -1);
7392
7393    $def(self, '$dup', function $$dup() {
7394      var self = this, copy = nil;
7395
7396
7397      copy = new String(self);
7398      copy.$initialize_dup(self);
7399      return copy;
7400    });
7401
7402    $def(self, '$count', function $$count($a) {
7403      var $post_args, sets, self = this;
7404
7405
7406      $post_args = $slice(arguments);
7407      sets = $post_args;
7408
7409      if (sets.length === 0) {
7410        $Kernel.$raise($$$('ArgumentError'), "ArgumentError: wrong number of arguments (0 for 1+)");
7411      }
7412      var char_class = char_class_from_char_sets(sets);
7413      if (char_class === null) {
7414        return 0;
7415      }
7416      return self.length - self.replace(new RegExp(char_class, 'g'), '').length;
7417    }, -1);
7418
7419    $def(self, '$delete', function $String_delete$10($a) {
7420      var $post_args, sets, self = this;
7421
7422
7423      $post_args = $slice(arguments);
7424      sets = $post_args;
7425
7426      if (sets.length === 0) {
7427        $Kernel.$raise($$$('ArgumentError'), "ArgumentError: wrong number of arguments (0 for 1+)");
7428      }
7429      var char_class = char_class_from_char_sets(sets);
7430      if (char_class === null) {
7431        return self;
7432      }
7433      return self.replace(new RegExp(char_class, 'g'), '');
7434    }, -1);
7435
7436    $def(self, '$delete_prefix', function $$delete_prefix(prefix) {
7437      var self = this;
7438
7439
7440      if (!prefix.$$is_string) {
7441        prefix = $coerce_to(prefix, $$$('String'), 'to_str');
7442      }
7443
7444      if (self.slice(0, prefix.length) === prefix) {
7445        return self.slice(prefix.length);
7446      } else {
7447        return self;
7448      }
7449
7450    });
7451
7452    $def(self, '$delete_suffix', function $$delete_suffix(suffix) {
7453      var self = this;
7454
7455
7456      if (!suffix.$$is_string) {
7457        suffix = $coerce_to(suffix, $$$('String'), 'to_str');
7458      }
7459
7460      if (self.slice(self.length - suffix.length) === suffix) {
7461        return self.slice(0, self.length - suffix.length);
7462      } else {
7463        return self;
7464      }
7465
7466    });
7467
7468    $def(self, '$downcase', function $$downcase() {
7469      var self = this;
7470
7471      return self.toLowerCase();
7472    });
7473
7474    $def(self, '$each_line', function $$each_line($a, $b) {
7475      var block = $$each_line.$$p || nil, $post_args, $kwargs, separator, chomp, self = this;
7476      if ($gvars["/"] == null) $gvars["/"] = nil;
7477
7478      $$each_line.$$p = null;
7479      $post_args = $slice(arguments);
7480      $kwargs = $extract_kwargs($post_args);
7481      $kwargs = $ensure_kwargs($kwargs);
7482
7483      if ($post_args.length > 0) separator = $post_args.shift();if (separator == null) separator = $gvars["/"];
7484
7485      chomp = $kwargs.$$smap["chomp"];if (chomp == null) chomp = false;
7486      if (!(block !== nil)) {
7487        return self.$enum_for("each_line", separator, $hash2(["chomp"], {"chomp": chomp}))
7488      }
7489      if (separator === nil) {
7490        Opal.yield1(block, self);
7491
7492        return self;
7493      }
7494
7495      separator = $coerce_to(separator, $$$('String'), 'to_str');
7496
7497      var a, i, n, length, chomped, trailing, splitted, value;
7498
7499      if (separator.length === 0) {
7500        for (a = self.split(/((?:\r?\n){2})(?:(?:\r?\n)*)/), i = 0, n = a.length; i < n; i += 2) {
7501          if (a[i] || a[i + 1]) {
7502            value = (a[i] || "") + (a[i + 1] || "");
7503            if (chomp) {
7504              value = (value).$chomp("\n");
7505            }
7506            Opal.yield1(block, value);
7507          }
7508        }
7509
7510        return self;
7511      }
7512
7513      chomped  = self.$chomp(separator);
7514      trailing = self.length != chomped.length;
7515      splitted = chomped.split(separator);
7516
7517      for (i = 0, length = splitted.length; i < length; i++) {
7518        value = splitted[i];
7519        if (i < length - 1 || trailing) {
7520          value += separator;
7521        }
7522        if (chomp) {
7523          value = (value).$chomp(separator);
7524        }
7525        Opal.yield1(block, value);
7526      }
7527      return self;
7528    }, -1);
7529
7530    $def(self, '$empty?', function $String_empty$ques$11() {
7531      var self = this;
7532
7533      return self.length === 0;
7534    });
7535
7536    $def(self, '$end_with?', function $String_end_with$ques$12($a) {
7537      var $post_args, suffixes, self = this;
7538
7539
7540      $post_args = $slice(arguments);
7541      suffixes = $post_args;
7542
7543      for (var i = 0, length = suffixes.length; i < length; i++) {
7544        var suffix = $coerce_to(suffixes[i], $$$('String'), 'to_str').$to_s();
7545
7546        if (self.length >= suffix.length &&
7547            self.substr(self.length - suffix.length, suffix.length) == suffix) {
7548          return true;
7549        }
7550      }
7551      return false;
7552    }, -1);
7553
7554    $def(self, '$gsub', function $$gsub(pattern, replacement) {
7555      var block = $$gsub.$$p || nil, self = this;
7556
7557      $$gsub.$$p = null;
7558
7559      if (replacement === undefined && block === nil) {
7560        return self.$enum_for("gsub", pattern);
7561      }
7562
7563      var result = '', match_data = nil, index = 0, match, _replacement;
7564
7565      if (pattern.$$is_regexp) {
7566        pattern = $global_multiline_regexp(pattern);
7567      } else {
7568        pattern = $coerce_to(pattern, $$$('String'), 'to_str');
7569        pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm');
7570      }
7571
7572      var lastIndex;
7573      while (true) {
7574        match = pattern.exec(self);
7575
7576        if (match === null) {
7577          ($gvars["~"] = nil);
7578          result += self.slice(index);
7579          break;
7580        }
7581
7582        match_data = $$$('MatchData').$new(pattern, match);
7583
7584        if (replacement === undefined) {
7585          lastIndex = pattern.lastIndex;
7586          _replacement = block(match[0]);
7587          pattern.lastIndex = lastIndex; // save and restore lastIndex
7588        }
7589        else if (replacement.$$is_hash) {
7590          _replacement = (replacement)['$[]'](match[0]).$to_s();
7591        }
7592        else {
7593          if (!replacement.$$is_string) {
7594            replacement = $coerce_to(replacement, $$$('String'), 'to_str');
7595          }
7596          _replacement = replacement.replace(/([\\]+)([0-9+&`'])/g, function (original, slashes, command) {
7597            if (slashes.length % 2 === 0) {
7598              return original;
7599            }
7600            switch (command) {
7601            case "+":
7602              for (var i = match.length - 1; i > 0; i--) {
7603                if (match[i] !== undefined) {
7604                  return slashes.slice(1) + match[i];
7605                }
7606              }
7607              return '';
7608            case "&": return slashes.slice(1) + match[0];
7609            case "`": return slashes.slice(1) + self.slice(0, match.index);
7610            case "'": return slashes.slice(1) + self.slice(match.index + match[0].length);
7611            default:  return slashes.slice(1) + (match[command] || '');
7612            }
7613          }).replace(/\\\\/g, '\\');
7614        }
7615
7616        if (pattern.lastIndex === match.index) {
7617          result += (self.slice(index, match.index) + _replacement + (self[match.index] || ""));
7618          pattern.lastIndex += 1;
7619        }
7620        else {
7621          result += (self.slice(index, match.index) + _replacement);
7622        }
7623        index = pattern.lastIndex;
7624      }
7625
7626      ($gvars["~"] = match_data);
7627      return result;
7628    }, -2);
7629
7630    $def(self, '$hash', function $$hash() {
7631      var self = this;
7632
7633      return self.toString();
7634    });
7635
7636    $def(self, '$hex', function $$hex() {
7637      var self = this;
7638
7639      return self.$to_i(16)
7640    });
7641
7642    $def(self, '$include?', function $String_include$ques$13(other) {
7643      var self = this;
7644
7645
7646      if (!other.$$is_string) {
7647        other = $coerce_to(other, $$$('String'), 'to_str');
7648      }
7649      return self.indexOf(other) !== -1;
7650
7651    });
7652
7653    $def(self, '$index', function $$index(search, offset) {
7654      var self = this;
7655
7656      var index,
7657          match,
7658          regex;
7659
7660      if (offset === undefined) {
7661        offset = 0;
7662      } else {
7663        offset = $coerce_to(offset, $$$('Integer'), 'to_int');
7664        if (offset < 0) {
7665          offset += self.length;
7666          if (offset < 0) {
7667            return nil;
7668          }
7669        }
7670      }
7671
7672      if (search.$$is_regexp) {
7673        regex = $global_multiline_regexp(search);
7674        while (true) {
7675          match = regex.exec(self);
7676          if (match === null) {
7677            ($gvars["~"] = nil);
7678            index = -1;
7679            break;
7680          }
7681          if (match.index >= offset) {
7682            ($gvars["~"] = $$$('MatchData').$new(regex, match));
7683            index = match.index;
7684            break;
7685          }
7686          regex.lastIndex = match.index + 1;
7687        }
7688      } else {
7689        search = $coerce_to(search, $$$('String'), 'to_str');
7690        if (search.length === 0 && offset > self.length) {
7691          index = -1;
7692        } else {
7693          index = self.indexOf(search, offset);
7694        }
7695      }
7696
7697      return index === -1 ? nil : index;
7698    }, -2);
7699
7700    $def(self, '$inspect', function $$inspect() {
7701      var self = this;
7702
7703
7704      /* eslint-disable no-misleading-character-class */
7705      var escapable = /[\\\"\x00-\x1f\u007F-\u009F\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
7706          meta = {
7707            '\u0007': '\\a',
7708            '\u001b': '\\e',
7709            '\b': '\\b',
7710            '\t': '\\t',
7711            '\n': '\\n',
7712            '\f': '\\f',
7713            '\r': '\\r',
7714            '\v': '\\v',
7715            '"' : '\\"',
7716            '\\': '\\\\'
7717          },
7718          escaped = self.replace(escapable, function (chr) {
7719            if (meta[chr]) return meta[chr];
7720            chr = chr.charCodeAt(0);
7721            if (chr <= 0xff && (self.encoding["$binary?"]() || self.internal_encoding["$binary?"]())) {
7722              return '\\x' + ('00' + chr.toString(16).toUpperCase()).slice(-2);
7723            } else {
7724              return '\\u' + ('0000' + chr.toString(16).toUpperCase()).slice(-4);
7725            }
7726          });
7727      return '"' + escaped.replace(/\#[\$\@\{]/g, '\\$&') + '"';
7728      /* eslint-enable no-misleading-character-class */
7729
7730    });
7731
7732    $def(self, '$intern', function $$intern() {
7733      var self = this;
7734
7735      return self.toString();
7736    });
7737
7738    $def(self, '$length', function $$length() {
7739      var self = this;
7740
7741      return self.length;
7742    });
7743    $alias(self, "size", "length");
7744
7745    $def(self, '$lines', function $$lines($a, $b) {
7746      var block = $$lines.$$p || nil, $post_args, $kwargs, separator, chomp, self = this, e = nil;
7747      if ($gvars["/"] == null) $gvars["/"] = nil;
7748
7749      $$lines.$$p = null;
7750      $post_args = $slice(arguments);
7751      $kwargs = $extract_kwargs($post_args);
7752      $kwargs = $ensure_kwargs($kwargs);
7753
7754      if ($post_args.length > 0) separator = $post_args.shift();if (separator == null) separator = $gvars["/"];
7755
7756      chomp = $kwargs.$$smap["chomp"];if (chomp == null) chomp = false;
7757      e = $send(self, 'each_line', [separator, $hash2(["chomp"], {"chomp": chomp})], block.$to_proc());
7758      if ($truthy(block)) {
7759        return self
7760      } else {
7761        return e.$to_a()
7762      }    }, -1);
7763
7764    $def(self, '$ljust', function $$ljust(width, padstr) {
7765      var self = this;
7766
7767
7768      if (padstr == null) padstr = " ";
7769      width = $coerce_to(width, $$$('Integer'), 'to_int');
7770      padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s();
7771      if ($truthy(padstr['$empty?']())) {
7772        $Kernel.$raise($$$('ArgumentError'), "zero width padding");
7773      }      if ($truthy(width <= self.length)) {
7774        return self
7775      }
7776      var index  = -1,
7777          result = "";
7778
7779      width -= self.length;
7780
7781      while (++index < width) {
7782        result += padstr;
7783      }
7784
7785      return self + result.slice(0, width);
7786    }, -2);
7787
7788    $def(self, '$lstrip', function $$lstrip() {
7789      var self = this;
7790
7791      return self.replace(/^[\u0000\s]*/, '');
7792    });
7793
7794    $def(self, '$ascii_only?', function $String_ascii_only$ques$14() {
7795      var self = this;
7796
7797
7798      if (!self.encoding.ascii) return false;
7799      return /^[\x00-\x7F]*$/.test(self);
7800
7801    });
7802
7803    $def(self, '$match', function $$match(pattern, pos) {
7804      var block = $$match.$$p || nil, self = this;
7805
7806      $$match.$$p = null;
7807      if (($eqeqeq($$('String'), pattern) || ($truthy(pattern['$respond_to?']("to_str"))))) {
7808        pattern = $$$('Regexp').$new(pattern.$to_str());
7809      }      if (!$eqeqeq($$$('Regexp'), pattern)) {
7810        $Kernel.$raise($$$('TypeError'), "wrong argument type " + (pattern.$class()) + " (expected Regexp)");
7811      }      return $send(pattern, 'match', [self, pos], block.$to_proc());
7812    }, -2);
7813
7814    $def(self, '$match?', function $String_match$ques$15(pattern, pos) {
7815      var self = this;
7816      if (($eqeqeq($$('String'), pattern) || ($truthy(pattern['$respond_to?']("to_str"))))) {
7817        pattern = $$$('Regexp').$new(pattern.$to_str());
7818      }      if (!$eqeqeq($$$('Regexp'), pattern)) {
7819        $Kernel.$raise($$$('TypeError'), "wrong argument type " + (pattern.$class()) + " (expected Regexp)");
7820      }      return pattern['$match?'](self, pos);
7821    }, -2);
7822
7823    $def(self, '$next', function $$next() {
7824      var self = this;
7825
7826
7827      var i = self.length;
7828      if (i === 0) {
7829        return '';
7830      }
7831      var result = self;
7832      var first_alphanum_char_index = self.search(/[a-zA-Z0-9]/);
7833      var carry = false;
7834      var code;
7835      while (i--) {
7836        code = self.charCodeAt(i);
7837        if ((code >= 48 && code <= 57) ||
7838          (code >= 65 && code <= 90) ||
7839          (code >= 97 && code <= 122)) {
7840          switch (code) {
7841          case 57:
7842            carry = true;
7843            code = 48;
7844            break;
7845          case 90:
7846            carry = true;
7847            code = 65;
7848            break;
7849          case 122:
7850            carry = true;
7851            code = 97;
7852            break;
7853          default:
7854            carry = false;
7855            code += 1;
7856          }
7857        } else {
7858          if (first_alphanum_char_index === -1) {
7859            if (code === 255) {
7860              carry = true;
7861              code = 0;
7862            } else {
7863              carry = false;
7864              code += 1;
7865            }
7866          } else {
7867            carry = true;
7868          }
7869        }
7870        result = result.slice(0, i) + String.fromCharCode(code) + result.slice(i + 1);
7871        if (carry && (i === 0 || i === first_alphanum_char_index)) {
7872          switch (code) {
7873          case 65:
7874            break;
7875          case 97:
7876            break;
7877          default:
7878            code += 1;
7879          }
7880          if (i === 0) {
7881            result = String.fromCharCode(code) + result;
7882          } else {
7883            result = result.slice(0, i) + String.fromCharCode(code) + result.slice(i);
7884          }
7885          carry = false;
7886        }
7887        if (!carry) {
7888          break;
7889        }
7890      }
7891      return result;
7892
7893    });
7894
7895    $def(self, '$oct', function $$oct() {
7896      var self = this;
7897
7898
7899      var result,
7900          string = self,
7901          radix = 8;
7902
7903      if (/^\s*_/.test(string)) {
7904        return 0;
7905      }
7906
7907      string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/i, function (original, head, flag, tail) {
7908        switch (tail.charAt(0)) {
7909        case '+':
7910        case '-':
7911          return original;
7912        case '0':
7913          if (tail.charAt(1) === 'x' && flag === '0x') {
7914            return original;
7915          }
7916        }
7917        switch (flag) {
7918        case '0b':
7919          radix = 2;
7920          break;
7921        case '0':
7922        case '0o':
7923          radix = 8;
7924          break;
7925        case '0d':
7926          radix = 10;
7927          break;
7928        case '0x':
7929          radix = 16;
7930          break;
7931        }
7932        return head + tail;
7933      });
7934
7935      result = parseInt(string.replace(/_(?!_)/g, ''), radix);
7936      return isNaN(result) ? 0 : result;
7937
7938    });
7939
7940    $def(self, '$ord', function $$ord() {
7941      var self = this;
7942
7943
7944      if (typeof self.codePointAt === "function") {
7945        return self.codePointAt(0);
7946      }
7947      else {
7948        return self.charCodeAt(0);
7949      }
7950
7951    });
7952
7953    $def(self, '$partition', function $$partition(sep) {
7954      var self = this;
7955
7956
7957      var i, m;
7958
7959      if (sep.$$is_regexp) {
7960        m = sep.exec(self);
7961        if (m === null) {
7962          i = -1;
7963        } else {
7964          $$$('MatchData').$new(sep, m);
7965          sep = m[0];
7966          i = m.index;
7967        }
7968      } else {
7969        sep = $coerce_to(sep, $$$('String'), 'to_str');
7970        i = self.indexOf(sep);
7971      }
7972
7973      if (i === -1) {
7974        return [self, '', ''];
7975      }
7976
7977      return [
7978        self.slice(0, i),
7979        self.slice(i, i + sep.length),
7980        self.slice(i + sep.length)
7981      ];
7982
7983    });
7984
7985    $def(self, '$reverse', function $$reverse() {
7986      var self = this;
7987
7988      return self.split('').reverse().join('');
7989    });
7990
7991    $def(self, '$rindex', function $$rindex(search, offset) {
7992      var self = this;
7993
7994      var i, m, r, _m;
7995
7996      if (offset === undefined) {
7997        offset = self.length;
7998      } else {
7999        offset = $coerce_to(offset, $$$('Integer'), 'to_int');
8000        if (offset < 0) {
8001          offset += self.length;
8002          if (offset < 0) {
8003            return nil;
8004          }
8005        }
8006      }
8007
8008      if (search.$$is_regexp) {
8009        m = null;
8010        r = $global_multiline_regexp(search);
8011        while (true) {
8012          _m = r.exec(self);
8013          if (_m === null || _m.index > offset) {
8014            break;
8015          }
8016          m = _m;
8017          r.lastIndex = m.index + 1;
8018        }
8019        if (m === null) {
8020          ($gvars["~"] = nil);
8021          i = -1;
8022        } else {
8023          $$$('MatchData').$new(r, m);
8024          i = m.index;
8025        }
8026      } else {
8027        search = $coerce_to(search, $$$('String'), 'to_str');
8028        i = self.lastIndexOf(search, offset);
8029      }
8030
8031      return i === -1 ? nil : i;
8032    }, -2);
8033
8034    $def(self, '$rjust', function $$rjust(width, padstr) {
8035      var self = this;
8036
8037
8038      if (padstr == null) padstr = " ";
8039      width = $coerce_to(width, $$$('Integer'), 'to_int');
8040      padstr = ($coerce_to(padstr, $$$('String'), 'to_str')).$to_s();
8041      if ($truthy(padstr['$empty?']())) {
8042        $Kernel.$raise($$$('ArgumentError'), "zero width padding");
8043      }      if ($truthy(width <= self.length)) {
8044        return self
8045      }
8046      var chars     = Math.floor(width - self.length),
8047          patterns  = Math.floor(chars / padstr.length),
8048          result    = Array(patterns + 1).join(padstr),
8049          remaining = chars - result.length;
8050
8051      return result + padstr.slice(0, remaining) + self;
8052    }, -2);
8053
8054    $def(self, '$rpartition', function $$rpartition(sep) {
8055      var self = this;
8056
8057
8058      var i, m, r, _m;
8059
8060      if (sep.$$is_regexp) {
8061        m = null;
8062        r = $global_multiline_regexp(sep);
8063
8064        while (true) {
8065          _m = r.exec(self);
8066          if (_m === null) {
8067            break;
8068          }
8069          m = _m;
8070          r.lastIndex = m.index + 1;
8071        }
8072
8073        if (m === null) {
8074          i = -1;
8075        } else {
8076          $$$('MatchData').$new(r, m);
8077          sep = m[0];
8078          i = m.index;
8079        }
8080
8081      } else {
8082        sep = $coerce_to(sep, $$$('String'), 'to_str');
8083        i = self.lastIndexOf(sep);
8084      }
8085
8086      if (i === -1) {
8087        return ['', '', self];
8088      }
8089
8090      return [
8091        self.slice(0, i),
8092        self.slice(i, i + sep.length),
8093        self.slice(i + sep.length)
8094      ];
8095
8096    });
8097
8098    $def(self, '$rstrip', function $$rstrip() {
8099      var self = this;
8100
8101      return self.replace(/[\s\u0000]*$/, '');
8102    });
8103
8104    $def(self, '$scan', function $$scan(pattern, $kwargs) {
8105      var block = $$scan.$$p || nil, no_matchdata, self = this;
8106
8107      $$scan.$$p = null;
8108      $kwargs = $ensure_kwargs($kwargs);
8109
8110      no_matchdata = $kwargs.$$smap["no_matchdata"];if (no_matchdata == null) no_matchdata = false;
8111
8112      var result = [],
8113          match_data = nil,
8114          match;
8115
8116      if (pattern.$$is_regexp) {
8117        pattern = $global_multiline_regexp(pattern);
8118      } else {
8119        pattern = $coerce_to(pattern, $$$('String'), 'to_str');
8120        pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm');
8121      }
8122
8123      while ((match = pattern.exec(self)) != null) {
8124        match_data = $$$('MatchData').$new(pattern, match, $hash2(["no_matchdata"], {"no_matchdata": no_matchdata}));
8125        if (block === nil) {
8126          match.length == 1 ? result.push(match[0]) : result.push((match_data).$captures());
8127        } else {
8128          match.length == 1 ? Opal.yield1(block, match[0]) : Opal.yield1(block, (match_data).$captures());
8129        }
8130        if (pattern.lastIndex === match.index) {
8131          pattern.lastIndex += 1;
8132        }
8133      }
8134
8135      if (!no_matchdata) ($gvars["~"] = match_data);
8136
8137      return (block !== nil ? self : result);
8138    }, -2);
8139
8140    $def(self, '$singleton_class', function $$singleton_class() {
8141      var self = this;
8142
8143      return Opal.get_singleton_class(self);
8144    });
8145
8146    $def(self, '$split', function $$split(pattern, limit) {
8147      var self = this, $ret_or_1 = nil;
8148      if ($gvars[";"] == null) $gvars[";"] = nil;
8149
8150      if (self.length === 0) {
8151        return [];
8152      }
8153
8154      if (limit === undefined) {
8155        limit = 0;
8156      } else {
8157        limit = $Opal['$coerce_to!'](limit, $$$('Integer'), "to_int");
8158        if (limit === 1) {
8159          return [self];
8160        }
8161      }
8162
8163      if (pattern === undefined || pattern === nil) {
8164        pattern = ($truthy(($ret_or_1 = $gvars[";"])) ? ($ret_or_1) : (" "));
8165      }
8166
8167      var result = [],
8168          string = self.toString(),
8169          index = 0,
8170          match,
8171          i, ii;
8172
8173      if (pattern.$$is_regexp) {
8174        pattern = $global_multiline_regexp(pattern);
8175      } else {
8176        pattern = $coerce_to(pattern, $$$('String'), 'to_str').$to_s();
8177        if (pattern === ' ') {
8178          pattern = /\s+/gm;
8179          string = string.replace(/^\s+/, '');
8180        } else {
8181          pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm');
8182        }
8183      }
8184
8185      result = string.split(pattern);
8186
8187      if (result.length === 1 && result[0] === string) {
8188        return [result[0]];
8189      }
8190
8191      while ((i = result.indexOf(undefined)) !== -1) {
8192        result.splice(i, 1);
8193      }
8194
8195      if (limit === 0) {
8196        while (result[result.length - 1] === '') {
8197          result.length -= 1;
8198        }
8199        return result;
8200      }
8201
8202      match = pattern.exec(string);
8203
8204      if (limit < 0) {
8205        if (match !== null && match[0] === '' && pattern.source.indexOf('(?=') === -1) {
8206          for (i = 0, ii = match.length; i < ii; i++) {
8207            result.push('');
8208          }
8209        }
8210        return result;
8211      }
8212
8213      if (match !== null && match[0] === '') {
8214        result.splice(limit - 1, result.length - 1, result.slice(limit - 1).join(''));
8215        return result;
8216      }
8217
8218      if (limit >= result.length) {
8219        return result;
8220      }
8221
8222      i = 0;
8223      while (match !== null) {
8224        i++;
8225        index = pattern.lastIndex;
8226        if (i + 1 === limit) {
8227          break;
8228        }
8229        match = pattern.exec(string);
8230      }
8231      result.splice(limit - 1, result.length - 1, string.slice(index));
8232      return result;
8233    }, -1);
8234
8235    $def(self, '$squeeze', function $$squeeze($a) {
8236      var $post_args, sets, self = this;
8237
8238
8239      $post_args = $slice(arguments);
8240      sets = $post_args;
8241
8242      if (sets.length === 0) {
8243        return self.replace(/(.)\1+/g, '$1');
8244      }
8245      var char_class = char_class_from_char_sets(sets);
8246      if (char_class === null) {
8247        return self;
8248      }
8249      return self.replace(new RegExp('(' + char_class + ')\\1+', 'g'), '$1');
8250    }, -1);
8251
8252    $def(self, '$start_with?', function $String_start_with$ques$16($a) {
8253      var $post_args, prefixes, self = this;
8254
8255
8256      $post_args = $slice(arguments);
8257      prefixes = $post_args;
8258
8259      for (var i = 0, length = prefixes.length; i < length; i++) {
8260        if (prefixes[i].$$is_regexp) {
8261          var regexp = prefixes[i];
8262          var match = regexp.exec(self);
8263
8264          if (match != null && match.index === 0) {
8265            ($gvars["~"] = $$$('MatchData').$new(regexp, match));
8266            return true;
8267          } else {
8268            ($gvars["~"] = nil);
8269          }
8270        } else {
8271          var prefix = $coerce_to(prefixes[i], $$$('String'), 'to_str').$to_s();
8272
8273          if (self.indexOf(prefix) === 0) {
8274            return true;
8275          }
8276        }
8277      }
8278
8279      return false;
8280    }, -1);
8281
8282    $def(self, '$strip', function $$strip() {
8283      var self = this;
8284
8285      return self.replace(/^[\s\u0000]*|[\s\u0000]*$/g, '');
8286    });
8287
8288    $def(self, '$sub', function $$sub(pattern, replacement) {
8289      var block = $$sub.$$p || nil, self = this;
8290
8291      $$sub.$$p = null;
8292
8293      if (!pattern.$$is_regexp) {
8294        pattern = $coerce_to(pattern, $$$('String'), 'to_str');
8295        pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
8296      }
8297
8298      var result, match = pattern.exec(self);
8299
8300      if (match === null) {
8301        ($gvars["~"] = nil);
8302        result = self.toString();
8303      } else {
8304        $$$('MatchData').$new(pattern, match);
8305
8306        if (replacement === undefined) {
8307
8308          if (block === nil) {
8309            $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (1 for 2)");
8310          }
8311          result = self.slice(0, match.index) + block(match[0]) + self.slice(match.index + match[0].length);
8312
8313        } else if (replacement.$$is_hash) {
8314
8315          result = self.slice(0, match.index) + (replacement)['$[]'](match[0]).$to_s() + self.slice(match.index + match[0].length);
8316
8317        } else {
8318
8319          replacement = $coerce_to(replacement, $$$('String'), 'to_str');
8320
8321          replacement = replacement.replace(/([\\]+)([0-9+&`'])/g, function (original, slashes, command) {
8322            if (slashes.length % 2 === 0) {
8323              return original;
8324            }
8325            switch (command) {
8326            case "+":
8327              for (var i = match.length - 1; i > 0; i--) {
8328                if (match[i] !== undefined) {
8329                  return slashes.slice(1) + match[i];
8330                }
8331              }
8332              return '';
8333            case "&": return slashes.slice(1) + match[0];
8334            case "`": return slashes.slice(1) + self.slice(0, match.index);
8335            case "'": return slashes.slice(1) + self.slice(match.index + match[0].length);
8336            default:  return slashes.slice(1) + (match[command] || '');
8337            }
8338          }).replace(/\\\\/g, '\\');
8339
8340          result = self.slice(0, match.index) + replacement + self.slice(match.index + match[0].length);
8341        }
8342      }
8343
8344      return result;
8345    }, -2);
8346
8347    $def(self, '$sum', function $$sum(n) {
8348      var self = this;
8349
8350
8351      if (n == null) n = 16;
8352
8353      n = $coerce_to(n, $$$('Integer'), 'to_int');
8354
8355      var result = 0,
8356          length = self.length,
8357          i = 0;
8358
8359      for (; i < length; i++) {
8360        result += self.charCodeAt(i);
8361      }
8362
8363      if (n <= 0) {
8364        return result;
8365      }
8366
8367      return result & (Math.pow(2, n) - 1);
8368    }, -1);
8369
8370    $def(self, '$swapcase', function $$swapcase() {
8371      var self = this;
8372
8373
8374      var str = self.replace(/([a-z]+)|([A-Z]+)/g, function($0,$1,$2) {
8375        return $1 ? $0.toUpperCase() : $0.toLowerCase();
8376      });
8377
8378      return str;
8379
8380    });
8381
8382    $def(self, '$to_f', function $$to_f() {
8383      var self = this;
8384
8385
8386      if (self.charAt(0) === '_') {
8387        return 0;
8388      }
8389
8390      var result = parseFloat(self.replace(/_/g, ''));
8391
8392      if (isNaN(result) || result == Infinity || result == -Infinity) {
8393        return 0;
8394      }
8395      else {
8396        return result;
8397      }
8398
8399    });
8400
8401    $def(self, '$to_i', function $$to_i(base) {
8402      var self = this;
8403
8404
8405      if (base == null) base = 10;
8406
8407      var result,
8408          string = self.toLowerCase(),
8409          radix = $coerce_to(base, $$$('Integer'), 'to_int');
8410
8411      if (radix === 1 || radix < 0 || radix > 36) {
8412        $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (radix));
8413      }
8414
8415      if (/^\s*_/.test(string)) {
8416        return 0;
8417      }
8418
8419      string = string.replace(/^(\s*[+-]?)(0[bodx]?)(.+)$/, function (original, head, flag, tail) {
8420        switch (tail.charAt(0)) {
8421        case '+':
8422        case '-':
8423          return original;
8424        case '0':
8425          if (tail.charAt(1) === 'x' && flag === '0x' && (radix === 0 || radix === 16)) {
8426            return original;
8427          }
8428        }
8429        switch (flag) {
8430        case '0b':
8431          if (radix === 0 || radix === 2) {
8432            radix = 2;
8433            return head + tail;
8434          }
8435          break;
8436        case '0':
8437        case '0o':
8438          if (radix === 0 || radix === 8) {
8439            radix = 8;
8440            return head + tail;
8441          }
8442          break;
8443        case '0d':
8444          if (radix === 0 || radix === 10) {
8445            radix = 10;
8446            return head + tail;
8447          }
8448          break;
8449        case '0x':
8450          if (radix === 0 || radix === 16) {
8451            radix = 16;
8452            return head + tail;
8453          }
8454          break;
8455        }
8456        return original
8457      });
8458
8459      result = parseInt(string.replace(/_(?!_)/g, ''), radix);
8460      return isNaN(result) ? 0 : result;
8461    }, -1);
8462
8463    $def(self, '$to_proc', function $$to_proc() {
8464      var self = this, method_name = nil, jsid = nil, proc = nil;
8465
8466      $$to_proc.$$p = null;
8467
8468      method_name = self.valueOf();
8469      jsid = Opal.jsid(method_name);
8470      proc = $send($Kernel, 'proc', [], function $$17($a){var block = $$17.$$p || nil, $post_args, args;
8471
8472        $$17.$$p = null;
8473        $post_args = $slice(arguments);
8474        args = $post_args;
8475
8476        if (args.length === 0) {
8477          $Kernel.$raise($$$('ArgumentError'), "no receiver given");
8478        }
8479
8480        var recv = args[0];
8481
8482        if (recv == null) recv = nil;
8483
8484        var body = recv[jsid];
8485
8486        if (!body) {
8487          body = recv.$method_missing;
8488          args[0] = method_name;
8489        } else {
8490          args = args.slice(1);
8491        }
8492
8493        if (typeof block === 'function') {
8494          body.$$p = block;
8495        }
8496
8497        if (args.length === 0) {
8498          return body.call(recv);
8499        } else {
8500          return body.apply(recv, args);
8501        }
8502}, -1);
8503      proc.$$source_location = nil;
8504      return proc;
8505    });
8506
8507    $def(self, '$to_s', function $$to_s() {
8508      var self = this;
8509
8510      return self.toString();
8511    });
8512
8513    $def(self, '$tr', function $$tr(from, to) {
8514      var self = this;
8515
8516
8517      from = $coerce_to(from, $$$('String'), 'to_str').$to_s();
8518      to = $coerce_to(to, $$$('String'), 'to_str').$to_s();
8519
8520      if (from.length == 0 || from === to) {
8521        return self;
8522      }
8523
8524      var i, in_range, c, ch, start, end, length;
8525      var subs = {};
8526      var from_chars = from.split('');
8527      var from_length = from_chars.length;
8528      var to_chars = to.split('');
8529      var to_length = to_chars.length;
8530
8531      var inverse = false;
8532      var global_sub = null;
8533      if (from_chars[0] === '^' && from_chars.length > 1) {
8534        inverse = true;
8535        from_chars.shift();
8536        global_sub = to_chars[to_length - 1];
8537        from_length -= 1;
8538      }
8539
8540      var from_chars_expanded = [];
8541      var last_from = null;
8542      in_range = false;
8543      for (i = 0; i < from_length; i++) {
8544        ch = from_chars[i];
8545        if (last_from == null) {
8546          last_from = ch;
8547          from_chars_expanded.push(ch);
8548        }
8549        else if (ch === '-') {
8550          if (last_from === '-') {
8551            from_chars_expanded.push('-');
8552            from_chars_expanded.push('-');
8553          }
8554          else if (i == from_length - 1) {
8555            from_chars_expanded.push('-');
8556          }
8557          else {
8558            in_range = true;
8559          }
8560        }
8561        else if (in_range) {
8562          start = last_from.charCodeAt(0);
8563          end = ch.charCodeAt(0);
8564          if (start > end) {
8565            $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration");
8566          }
8567          for (c = start + 1; c < end; c++) {
8568            from_chars_expanded.push(String.fromCharCode(c));
8569          }
8570          from_chars_expanded.push(ch);
8571          in_range = null;
8572          last_from = null;
8573        }
8574        else {
8575          from_chars_expanded.push(ch);
8576        }
8577      }
8578
8579      from_chars = from_chars_expanded;
8580      from_length = from_chars.length;
8581
8582      if (inverse) {
8583        for (i = 0; i < from_length; i++) {
8584          subs[from_chars[i]] = true;
8585        }
8586      }
8587      else {
8588        if (to_length > 0) {
8589          var to_chars_expanded = [];
8590          var last_to = null;
8591          in_range = false;
8592          for (i = 0; i < to_length; i++) {
8593            ch = to_chars[i];
8594            if (last_to == null) {
8595              last_to = ch;
8596              to_chars_expanded.push(ch);
8597            }
8598            else if (ch === '-') {
8599              if (last_to === '-') {
8600                to_chars_expanded.push('-');
8601                to_chars_expanded.push('-');
8602              }
8603              else if (i == to_length - 1) {
8604                to_chars_expanded.push('-');
8605              }
8606              else {
8607                in_range = true;
8608              }
8609            }
8610            else if (in_range) {
8611              start = last_to.charCodeAt(0);
8612              end = ch.charCodeAt(0);
8613              if (start > end) {
8614                $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration");
8615              }
8616              for (c = start + 1; c < end; c++) {
8617                to_chars_expanded.push(String.fromCharCode(c));
8618              }
8619              to_chars_expanded.push(ch);
8620              in_range = null;
8621              last_to = null;
8622            }
8623            else {
8624              to_chars_expanded.push(ch);
8625            }
8626          }
8627
8628          to_chars = to_chars_expanded;
8629          to_length = to_chars.length;
8630        }
8631
8632        var length_diff = from_length - to_length;
8633        if (length_diff > 0) {
8634          var pad_char = (to_length > 0 ? to_chars[to_length - 1] : '');
8635          for (i = 0; i < length_diff; i++) {
8636            to_chars.push(pad_char);
8637          }
8638        }
8639
8640        for (i = 0; i < from_length; i++) {
8641          subs[from_chars[i]] = to_chars[i];
8642        }
8643      }
8644
8645      var new_str = '';
8646      for (i = 0, length = self.length; i < length; i++) {
8647        ch = self.charAt(i);
8648        var sub = subs[ch];
8649        if (inverse) {
8650          new_str += (sub == null ? global_sub : ch);
8651        }
8652        else {
8653          new_str += (sub != null ? sub : ch);
8654        }
8655      }
8656      return new_str;
8657
8658    });
8659
8660    $def(self, '$tr_s', function $$tr_s(from, to) {
8661      var self = this;
8662
8663
8664      from = $coerce_to(from, $$$('String'), 'to_str').$to_s();
8665      to = $coerce_to(to, $$$('String'), 'to_str').$to_s();
8666
8667      if (from.length == 0) {
8668        return self;
8669      }
8670
8671      var i, in_range, c, ch, start, end, length;
8672      var subs = {};
8673      var from_chars = from.split('');
8674      var from_length = from_chars.length;
8675      var to_chars = to.split('');
8676      var to_length = to_chars.length;
8677
8678      var inverse = false;
8679      var global_sub = null;
8680      if (from_chars[0] === '^' && from_chars.length > 1) {
8681        inverse = true;
8682        from_chars.shift();
8683        global_sub = to_chars[to_length - 1];
8684        from_length -= 1;
8685      }
8686
8687      var from_chars_expanded = [];
8688      var last_from = null;
8689      in_range = false;
8690      for (i = 0; i < from_length; i++) {
8691        ch = from_chars[i];
8692        if (last_from == null) {
8693          last_from = ch;
8694          from_chars_expanded.push(ch);
8695        }
8696        else if (ch === '-') {
8697          if (last_from === '-') {
8698            from_chars_expanded.push('-');
8699            from_chars_expanded.push('-');
8700          }
8701          else if (i == from_length - 1) {
8702            from_chars_expanded.push('-');
8703          }
8704          else {
8705            in_range = true;
8706          }
8707        }
8708        else if (in_range) {
8709          start = last_from.charCodeAt(0);
8710          end = ch.charCodeAt(0);
8711          if (start > end) {
8712            $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration");
8713          }
8714          for (c = start + 1; c < end; c++) {
8715            from_chars_expanded.push(String.fromCharCode(c));
8716          }
8717          from_chars_expanded.push(ch);
8718          in_range = null;
8719          last_from = null;
8720        }
8721        else {
8722          from_chars_expanded.push(ch);
8723        }
8724      }
8725
8726      from_chars = from_chars_expanded;
8727      from_length = from_chars.length;
8728
8729      if (inverse) {
8730        for (i = 0; i < from_length; i++) {
8731          subs[from_chars[i]] = true;
8732        }
8733      }
8734      else {
8735        if (to_length > 0) {
8736          var to_chars_expanded = [];
8737          var last_to = null;
8738          in_range = false;
8739          for (i = 0; i < to_length; i++) {
8740            ch = to_chars[i];
8741            if (last_from == null) {
8742              last_from = ch;
8743              to_chars_expanded.push(ch);
8744            }
8745            else if (ch === '-') {
8746              if (last_to === '-') {
8747                to_chars_expanded.push('-');
8748                to_chars_expanded.push('-');
8749              }
8750              else if (i == to_length - 1) {
8751                to_chars_expanded.push('-');
8752              }
8753              else {
8754                in_range = true;
8755              }
8756            }
8757            else if (in_range) {
8758              start = last_from.charCodeAt(0);
8759              end = ch.charCodeAt(0);
8760              if (start > end) {
8761                $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (String.fromCharCode(start)) + "-" + (String.fromCharCode(end)) + "\" in string transliteration");
8762              }
8763              for (c = start + 1; c < end; c++) {
8764                to_chars_expanded.push(String.fromCharCode(c));
8765              }
8766              to_chars_expanded.push(ch);
8767              in_range = null;
8768              last_from = null;
8769            }
8770            else {
8771              to_chars_expanded.push(ch);
8772            }
8773          }
8774
8775          to_chars = to_chars_expanded;
8776          to_length = to_chars.length;
8777        }
8778
8779        var length_diff = from_length - to_length;
8780        if (length_diff > 0) {
8781          var pad_char = (to_length > 0 ? to_chars[to_length - 1] : '');
8782          for (i = 0; i < length_diff; i++) {
8783            to_chars.push(pad_char);
8784          }
8785        }
8786
8787        for (i = 0; i < from_length; i++) {
8788          subs[from_chars[i]] = to_chars[i];
8789        }
8790      }
8791      var new_str = '';
8792      var last_substitute = null;
8793      for (i = 0, length = self.length; i < length; i++) {
8794        ch = self.charAt(i);
8795        var sub = subs[ch];
8796        if (inverse) {
8797          if (sub == null) {
8798            if (last_substitute == null) {
8799              new_str += global_sub;
8800              last_substitute = true;
8801            }
8802          }
8803          else {
8804            new_str += ch;
8805            last_substitute = null;
8806          }
8807        }
8808        else {
8809          if (sub != null) {
8810            if (last_substitute == null || last_substitute !== sub) {
8811              new_str += sub;
8812              last_substitute = sub;
8813            }
8814          }
8815          else {
8816            new_str += ch;
8817            last_substitute = null;
8818          }
8819        }
8820      }
8821      return new_str;
8822
8823    });
8824
8825    $def(self, '$upcase', function $$upcase() {
8826      var self = this;
8827
8828      return self.toUpperCase();
8829    });
8830
8831    $def(self, '$upto', function $$upto(stop, excl) {
8832      var block = $$upto.$$p || nil, self = this;
8833
8834      $$upto.$$p = null;
8835      if (excl == null) excl = false;
8836      if (!(block !== nil)) {
8837        return self.$enum_for("upto", stop, excl)
8838      }
8839      var a, b, s = self.toString();
8840
8841      stop = $coerce_to(stop, $$$('String'), 'to_str');
8842
8843      if (s.length === 1 && stop.length === 1) {
8844
8845        a = s.charCodeAt(0);
8846        b = stop.charCodeAt(0);
8847
8848        while (a <= b) {
8849          if (excl && a === b) {
8850            break;
8851          }
8852
8853          block(String.fromCharCode(a));
8854
8855          a += 1;
8856        }
8857
8858      } else if (parseInt(s, 10).toString() === s && parseInt(stop, 10).toString() === stop) {
8859
8860        a = parseInt(s, 10);
8861        b = parseInt(stop, 10);
8862
8863        while (a <= b) {
8864          if (excl && a === b) {
8865            break;
8866          }
8867
8868          block(a.toString());
8869
8870          a += 1;
8871        }
8872
8873      } else {
8874
8875        while (s.length <= stop.length && s <= stop) {
8876          if (excl && s === stop) {
8877            break;
8878          }
8879
8880          block(s);
8881
8882          s = (s).$succ();
8883        }
8884
8885      }
8886      return self;
8887    }, -2);
8888
8889    function char_class_from_char_sets(sets) {
8890      function explode_sequences_in_character_set(set) {
8891        var result = '',
8892            i, len = set.length,
8893            curr_char,
8894            skip_next_dash,
8895            char_code_from,
8896            char_code_upto,
8897            char_code;
8898        for (i = 0; i < len; i++) {
8899          curr_char = set.charAt(i);
8900          if (curr_char === '-' && i > 0 && i < (len - 1) && !skip_next_dash) {
8901            char_code_from = set.charCodeAt(i - 1);
8902            char_code_upto = set.charCodeAt(i + 1);
8903            if (char_code_from > char_code_upto) {
8904              $Kernel.$raise($$$('ArgumentError'), "invalid range \"" + (char_code_from) + "-" + (char_code_upto) + "\" in string transliteration");
8905            }
8906            for (char_code = char_code_from + 1; char_code < char_code_upto + 1; char_code++) {
8907              result += String.fromCharCode(char_code);
8908            }
8909            skip_next_dash = true;
8910            i++;
8911          } else {
8912            skip_next_dash = (curr_char === '\\');
8913            result += curr_char;
8914          }
8915        }
8916        return result;
8917      }
8918
8919      function intersection(setA, setB) {
8920        if (setA.length === 0) {
8921          return setB;
8922        }
8923        var result = '',
8924            i, len = setA.length,
8925            chr;
8926        for (i = 0; i < len; i++) {
8927          chr = setA.charAt(i);
8928          if (setB.indexOf(chr) !== -1) {
8929            result += chr;
8930          }
8931        }
8932        return result;
8933      }
8934
8935      var i, len, set, neg, chr, tmp,
8936          pos_intersection = '',
8937          neg_intersection = '';
8938
8939      for (i = 0, len = sets.length; i < len; i++) {
8940        set = $coerce_to(sets[i], $$$('String'), 'to_str');
8941        neg = (set.charAt(0) === '^' && set.length > 1);
8942        set = explode_sequences_in_character_set(neg ? set.slice(1) : set);
8943        if (neg) {
8944          neg_intersection = intersection(neg_intersection, set);
8945        } else {
8946          pos_intersection = intersection(pos_intersection, set);
8947        }
8948      }
8949
8950      if (pos_intersection.length > 0 && neg_intersection.length > 0) {
8951        tmp = '';
8952        for (i = 0, len = pos_intersection.length; i < len; i++) {
8953          chr = pos_intersection.charAt(i);
8954          if (neg_intersection.indexOf(chr) === -1) {
8955            tmp += chr;
8956          }
8957        }
8958        pos_intersection = tmp;
8959        neg_intersection = '';
8960      }
8961
8962      if (pos_intersection.length > 0) {
8963        return '[' + $$$('Regexp').$escape(pos_intersection) + ']';
8964      }
8965
8966      if (neg_intersection.length > 0) {
8967        return '[^' + $$$('Regexp').$escape(neg_intersection) + ']';
8968      }
8969
8970      return null;
8971    }
8972
8973    $def(self, '$instance_variables', function $$instance_variables() {
8974
8975      return []
8976    });
8977    $defs(self, '$_load', function $$_load($a) {
8978      var $post_args, args, self = this;
8979
8980
8981      $post_args = $slice(arguments);
8982      args = $post_args;
8983      return $send(self, 'new', $to_a(args));
8984    }, -1);
8985
8986    $def(self, '$unicode_normalize', function $$unicode_normalize(form) {
8987      var self = this;
8988
8989
8990      if (form == null) form = "nfc";
8991      if (!$truthy(["nfc", "nfd", "nfkc", "nfkd"]['$include?'](form))) {
8992        $Kernel.$raise($$$('ArgumentError'), "Invalid normalization form " + (form));
8993      }      return self.normalize(form.$upcase());
8994    }, -1);
8995
8996    $def(self, '$unicode_normalized?', function $String_unicode_normalized$ques$18(form) {
8997      var self = this;
8998
8999
9000      if (form == null) form = "nfc";
9001      return self.$unicode_normalize(form)['$=='](self);
9002    }, -1);
9003
9004    $def(self, '$unpack', function $$unpack(format) {
9005
9006      return $Kernel.$raise("To use String#unpack, you must first require 'corelib/string/unpack'.")
9007    });
9008
9009    $def(self, '$unpack1', function $$unpack1(format) {
9010
9011      return $Kernel.$raise("To use String#unpack1, you must first require 'corelib/string/unpack'.")
9012    });
9013
9014    $def(self, '$freeze', function $$freeze() {
9015      var self = this;
9016
9017
9018      if (typeof self === 'string') { return self; }
9019      $prop(self, "$$frozen", true);
9020      return self;
9021
9022    });
9023
9024    $def(self, '$-@', function $String_$minus$$19() {
9025      var self = this;
9026
9027
9028      if (typeof self === 'string') return self;
9029      if (self.$$frozen) return self;
9030      if (self.encoding.name == 'UTF-8' && self.internal_encoding.name == 'UTF-8') return self.toString();
9031      return self.$dup().$freeze();
9032
9033    });
9034
9035    $def(self, '$frozen?', function $String_frozen$ques$20() {
9036      var self = this;
9037
9038      return typeof self === 'string' || self.$$frozen === true;
9039    });
9040    $alias(self, "+@", "dup");
9041    $alias(self, "===", "==");
9042    $alias(self, "byteslice", "[]");
9043    $alias(self, "eql?", "==");
9044    $alias(self, "equal?", "===");
9045    $alias(self, "object_id", "__id__");
9046    $alias(self, "slice", "[]");
9047    $alias(self, "succ", "next");
9048    $alias(self, "to_str", "to_s");
9049    $alias(self, "to_sym", "intern");
9050    return $Opal.$pristine(self, "initialize");
9051  })('::', String, $nesting);
9052  return $const_set($nesting[0], 'Symbol', $$('String'));
9053};
9054
9055Opal.modules["corelib/enumerable"] = function(Opal) {/* Generated by Opal 1.7.3 */
9056  var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $yield1 = Opal.yield1, $yieldX = Opal.yieldX, $deny_frozen_access = Opal.deny_frozen_access, $module = Opal.module, $send = Opal.send, $slice = Opal.slice, $to_a = Opal.to_a, $Opal = Opal.Opal, $thrower = Opal.thrower, $def = Opal.def, $Kernel = Opal.Kernel, $return_val = Opal.return_val, $rb_gt = Opal.rb_gt, $rb_times = Opal.rb_times, $rb_lt = Opal.rb_lt, $eqeq = Opal.eqeq, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_divide = Opal.rb_divide, $rb_le = Opal.rb_le, $hash2 = Opal.hash2, $lambda = Opal.lambda, $not = Opal.not, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
9057
9058  Opal.add_stubs('each,public_send,destructure,to_enum,enumerator_size,new,yield,raise,slice_when,!,enum_for,flatten,map,to_proc,compact,to_a,warn,proc,==,nil?,respond_to?,coerce_to!,>,*,try_convert,<,+,-,ceil,/,size,select,__send__,length,<=,[],push,<<,[]=,===,inspect,<=>,first,reverse,sort,take,sort_by,compare,call,dup,sort!,map!,include?,-@,key?,values,transform_values,group_by,fetch,to_h,coerce_to?,class,zip,detect,find_all,collect_concat,collect,inject,entries');
9059  return (function($base, $parent_nesting) {
9060    var self = $module($base, 'Enumerable');
9061
9062    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
9063
9064
9065
9066    function comparableForPattern(value) {
9067      if (value.length === 0) {
9068        value = [nil];
9069      }
9070
9071      if (value.length > 1) {
9072        value = [value];
9073      }
9074
9075      return value;
9076    }
9077
9078    $def(self, '$all?', function $Enumerable_all$ques$1(pattern) {try { var $t_return = $thrower('return');
9079      var block = $Enumerable_all$ques$1.$$p || nil, self = this;
9080
9081      $Enumerable_all$ques$1.$$p = null;
9082
9083      ;
9084      ;
9085      if ($truthy(pattern !== undefined)) {
9086        $send(self, 'each', [], function $$2($a){var $post_args, value, comparable = nil;
9087
9088
9089          $post_args = $slice(arguments);
9090          value = $post_args;
9091          comparable = comparableForPattern(value);
9092          if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) {
9093            return nil
9094          } else {
9095            $t_return.$throw(false);
9096          };}, {$$arity: -1, $$ret: $t_return});
9097      } else if ((block !== nil)) {
9098        $send(self, 'each', [], function $$3($a){var $post_args, value;
9099
9100
9101          $post_args = $slice(arguments);
9102          value = $post_args;
9103          if ($truthy(Opal.yieldX(block, $to_a(value)))) {
9104            return nil
9105          } else {
9106            $t_return.$throw(false);
9107          };}, {$$arity: -1, $$ret: $t_return});
9108      } else {
9109        $send(self, 'each', [], function $$4($a){var $post_args, value;
9110
9111
9112          $post_args = $slice(arguments);
9113          value = $post_args;
9114          if ($truthy($Opal.$destructure(value))) {
9115            return nil
9116          } else {
9117            $t_return.$throw(false);
9118          };}, {$$arity: -1, $$ret: $t_return});
9119      };
9120      return true;} catch($e) {
9121        if ($e === $t_return) return $e.$v;
9122        throw $e;
9123      }
9124    }, -1);
9125
9126    $def(self, '$any?', function $Enumerable_any$ques$5(pattern) {try { var $t_return = $thrower('return');
9127      var block = $Enumerable_any$ques$5.$$p || nil, self = this;
9128
9129      $Enumerable_any$ques$5.$$p = null;
9130
9131      ;
9132      ;
9133      if ($truthy(pattern !== undefined)) {
9134        $send(self, 'each', [], function $$6($a){var $post_args, value, comparable = nil;
9135
9136
9137          $post_args = $slice(arguments);
9138          value = $post_args;
9139          comparable = comparableForPattern(value);
9140          if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) {
9141            $t_return.$throw(true);
9142          } else {
9143            return nil
9144          };}, {$$arity: -1, $$ret: $t_return});
9145      } else if ((block !== nil)) {
9146        $send(self, 'each', [], function $$7($a){var $post_args, value;
9147
9148
9149          $post_args = $slice(arguments);
9150          value = $post_args;
9151          if ($truthy(Opal.yieldX(block, $to_a(value)))) {
9152            $t_return.$throw(true);
9153          } else {
9154            return nil
9155          };}, {$$arity: -1, $$ret: $t_return});
9156      } else {
9157        $send(self, 'each', [], function $$8($a){var $post_args, value;
9158
9159
9160          $post_args = $slice(arguments);
9161          value = $post_args;
9162          if ($truthy($Opal.$destructure(value))) {
9163            $t_return.$throw(true);
9164          } else {
9165            return nil
9166          };}, {$$arity: -1, $$ret: $t_return});
9167      };
9168      return false;} catch($e) {
9169        if ($e === $t_return) return $e.$v;
9170        throw $e;
9171      }
9172    }, -1);
9173
9174    $def(self, '$chunk', function $$chunk() {
9175      var block = $$chunk.$$p || nil, self = this;
9176
9177      $$chunk.$$p = null;
9178      if (!(block !== nil)) {
9179        return $send(self, 'to_enum', ["chunk"], function $$9(){var self = $$9.$$s == null ? this : $$9.$$s;
9180
9181          return self.$enumerator_size()}, {$$s: self})
9182      }      return $send($$$('Enumerator'), 'new', [], function $$10(yielder){var self = $$10.$$s == null ? this : $$10.$$s;
9183
9184
9185        if (yielder == null) yielder = nil;
9186
9187        var previous = nil, accumulate = [];
9188
9189        function releaseAccumulate() {
9190          if (accumulate.length > 0) {
9191            yielder.$yield(previous, accumulate);
9192          }
9193        }
9194
9195        self.$each.$$p = function(value) {
9196          var key = $yield1(block, value);
9197
9198          if (key === nil) {
9199            releaseAccumulate();
9200            accumulate = [];
9201            previous = nil;
9202          } else {
9203            if (previous === nil || previous === key) {
9204              accumulate.push(value);
9205            } else {
9206              releaseAccumulate();
9207              accumulate = [value];
9208            }
9209
9210            previous = key;
9211          }
9212        };
9213
9214        self.$each();
9215
9216        releaseAccumulate();
9217}, {$$s: self});
9218    });
9219
9220    $def(self, '$chunk_while', function $$chunk_while() {
9221      var block = $$chunk_while.$$p || nil, self = this;
9222
9223      $$chunk_while.$$p = null;
9224      if (!(block !== nil)) {
9225        $Kernel.$raise($$$('ArgumentError'), "no block given");
9226      }      return $send(self, 'slice_when', [], function $$11(before, after){
9227
9228        if (before == null) before = nil;
9229        if (after == null) after = nil;
9230        return Opal.yieldX(block, [before, after])['$!']();});
9231    });
9232
9233    $def(self, '$collect', function $$collect() {
9234      var block = $$collect.$$p || nil, self = this;
9235
9236      $$collect.$$p = null;
9237      if (!(block !== nil)) {
9238        return $send(self, 'enum_for', ["collect"], function $$12(){var self = $$12.$$s == null ? this : $$12.$$s;
9239
9240          return self.$enumerator_size()}, {$$s: self})
9241      }
9242      var result = [];
9243
9244      self.$each.$$p = function() {
9245        var value = $yieldX(block, arguments);
9246
9247        result.push(value);
9248      };
9249
9250      self.$each();
9251
9252      return result;
9253    });
9254
9255    $def(self, '$collect_concat', function $$collect_concat() {
9256      var block = $$collect_concat.$$p || nil, self = this;
9257
9258      $$collect_concat.$$p = null;
9259      if (!(block !== nil)) {
9260        return $send(self, 'enum_for', ["collect_concat"], function $$13(){var self = $$13.$$s == null ? this : $$13.$$s;
9261
9262          return self.$enumerator_size()}, {$$s: self})
9263      }      return $send(self, 'map', [], block.$to_proc()).$flatten(1);
9264    });
9265
9266    $def(self, '$compact', function $$compact() {
9267      var self = this;
9268
9269      return self.$to_a().$compact()
9270    });
9271
9272    $def(self, '$count', function $$count(object) {
9273      var block = $$count.$$p || nil, self = this, result = nil;
9274
9275      $$count.$$p = null;
9276      result = 0;
9277
9278      if (object != null && block !== nil) {
9279        self.$warn("warning: given block not used");
9280      }
9281      if ($truthy(object != null)) {
9282        block = $send($Kernel, 'proc', [], function $$14($a){var $post_args, args;
9283
9284
9285          $post_args = $slice(arguments);
9286          args = $post_args;
9287          return $Opal.$destructure(args)['$=='](object);}, -1);
9288      } else if ($truthy(block['$nil?']())) {
9289        block = $send($Kernel, 'proc', [], $return_val(true));
9290      }      $send(self, 'each', [], function $$15($a){var $post_args, args;
9291
9292
9293        $post_args = $slice(arguments);
9294        args = $post_args;
9295        if ($truthy($yieldX(block, args))) {
9296          return result++;
9297        } else {
9298          return nil
9299        }}, -1);
9300      return result;
9301    }, -1);
9302
9303    $def(self, '$cycle', function $$cycle(n) {
9304      var block = $$cycle.$$p || nil, self = this;
9305
9306      $$cycle.$$p = null;
9307      if (n == null) n = nil;
9308      if (!(block !== nil)) {
9309        return $send(self, 'enum_for', ["cycle", n], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s;
9310
9311          if ($truthy(n['$nil?']())) {
9312            if ($truthy(self['$respond_to?']("size"))) {
9313              return $$$($$$('Float'), 'INFINITY')
9314            } else {
9315              return nil
9316            }
9317          } else {
9318
9319            n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
9320            if ($truthy($rb_gt(n, 0))) {
9321              return $rb_times(self.$enumerator_size(), n)
9322            } else {
9323              return 0
9324            }          }}, {$$s: self})
9325      }      if (!$truthy(n['$nil?']())) {
9326
9327        n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
9328        if ($truthy(n <= 0)) {
9329          return nil
9330        }      }
9331      var all = [], i, length;
9332
9333      self.$each.$$p = function() {
9334        var param = $Opal.$destructure(arguments);
9335            $yield1(block, param);
9336
9337        all.push(param);
9338      };
9339
9340      self.$each();
9341
9342      if (all.length === 0) {
9343        return nil;
9344      }
9345
9346      if (n === nil) {
9347        while (true) {
9348          for (i = 0, length = all.length; i < length; i++) {
9349            $yield1(block, all[i]);
9350          }
9351        }
9352      }
9353      else {
9354        while (n > 1) {
9355          for (i = 0, length = all.length; i < length; i++) {
9356            $yield1(block, all[i]);
9357          }
9358
9359          n--;
9360        }
9361      }
9362    }, -1);
9363
9364    $def(self, '$detect', function $$detect(ifnone) {try { var $t_return = $thrower('return');
9365      var block = $$detect.$$p || nil, self = this;
9366
9367      $$detect.$$p = null;
9368
9369      ;
9370      ;
9371      if (!(block !== nil)) {
9372        return self.$enum_for("detect", ifnone)
9373      };
9374      $send(self, 'each', [], function $$17($a){var $post_args, args, value = nil;
9375
9376
9377        $post_args = $slice(arguments);
9378        args = $post_args;
9379        value = $Opal.$destructure(args);
9380        if ($truthy(Opal.yield1(block, value))) {
9381          $t_return.$throw(value);
9382        } else {
9383          return nil
9384        };}, {$$arity: -1, $$ret: $t_return});
9385
9386      if (ifnone !== undefined) {
9387        if (typeof(ifnone) === 'function') {
9388          return ifnone();
9389        } else {
9390          return ifnone;
9391        }
9392      }
9393    ;
9394      return nil;} catch($e) {
9395        if ($e === $t_return) return $e.$v;
9396        throw $e;
9397      }
9398    }, -1);
9399
9400    $def(self, '$drop', function $$drop(number) {
9401      var self = this;
9402
9403
9404      number = $coerce_to(number, $$$('Integer'), 'to_int');
9405      if ($truthy(number < 0)) {
9406        $Kernel.$raise($$$('ArgumentError'), "attempt to drop negative size");
9407      }
9408      var result  = [],
9409          current = 0;
9410
9411      self.$each.$$p = function() {
9412        if (number <= current) {
9413          result.push($Opal.$destructure(arguments));
9414        }
9415
9416        current++;
9417      };
9418
9419      self.$each();
9420
9421      return result;
9422    });
9423
9424    $def(self, '$drop_while', function $$drop_while() {
9425      var block = $$drop_while.$$p || nil, self = this;
9426
9427      $$drop_while.$$p = null;
9428      if (!(block !== nil)) {
9429        return self.$enum_for("drop_while")
9430      }
9431      var result   = [],
9432          dropping = true;
9433
9434      self.$each.$$p = function() {
9435        var param = $Opal.$destructure(arguments);
9436
9437        if (dropping) {
9438          var value = $yield1(block, param);
9439
9440          if (!$truthy(value)) {
9441            dropping = false;
9442            result.push(param);
9443          }
9444        }
9445        else {
9446          result.push(param);
9447        }
9448      };
9449
9450      self.$each();
9451
9452      return result;
9453    });
9454
9455    $def(self, '$each_cons', function $$each_cons(n) {
9456      var block = $$each_cons.$$p || nil, self = this;
9457
9458      $$each_cons.$$p = null;
9459      if ($truthy(arguments.length != 1)) {
9460        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 1)");
9461      }      n = $Opal.$try_convert(n, $$$('Integer'), "to_int");
9462      if ($truthy(n <= 0)) {
9463        $Kernel.$raise($$$('ArgumentError'), "invalid size");
9464      }      if (!(block !== nil)) {
9465        return $send(self, 'enum_for', ["each_cons", n], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s, enum_size = nil;
9466
9467
9468          enum_size = self.$enumerator_size();
9469          if ($truthy(enum_size['$nil?']())) {
9470            return nil
9471          } else if (($eqeq(enum_size, 0) || ($truthy($rb_lt(enum_size, n))))) {
9472            return 0
9473          } else {
9474            return $rb_plus($rb_minus(enum_size, n), 1)
9475          }}, {$$s: self})
9476      }
9477      var buffer = [];
9478
9479      self.$each.$$p = function() {
9480        var element = $Opal.$destructure(arguments);
9481        buffer.push(element);
9482        if (buffer.length > n) {
9483          buffer.shift();
9484        }
9485        if (buffer.length == n) {
9486          $yield1(block, buffer.slice(0, n));
9487        }
9488      };
9489
9490      self.$each();
9491
9492      return self;
9493    });
9494
9495    $def(self, '$each_entry', function $$each_entry($a) {
9496      var block = $$each_entry.$$p || nil, $post_args, data, self = this;
9497
9498      $$each_entry.$$p = null;
9499      $post_args = $slice(arguments);
9500      data = $post_args;
9501      if (!(block !== nil)) {
9502        return $send(self, 'to_enum', ["each_entry"].concat($to_a(data)), function $$19(){var self = $$19.$$s == null ? this : $$19.$$s;
9503
9504          return self.$enumerator_size()}, {$$s: self})
9505      }
9506      self.$each.$$p = function() {
9507        var item = $Opal.$destructure(arguments);
9508
9509        $yield1(block, item);
9510      };
9511
9512      self.$each.apply(self, data);
9513
9514      return self;
9515    }, -1);
9516
9517    $def(self, '$each_slice', function $$each_slice(n) {
9518      var block = $$each_slice.$$p || nil, self = this;
9519
9520      $$each_slice.$$p = null;
9521      n = $coerce_to(n, $$$('Integer'), 'to_int');
9522      if ($truthy(n <= 0)) {
9523        $Kernel.$raise($$$('ArgumentError'), "invalid slice size");
9524      }      if (!(block !== nil)) {
9525        return $send(self, 'enum_for', ["each_slice", n], function $$20(){var self = $$20.$$s == null ? this : $$20.$$s;
9526
9527          if ($truthy(self['$respond_to?']("size"))) {
9528            return $rb_divide(self.$size(), n).$ceil()
9529          } else {
9530            return nil
9531          }}, {$$s: self})
9532      }
9533      var slice = [];
9534
9535      self.$each.$$p = function() {
9536        var param = $Opal.$destructure(arguments);
9537
9538        slice.push(param);
9539
9540        if (slice.length === n) {
9541          $yield1(block, slice);
9542          slice = [];
9543        }
9544      };
9545
9546      self.$each();
9547
9548      // our "last" group, if smaller than n then won't have been yielded
9549      if (slice.length > 0) {
9550        $yield1(block, slice);
9551      }
9552      return self;
9553    });
9554
9555    $def(self, '$each_with_index', function $$each_with_index($a) {
9556      var block = $$each_with_index.$$p || nil, $post_args, args, self = this;
9557
9558      $$each_with_index.$$p = null;
9559      $post_args = $slice(arguments);
9560      args = $post_args;
9561      if (!(block !== nil)) {
9562        return $send(self, 'enum_for', ["each_with_index"].concat($to_a(args)), function $$21(){var self = $$21.$$s == null ? this : $$21.$$s;
9563
9564          return self.$enumerator_size()}, {$$s: self})
9565      }
9566      var index = 0;
9567
9568      self.$each.$$p = function() {
9569        var param = $Opal.$destructure(arguments);
9570
9571        block(param, index);
9572
9573        index++;
9574      };
9575
9576      self.$each.apply(self, args);
9577      return self;
9578    }, -1);
9579
9580    $def(self, '$each_with_object', function $$each_with_object(object) {
9581      var block = $$each_with_object.$$p || nil, self = this;
9582
9583      $$each_with_object.$$p = null;
9584      if (!(block !== nil)) {
9585        return $send(self, 'enum_for', ["each_with_object", object], function $$22(){var self = $$22.$$s == null ? this : $$22.$$s;
9586
9587          return self.$enumerator_size()}, {$$s: self})
9588      }
9589      self.$each.$$p = function() {
9590        var param = $Opal.$destructure(arguments);
9591
9592        block(param, object);
9593      };
9594
9595      self.$each();
9596      return object;
9597    });
9598
9599    $def(self, '$entries', function $$entries($a) {
9600      var $post_args, args, self = this;
9601
9602
9603      $post_args = $slice(arguments);
9604      args = $post_args;
9605
9606      var result = [];
9607
9608      self.$each.$$p = function() {
9609        result.push($Opal.$destructure(arguments));
9610      };
9611
9612      self.$each.apply(self, args);
9613
9614      return result;
9615    }, -1);
9616
9617    $def(self, '$filter_map', function $$filter_map() {
9618      var block = $$filter_map.$$p || nil, self = this;
9619
9620      $$filter_map.$$p = null;
9621      if (!(block !== nil)) {
9622        return $send(self, 'enum_for', ["filter_map"], function $$23(){var self = $$23.$$s == null ? this : $$23.$$s;
9623
9624          return self.$enumerator_size()}, {$$s: self})
9625      }      return $send($send(self, 'map', [], block.$to_proc()), 'select', [], "itself".$to_proc());
9626    });
9627
9628    $def(self, '$find_all', function $$find_all() {
9629      var block = $$find_all.$$p || nil, self = this;
9630
9631      $$find_all.$$p = null;
9632      if (!(block !== nil)) {
9633        return $send(self, 'enum_for', ["find_all"], function $$24(){var self = $$24.$$s == null ? this : $$24.$$s;
9634
9635          return self.$enumerator_size()}, {$$s: self})
9636      }
9637      var result = [];
9638
9639      self.$each.$$p = function() {
9640        var param = $Opal.$destructure(arguments),
9641            value = $yield1(block, param);
9642
9643        if ($truthy(value)) {
9644          result.push(param);
9645        }
9646      };
9647
9648      self.$each();
9649
9650      return result;
9651    });
9652
9653    $def(self, '$find_index', function $$find_index(object) {try { var $t_return = $thrower('return');
9654      var block = $$find_index.$$p || nil, self = this, index = nil;
9655
9656      $$find_index.$$p = null;
9657
9658      ;
9659      ;
9660      if ($truthy(object === undefined && block === nil)) {
9661        return self.$enum_for("find_index")
9662      };
9663
9664      if (object != null && block !== nil) {
9665        self.$warn("warning: given block not used");
9666      }
9667    ;
9668      index = 0;
9669      if ($truthy(object != null)) {
9670        $send(self, 'each', [], function $$25($a){var $post_args, value;
9671
9672
9673          $post_args = $slice(arguments);
9674          value = $post_args;
9675          if ($eqeq($Opal.$destructure(value), object)) {
9676            $t_return.$throw(index);
9677          };
9678          return index += 1;;}, {$$arity: -1, $$ret: $t_return});
9679      } else {
9680        $send(self, 'each', [], function $$26($a){var $post_args, value;
9681
9682
9683          $post_args = $slice(arguments);
9684          value = $post_args;
9685          if ($truthy(Opal.yieldX(block, $to_a(value)))) {
9686            $t_return.$throw(index);
9687          };
9688          return index += 1;;}, {$$arity: -1, $$ret: $t_return});
9689      };
9690      return nil;} catch($e) {
9691        if ($e === $t_return) return $e.$v;
9692        throw $e;
9693      }
9694    }, -1);
9695
9696    $def(self, '$first', function $$first(number) {try { var $t_return = $thrower('return');
9697      var self = this, result = nil, current = nil;
9698
9699
9700      ;
9701      if ($truthy(number === undefined)) {
9702        return $send(self, 'each', [], function $$27(value){
9703
9704          if (value == null) value = nil;
9705          $t_return.$throw(value);}, {$$ret: $t_return})
9706      } else {
9707
9708        result = [];
9709        number = $coerce_to(number, $$$('Integer'), 'to_int');
9710        if ($truthy(number < 0)) {
9711          $Kernel.$raise($$$('ArgumentError'), "attempt to take negative size");
9712        };
9713        if ($truthy(number == 0)) {
9714          return []
9715        };
9716        current = 0;
9717        $send(self, 'each', [], function $$28($a){var $post_args, args;
9718
9719
9720          $post_args = $slice(arguments);
9721          args = $post_args;
9722          result.push($Opal.$destructure(args));
9723          if ($truthy(number <= ++current)) {
9724            $t_return.$throw(result);
9725          } else {
9726            return nil
9727          };}, {$$arity: -1, $$ret: $t_return});
9728        return result;
9729      };} catch($e) {
9730        if ($e === $t_return) return $e.$v;
9731        throw $e;
9732      }
9733    }, -1);
9734
9735    $def(self, '$grep', function $$grep(pattern) {
9736      var block = $$grep.$$p || nil, self = this, result = nil;
9737
9738      $$grep.$$p = null;
9739      result = [];
9740      $send(self, 'each', [], function $$29($a){var $post_args, value, cmp = nil;
9741
9742
9743        $post_args = $slice(arguments);
9744        value = $post_args;
9745        cmp = comparableForPattern(value);
9746        if (!$truthy($send(pattern, '__send__', ["==="].concat($to_a(cmp))))) {
9747          return nil
9748        }        if ((block !== nil)) {
9749
9750          if ($truthy($rb_gt(value.$length(), 1))) {
9751            value = [value];
9752          }          value = Opal.yieldX(block, $to_a(value));
9753        } else if ($truthy($rb_le(value.$length(), 1))) {
9754          value = value['$[]'](0);
9755        }        return result.$push(value);}, -1);
9756      return result;
9757    });
9758
9759    $def(self, '$grep_v', function $$grep_v(pattern) {
9760      var block = $$grep_v.$$p || nil, self = this, result = nil;
9761
9762      $$grep_v.$$p = null;
9763      result = [];
9764      $send(self, 'each', [], function $$30($a){var $post_args, value, cmp = nil;
9765
9766
9767        $post_args = $slice(arguments);
9768        value = $post_args;
9769        cmp = comparableForPattern(value);
9770        if ($truthy($send(pattern, '__send__', ["==="].concat($to_a(cmp))))) {
9771          return nil
9772        }        if ((block !== nil)) {
9773
9774          if ($truthy($rb_gt(value.$length(), 1))) {
9775            value = [value];
9776          }          value = Opal.yieldX(block, $to_a(value));
9777        } else if ($truthy($rb_le(value.$length(), 1))) {
9778          value = value['$[]'](0);
9779        }        return result.$push(value);}, -1);
9780      return result;
9781    });
9782
9783    $def(self, '$group_by', function $$group_by() {
9784      var block = $$group_by.$$p || nil, $a, self = this, hash = nil, $ret_or_1 = nil;
9785
9786      $$group_by.$$p = null;
9787      if (!(block !== nil)) {
9788        return $send(self, 'enum_for', ["group_by"], function $$31(){var self = $$31.$$s == null ? this : $$31.$$s;
9789
9790          return self.$enumerator_size()}, {$$s: self})
9791      }      hash = $hash2([], {});
9792
9793      self.$each.$$p = function() {
9794        var param = $Opal.$destructure(arguments),
9795            value = $yield1(block, param);
9796
9797        ($truthy(($ret_or_1 = hash['$[]'](value))) ? ($ret_or_1) : (($a = [value, []], $send(hash, '[]=', $a), $a[$a.length - 1])))['$<<'](param);
9798      };
9799
9800      self.$each();
9801      return hash;
9802    });
9803
9804    $def(self, '$include?', function $Enumerable_include$ques$32(obj) {try { var $t_return = $thrower('return');
9805      var self = this;
9806
9807
9808      $send(self, 'each', [], function $$33($a){var $post_args, args;
9809
9810
9811        $post_args = $slice(arguments);
9812        args = $post_args;
9813        if ($eqeq($Opal.$destructure(args), obj)) {
9814          $t_return.$throw(true);
9815        } else {
9816          return nil
9817        };}, {$$arity: -1, $$ret: $t_return});
9818      return false;} catch($e) {
9819        if ($e === $t_return) return $e.$v;
9820        throw $e;
9821      }
9822    });
9823
9824    $def(self, '$inject', function $$inject(object, sym) {
9825      var block = $$inject.$$p || nil, self = this;
9826
9827      $$inject.$$p = null;
9828
9829      var result = object;
9830
9831      if (block !== nil && sym === undefined) {
9832        self.$each.$$p = function() {
9833          var value = $Opal.$destructure(arguments);
9834
9835          if (result === undefined) {
9836            result = value;
9837            return;
9838          }
9839
9840          value = $yieldX(block, [result, value]);
9841
9842          result = value;
9843        };
9844      }
9845      else {
9846        if (sym === undefined) {
9847          if (!$$$('Symbol')['$==='](object)) {
9848            $Kernel.$raise($$$('TypeError'), "" + (object.$inspect()) + " is not a Symbol");
9849          }
9850
9851          sym    = object;
9852          result = undefined;
9853        }
9854
9855        self.$each.$$p = function() {
9856          var value = $Opal.$destructure(arguments);
9857
9858          if (result === undefined) {
9859            result = value;
9860            return;
9861          }
9862
9863          result = (result).$__send__(sym, value);
9864        };
9865      }
9866
9867      self.$each();
9868
9869      return result == undefined ? nil : result;
9870    }, -1);
9871
9872    $def(self, '$lazy', function $$lazy() {
9873      var self = this;
9874
9875      return $send($$$($$$('Enumerator'), 'Lazy'), 'new', [self, self.$enumerator_size()], function $$34(enum$, $a){var $post_args, args;
9876
9877
9878        if (enum$ == null) enum$ = nil;
9879        $post_args = $slice(arguments, 1);
9880        args = $post_args;
9881        return $send(enum$, 'yield', $to_a(args));}, -2)
9882    });
9883
9884    $def(self, '$enumerator_size', function $$enumerator_size() {
9885      var self = this;
9886
9887      if ($truthy(self['$respond_to?']("size"))) {
9888        return self.$size()
9889      } else {
9890        return nil
9891      }
9892    });
9893
9894    $def(self, '$max', function $$max(n) {
9895      var block = $$max.$$p || nil, self = this;
9896
9897      $$max.$$p = null;
9898
9899      if (n === undefined || n === nil) {
9900        var result, value;
9901
9902        self.$each.$$p = function() {
9903          var item = $Opal.$destructure(arguments);
9904
9905          if (result === undefined) {
9906            result = item;
9907            return;
9908          }
9909
9910          if (block !== nil) {
9911            value = $yieldX(block, [item, result]);
9912          } else {
9913            value = (item)['$<=>'](result);
9914          }
9915
9916          if (value === nil) {
9917            $Kernel.$raise($$$('ArgumentError'), "comparison failed");
9918          }
9919
9920          if (value > 0) {
9921            result = item;
9922          }
9923        };
9924
9925        self.$each();
9926
9927        if (result === undefined) {
9928          return nil;
9929        } else {
9930          return result;
9931        }
9932      }
9933
9934      n = $coerce_to(n, $$$('Integer'), 'to_int');
9935      return $send(self, 'sort', [], block.$to_proc()).$reverse().$first(n);
9936    }, -1);
9937
9938    $def(self, '$max_by', function $$max_by(n) {
9939      var block = $$max_by.$$p || nil, self = this;
9940
9941      $$max_by.$$p = null;
9942      if (n == null) n = nil;
9943      if (!$truthy(block)) {
9944        return $send(self, 'enum_for', ["max_by", n], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s;
9945
9946          return self.$enumerator_size()}, {$$s: self})
9947      }      if (!$truthy(n['$nil?']())) {
9948        return $send(self, 'sort_by', [], block.$to_proc()).$reverse().$take(n)
9949      }
9950      var result,
9951          by;
9952
9953      self.$each.$$p = function() {
9954        var param = $Opal.$destructure(arguments),
9955            value = $yield1(block, param);
9956
9957        if (result === undefined) {
9958          result = param;
9959          by     = value;
9960          return;
9961        }
9962
9963        if ((value)['$<=>'](by) > 0) {
9964          result = param;
9965          by     = value;
9966        }
9967      };
9968
9969      self.$each();
9970
9971      return result === undefined ? nil : result;
9972    }, -1);
9973
9974    $def(self, '$min', function $$min(n) {
9975      var block = $$min.$$p || nil, self = this;
9976
9977      $$min.$$p = null;
9978      if (n == null) n = nil;
9979      if (!$truthy(n['$nil?']())) {
9980        if ((block !== nil)) {
9981          return $send(self, 'sort', [], function $$36(a, b){
9982
9983            if (a == null) a = nil;
9984            if (b == null) b = nil;
9985            return Opal.yieldX(block, [a, b]);}).$take(n)
9986        } else {
9987          return self.$sort().$take(n)
9988        }
9989      }
9990      var result;
9991
9992      if (block !== nil) {
9993        self.$each.$$p = function() {
9994          var param = $Opal.$destructure(arguments);
9995
9996          if (result === undefined) {
9997            result = param;
9998            return;
9999          }
10000
10001          var value = block(param, result);
10002
10003          if (value === nil) {
10004            $Kernel.$raise($$$('ArgumentError'), "comparison failed");
10005          }
10006
10007          if (value < 0) {
10008            result = param;
10009          }
10010        };
10011      }
10012      else {
10013        self.$each.$$p = function() {
10014          var param = $Opal.$destructure(arguments);
10015
10016          if (result === undefined) {
10017            result = param;
10018            return;
10019          }
10020
10021          if ($Opal.$compare(param, result) < 0) {
10022            result = param;
10023          }
10024        };
10025      }
10026
10027      self.$each();
10028
10029      return result === undefined ? nil : result;
10030    }, -1);
10031
10032    $def(self, '$min_by', function $$min_by(n) {
10033      var block = $$min_by.$$p || nil, self = this;
10034
10035      $$min_by.$$p = null;
10036      if (n == null) n = nil;
10037      if (!$truthy(block)) {
10038        return $send(self, 'enum_for', ["min_by", n], function $$37(){var self = $$37.$$s == null ? this : $$37.$$s;
10039
10040          return self.$enumerator_size()}, {$$s: self})
10041      }      if (!$truthy(n['$nil?']())) {
10042        return $send(self, 'sort_by', [], block.$to_proc()).$take(n)
10043      }
10044      var result,
10045          by;
10046
10047      self.$each.$$p = function() {
10048        var param = $Opal.$destructure(arguments),
10049            value = $yield1(block, param);
10050
10051        if (result === undefined) {
10052          result = param;
10053          by     = value;
10054          return;
10055        }
10056
10057        if ((value)['$<=>'](by) < 0) {
10058          result = param;
10059          by     = value;
10060        }
10061      };
10062
10063      self.$each();
10064
10065      return result === undefined ? nil : result;
10066    }, -1);
10067
10068    $def(self, '$minmax', function $$minmax() {
10069      var block = $$minmax.$$p || nil, self = this, $ret_or_1 = nil;
10070
10071      $$minmax.$$p = null;
10072      block = ($truthy(($ret_or_1 = block)) ? ($ret_or_1) : ($send($Kernel, 'proc', [], function $$38(a, b){
10073
10074        if (a == null) a = nil;
10075        if (b == null) b = nil;
10076        return a['$<=>'](b);})));
10077
10078      var min = nil, max = nil, first_time = true;
10079
10080      self.$each.$$p = function() {
10081        var element = $Opal.$destructure(arguments);
10082        if (first_time) {
10083          min = max = element;
10084          first_time = false;
10085        } else {
10086          var min_cmp = block.$call(min, element);
10087
10088          if (min_cmp === nil) {
10089            $Kernel.$raise($$$('ArgumentError'), "comparison failed");
10090          } else if (min_cmp > 0) {
10091            min = element;
10092          }
10093
10094          var max_cmp = block.$call(max, element);
10095
10096          if (max_cmp === nil) {
10097            $Kernel.$raise($$$('ArgumentError'), "comparison failed");
10098          } else if (max_cmp < 0) {
10099            max = element;
10100          }
10101        }
10102      };
10103
10104      self.$each();
10105
10106      return [min, max];
10107    });
10108
10109    $def(self, '$minmax_by', function $$minmax_by() {
10110      var block = $$minmax_by.$$p || nil, self = this;
10111
10112      $$minmax_by.$$p = null;
10113      if (!$truthy(block)) {
10114        return $send(self, 'enum_for', ["minmax_by"], function $$39(){var self = $$39.$$s == null ? this : $$39.$$s;
10115
10116          return self.$enumerator_size()}, {$$s: self})
10117      }
10118      var min_result = nil,
10119          max_result = nil,
10120          min_by,
10121          max_by;
10122
10123      self.$each.$$p = function() {
10124        var param = $Opal.$destructure(arguments),
10125            value = $yield1(block, param);
10126
10127        if ((min_by === undefined) || (value)['$<=>'](min_by) < 0) {
10128          min_result = param;
10129          min_by     = value;
10130        }
10131
10132        if ((max_by === undefined) || (value)['$<=>'](max_by) > 0) {
10133          max_result = param;
10134          max_by     = value;
10135        }
10136      };
10137
10138      self.$each();
10139
10140      return [min_result, max_result];
10141    });
10142
10143    $def(self, '$none?', function $Enumerable_none$ques$40(pattern) {try { var $t_return = $thrower('return');
10144      var block = $Enumerable_none$ques$40.$$p || nil, self = this;
10145
10146      $Enumerable_none$ques$40.$$p = null;
10147
10148      ;
10149      ;
10150      if ($truthy(pattern !== undefined)) {
10151        $send(self, 'each', [], function $$41($a){var $post_args, value, comparable = nil;
10152
10153
10154          $post_args = $slice(arguments);
10155          value = $post_args;
10156          comparable = comparableForPattern(value);
10157          if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) {
10158            $t_return.$throw(false);
10159          } else {
10160            return nil
10161          };}, {$$arity: -1, $$ret: $t_return});
10162      } else if ((block !== nil)) {
10163        $send(self, 'each', [], function $$42($a){var $post_args, value;
10164
10165
10166          $post_args = $slice(arguments);
10167          value = $post_args;
10168          if ($truthy(Opal.yieldX(block, $to_a(value)))) {
10169            $t_return.$throw(false);
10170          } else {
10171            return nil
10172          };}, {$$arity: -1, $$ret: $t_return});
10173      } else {
10174        $send(self, 'each', [], function $$43($a){var $post_args, value, item = nil;
10175
10176
10177          $post_args = $slice(arguments);
10178          value = $post_args;
10179          item = $Opal.$destructure(value);
10180          if ($truthy(item)) {
10181            $t_return.$throw(false);
10182          } else {
10183            return nil
10184          };}, {$$arity: -1, $$ret: $t_return});
10185      };
10186      return true;} catch($e) {
10187        if ($e === $t_return) return $e.$v;
10188        throw $e;
10189      }
10190    }, -1);
10191
10192    $def(self, '$one?', function $Enumerable_one$ques$44(pattern) {try { var $t_return = $thrower('return');
10193      var block = $Enumerable_one$ques$44.$$p || nil, self = this, count = nil;
10194
10195      $Enumerable_one$ques$44.$$p = null;
10196
10197      ;
10198      ;
10199      count = 0;
10200      if ($truthy(pattern !== undefined)) {
10201        $send(self, 'each', [], function $$45($a){var $post_args, value, comparable = nil;
10202
10203
10204          $post_args = $slice(arguments);
10205          value = $post_args;
10206          comparable = comparableForPattern(value);
10207          if ($truthy($send(pattern, 'public_send', ["==="].concat($to_a(comparable))))) {
10208
10209            count = $rb_plus(count, 1);
10210            if ($truthy($rb_gt(count, 1))) {
10211              $t_return.$throw(false);
10212            } else {
10213              return nil
10214            };
10215          } else {
10216            return nil
10217          };}, {$$arity: -1, $$ret: $t_return});
10218      } else if ((block !== nil)) {
10219        $send(self, 'each', [], function $$46($a){var $post_args, value;
10220
10221
10222          $post_args = $slice(arguments);
10223          value = $post_args;
10224          if (!$truthy(Opal.yieldX(block, $to_a(value)))) {
10225            return nil
10226          };
10227          count = $rb_plus(count, 1);
10228          if ($truthy($rb_gt(count, 1))) {
10229            $t_return.$throw(false);
10230          } else {
10231            return nil
10232          };}, {$$arity: -1, $$ret: $t_return});
10233      } else {
10234        $send(self, 'each', [], function $$47($a){var $post_args, value;
10235
10236
10237          $post_args = $slice(arguments);
10238          value = $post_args;
10239          if (!$truthy($Opal.$destructure(value))) {
10240            return nil
10241          };
10242          count = $rb_plus(count, 1);
10243          if ($truthy($rb_gt(count, 1))) {
10244            $t_return.$throw(false);
10245          } else {
10246            return nil
10247          };}, {$$arity: -1, $$ret: $t_return});
10248      };
10249      return count['$=='](1);} catch($e) {
10250        if ($e === $t_return) return $e.$v;
10251        throw $e;
10252      }
10253    }, -1);
10254
10255    $def(self, '$partition', function $$partition() {
10256      var block = $$partition.$$p || nil, self = this;
10257
10258      $$partition.$$p = null;
10259      if (!(block !== nil)) {
10260        return $send(self, 'enum_for', ["partition"], function $$48(){var self = $$48.$$s == null ? this : $$48.$$s;
10261
10262          return self.$enumerator_size()}, {$$s: self})
10263      }
10264      var truthy = [], falsy = [];
10265
10266      self.$each.$$p = function() {
10267        var param = $Opal.$destructure(arguments),
10268            value = $yield1(block, param);
10269
10270        if ($truthy(value)) {
10271          truthy.push(param);
10272        }
10273        else {
10274          falsy.push(param);
10275        }
10276      };
10277
10278      self.$each();
10279
10280      return [truthy, falsy];
10281    });
10282
10283    $def(self, '$reject', function $$reject() {
10284      var block = $$reject.$$p || nil, self = this;
10285
10286      $$reject.$$p = null;
10287      if (!(block !== nil)) {
10288        return $send(self, 'enum_for', ["reject"], function $$49(){var self = $$49.$$s == null ? this : $$49.$$s;
10289
10290          return self.$enumerator_size()}, {$$s: self})
10291      }
10292      var result = [];
10293
10294      self.$each.$$p = function() {
10295        var param = $Opal.$destructure(arguments),
10296            value = $yield1(block, param);
10297
10298        if (!$truthy(value)) {
10299          result.push(param);
10300        }
10301      };
10302
10303      self.$each();
10304
10305      return result;
10306    });
10307
10308    $def(self, '$reverse_each', function $$reverse_each() {
10309      var block = $$reverse_each.$$p || nil, self = this;
10310
10311      $$reverse_each.$$p = null;
10312      if (!(block !== nil)) {
10313        return $send(self, 'enum_for', ["reverse_each"], function $$50(){var self = $$50.$$s == null ? this : $$50.$$s;
10314
10315          return self.$enumerator_size()}, {$$s: self})
10316      }
10317      var result = [];
10318
10319      self.$each.$$p = function() {
10320        result.push(arguments);
10321      };
10322
10323      self.$each();
10324
10325      for (var i = result.length - 1; i >= 0; i--) {
10326        $yieldX(block, result[i]);
10327      }
10328
10329      return result;
10330    });
10331
10332    $def(self, '$slice_before', function $$slice_before(pattern) {
10333      var block = $$slice_before.$$p || nil, self = this;
10334
10335      $$slice_before.$$p = null;
10336      if ($truthy(pattern === undefined && block === nil)) {
10337        $Kernel.$raise($$$('ArgumentError'), "both pattern and block are given");
10338      }      if ($truthy(pattern !== undefined && block !== nil || arguments.length > 1)) {
10339        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " expected 1)");
10340      }      return $send($$$('Enumerator'), 'new', [], function $$51(e){var self = $$51.$$s == null ? this : $$51.$$s;
10341
10342
10343        if (e == null) e = nil;
10344
10345        var slice = [];
10346
10347        if (block !== nil) {
10348          if (pattern === undefined) {
10349            self.$each.$$p = function() {
10350              var param = $Opal.$destructure(arguments),
10351                  value = $yield1(block, param);
10352
10353              if ($truthy(value) && slice.length > 0) {
10354                e['$<<'](slice);
10355                slice = [];
10356              }
10357
10358              slice.push(param);
10359            };
10360          }
10361          else {
10362            self.$each.$$p = function() {
10363              var param = $Opal.$destructure(arguments),
10364                  value = block(param, pattern.$dup());
10365
10366              if ($truthy(value) && slice.length > 0) {
10367                e['$<<'](slice);
10368                slice = [];
10369              }
10370
10371              slice.push(param);
10372            };
10373          }
10374        }
10375        else {
10376          self.$each.$$p = function() {
10377            var param = $Opal.$destructure(arguments),
10378                value = pattern['$==='](param);
10379
10380            if ($truthy(value) && slice.length > 0) {
10381              e['$<<'](slice);
10382              slice = [];
10383            }
10384
10385            slice.push(param);
10386          };
10387        }
10388
10389        self.$each();
10390
10391        if (slice.length > 0) {
10392          e['$<<'](slice);
10393        }
10394}, {$$s: self});
10395    }, -1);
10396
10397    $def(self, '$slice_after', function $$slice_after(pattern) {
10398      var block = $$slice_after.$$p || nil, self = this;
10399
10400      $$slice_after.$$p = null;
10401      if ($truthy(pattern === undefined && block === nil)) {
10402        $Kernel.$raise($$$('ArgumentError'), "both pattern and block are given");
10403      }      if ($truthy(pattern !== undefined && block !== nil || arguments.length > 1)) {
10404        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " expected 1)");
10405      }      if ($truthy(pattern !== undefined)) {
10406        block = $send($Kernel, 'proc', [], function $$52(e){
10407
10408          if (e == null) e = nil;
10409          return pattern['$==='](e);});
10410      }      return $send($$$('Enumerator'), 'new', [], function $$53(yielder){var self = $$53.$$s == null ? this : $$53.$$s;
10411
10412
10413        if (yielder == null) yielder = nil;
10414
10415        var accumulate;
10416
10417        self.$each.$$p = function() {
10418          var element = $Opal.$destructure(arguments),
10419              end_chunk = $yield1(block, element);
10420
10421          if (accumulate == null) {
10422            accumulate = [];
10423          }
10424
10425          if ($truthy(end_chunk)) {
10426            accumulate.push(element);
10427            yielder.$yield(accumulate);
10428            accumulate = null;
10429          } else {
10430            accumulate.push(element);
10431          }
10432        };
10433
10434        self.$each();
10435
10436        if (accumulate != null) {
10437          yielder.$yield(accumulate);
10438        }
10439}, {$$s: self});
10440    }, -1);
10441
10442    $def(self, '$slice_when', function $$slice_when() {
10443      var block = $$slice_when.$$p || nil, self = this;
10444
10445      $$slice_when.$$p = null;
10446      if (!(block !== nil)) {
10447        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1)");
10448      }      return $send($$$('Enumerator'), 'new', [], function $$54(yielder){var self = $$54.$$s == null ? this : $$54.$$s;
10449
10450
10451        if (yielder == null) yielder = nil;
10452
10453        var slice = nil, last_after = nil;
10454
10455        self.$each_cons.$$p = function() {
10456          var params = $Opal.$destructure(arguments),
10457              before = params[0],
10458              after = params[1],
10459              match = $yieldX(block, [before, after]);
10460
10461          last_after = after;
10462
10463          if (slice === nil) {
10464            slice = [];
10465          }
10466
10467          if ($truthy(match)) {
10468            slice.push(before);
10469            yielder.$yield(slice);
10470            slice = [];
10471          } else {
10472            slice.push(before);
10473          }
10474        };
10475
10476        self.$each_cons(2);
10477
10478        if (slice !== nil) {
10479          slice.push(last_after);
10480          yielder.$yield(slice);
10481        }
10482}, {$$s: self});
10483    });
10484
10485    $def(self, '$sort', function $$sort() {
10486      var block = $$sort.$$p || nil, self = this, ary = nil;
10487
10488      $$sort.$$p = null;
10489      ary = self.$to_a();
10490      if (!(block !== nil)) {
10491        block = $lambda(function $$55(a, b){
10492
10493          if (a == null) a = nil;
10494          if (b == null) b = nil;
10495          return a['$<=>'](b);});
10496      }      return $send(ary, 'sort', [], block.$to_proc());
10497    });
10498
10499    $def(self, '$sort_by', function $$sort_by() {
10500      var block = $$sort_by.$$p || nil, self = this, dup = nil;
10501
10502      $$sort_by.$$p = null;
10503      if (!(block !== nil)) {
10504        return $send(self, 'enum_for', ["sort_by"], function $$56(){var self = $$56.$$s == null ? this : $$56.$$s;
10505
10506          return self.$enumerator_size()}, {$$s: self})
10507      }      dup = $send(self, 'map', [], function $$57(){var arg = nil;
10508
10509
10510        arg = $Opal.$destructure(arguments);
10511        return [Opal.yield1(block, arg), arg];});
10512      $send(dup, 'sort!', [], function $$58(a, b){
10513
10514        if (a == null) a = nil;
10515        if (b == null) b = nil;
10516        return (a[0])['$<=>'](b[0]);});
10517      return $send(dup, 'map!', [], function $$59(i){
10518
10519        if (i == null) i = nil;
10520        return i[1];});
10521    });
10522
10523    $def(self, '$sum', function $$sum(initial) {
10524      var $yield = $$sum.$$p || nil, self = this, result = nil, compensation = nil;
10525
10526      $$sum.$$p = null;
10527
10528      if (initial == null) initial = 0;
10529      result = initial;
10530      compensation = 0;
10531      $send(self, 'each', [], function $$60($a){var $post_args, args, item = nil, y = nil, t = nil;
10532
10533
10534        $post_args = $slice(arguments);
10535        args = $post_args;
10536        item = (($yield !== nil) ? (Opal.yieldX($yield, $to_a(args))) : ($Opal.$destructure(args)));
10537        if (($not([$$$($$$('Float'), 'INFINITY'), $$$($$$('Float'), 'INFINITY')['$-@']()]['$include?'](item)) && ($truthy(item['$respond_to?']("-"))))) {
10538
10539          y = $rb_minus(item, compensation);
10540          t = $rb_plus(result, y);
10541          compensation = $rb_minus($rb_minus(t, result), y);
10542          return (result = t);
10543        } else {
10544          return (result = $rb_plus(result, item))
10545        }}, -1);
10546      return result;
10547    }, -1);
10548
10549    $def(self, '$take', function $$take(num) {
10550      var self = this;
10551
10552      return self.$first(num)
10553    });
10554
10555    $def(self, '$take_while', function $$take_while() {try { var $t_return = $thrower('return');
10556      var block = $$take_while.$$p || nil, self = this, result = nil;
10557
10558      $$take_while.$$p = null;
10559
10560      ;
10561      if (!$truthy(block)) {
10562        return self.$enum_for("take_while")
10563      };
10564      result = [];
10565      return $send(self, 'each', [], function $$61($a){var $post_args, args, value = nil;
10566
10567
10568        $post_args = $slice(arguments);
10569        args = $post_args;
10570        value = $Opal.$destructure(args);
10571        if (!$truthy(Opal.yield1(block, value))) {
10572          $t_return.$throw(result);
10573        };
10574        return result.push(value);;}, {$$arity: -1, $$ret: $t_return});} catch($e) {
10575        if ($e === $t_return) return $e.$v;
10576        throw $e;
10577      }
10578    });
10579
10580    $def(self, '$uniq', function $$uniq() {
10581      var block = $$uniq.$$p || nil, self = this, hash = nil;
10582
10583      $$uniq.$$p = null;
10584      hash = $hash2([], {});
10585      $send(self, 'each', [], function $$62($a){var $post_args, args, $b, value = nil, produced = nil;
10586
10587
10588        $post_args = $slice(arguments);
10589        args = $post_args;
10590        value = $Opal.$destructure(args);
10591        produced = ((block !== nil) ? (Opal.yield1(block, value)) : (value));
10592        if ($truthy(hash['$key?'](produced))) {
10593          return nil
10594        } else {
10595          return ($b = [produced, value], $send(hash, '[]=', $b), $b[$b.length - 1])
10596        }}, -1);
10597      return hash.$values();
10598    });
10599
10600    $def(self, '$tally', function $$tally(hash) {
10601      var self = this, out = nil;
10602      if (hash && hash !== nil) { $deny_frozen_access(hash); }      out = $send($send(self, 'group_by', [], "itself".$to_proc()), 'transform_values', [], "count".$to_proc());
10603      if ($truthy(hash)) {
10604
10605        $send(out, 'each', [], function $$63(k, v){var $a;
10606
10607
10608          if (k == null) k = nil;
10609          if (v == null) v = nil;
10610          return ($a = [k, $rb_plus(hash.$fetch(k, 0), v)], $send(hash, '[]=', $a), $a[$a.length - 1]);});
10611        return hash;
10612      } else {
10613        return out
10614      }    }, -1);
10615
10616    $def(self, '$to_h', function $$to_h($a) {
10617      var block = $$to_h.$$p || nil, $post_args, args, self = this;
10618
10619      $$to_h.$$p = null;
10620      $post_args = $slice(arguments);
10621      args = $post_args;
10622      if ((block !== nil)) {
10623        return $send($send(self, 'map', [], block.$to_proc()), 'to_h', $to_a(args))
10624      }
10625      var hash = $hash2([], {});
10626
10627      self.$each.$$p = function() {
10628        var param = $Opal.$destructure(arguments);
10629        var ary = $Opal['$coerce_to?'](param, $$$('Array'), "to_ary"), key, val;
10630        if (!ary.$$is_array) {
10631          $Kernel.$raise($$$('TypeError'), "wrong element type " + ((ary).$class()) + " (expected array)");
10632        }
10633        if (ary.length !== 2) {
10634          $Kernel.$raise($$$('ArgumentError'), "wrong array length (expected 2, was " + ((ary).$length()) + ")");
10635        }
10636        key = ary[0];
10637        val = ary[1];
10638
10639        Opal.hash_put(hash, key, val);
10640      };
10641
10642      self.$each.apply(self, args);
10643
10644      return hash;
10645    }, -1);
10646
10647    $def(self, '$to_set', function $$to_set($a, $b) {
10648      var block = $$to_set.$$p || nil, $post_args, klass, args, self = this;
10649
10650      $$to_set.$$p = null;
10651      $post_args = $slice(arguments);
10652
10653      if ($post_args.length > 0) klass = $post_args.shift();if (klass == null) klass = $$('Set');
10654      args = $post_args;
10655      return $send(klass, 'new', [self].concat($to_a(args)), block.$to_proc());
10656    }, -1);
10657
10658    $def(self, '$zip', function $$zip($a) {
10659      var $post_args, others, self = this;
10660
10661      $$zip.$$p = null;
10662      $post_args = $slice(arguments);
10663      others = $post_args;
10664      return $send(self.$to_a(), 'zip', $to_a(others));
10665    }, -1);
10666    $alias(self, "find", "detect");
10667    $alias(self, "filter", "find_all");
10668    $alias(self, "flat_map", "collect_concat");
10669    $alias(self, "map", "collect");
10670    $alias(self, "member?", "include?");
10671    $alias(self, "reduce", "inject");
10672    $alias(self, "select", "find_all");
10673    return $alias(self, "to_a", "entries");
10674  })('::', $nesting)
10675};
10676
10677Opal.modules["corelib/enumerator/arithmetic_sequence"] = function(Opal) {/* Generated by Opal 1.7.3 */
10678  var $klass = Opal.klass, $truthy = Opal.truthy, $to_a = Opal.to_a, $eqeq = Opal.eqeq, $Kernel = Opal.Kernel, $def = Opal.def, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $rb_ge = Opal.rb_ge, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $not = Opal.not, $rb_times = Opal.rb_times, $rb_divide = Opal.rb_divide, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
10679
10680  Opal.add_stubs('is_a?,==,raise,respond_to?,class,attr_reader,begin,end,exclude_end?,>,step,<,<=,>=,-@,_lesser_than_end?,<<,+,-,===,%,_greater_than_begin?,reverse,!,include?,*,to_i,abs,/,hash,inspect');
10681  return (function($base, $super, $parent_nesting) {
10682    var self = $klass($base, $super, 'Enumerator');
10683
10684    var $nesting = [self].concat($parent_nesting);
10685
10686    return (function($base, $super, $parent_nesting) {
10687      var self = $klass($base, $super, 'ArithmeticSequence');
10688
10689      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
10690
10691      $proto.step_arg2 = $proto.receiver_num = $proto.step_arg1 = $proto.step = $proto.range = $proto.topfx = $proto.bypfx = $proto.creation_method = $proto.skipped_arg = nil;
10692
10693      Opal.prop(self.$$prototype, '$$is_arithmetic_seq', true);
10694      var inf = Infinity;
10695
10696      $def(self, '$initialize', function $$initialize(range, step, creation_method) {
10697        var $a, self = this, $ret_or_1 = nil;
10698        if (creation_method == null) creation_method = "step";
10699        self.creation_method = creation_method;
10700        if ($truthy(range['$is_a?']($$$('Array')))) {
10701
10702          $a = [].concat($to_a(range)), (self.step_arg1 = ($a[0] == null ? nil : $a[0])), (self.step_arg2 = ($a[1] == null ? nil : $a[1])), (self.topfx = ($a[2] == null ? nil : $a[2])), (self.bypfx = ($a[3] == null ? nil : $a[3]));
10703          self.receiver_num = step;
10704          self.step = 1;
10705          self.range = ($truthy(self.step_arg2) ? (((self.step = self.step_arg2), Opal.Range.$new(self.receiver_num, self.step_arg1, false))) : ($truthy(self.step_arg1) ? (Opal.Range.$new(self.receiver_num, self.step_arg1, false)) : (Opal.Range.$new(self.receiver_num, nil, false))));
10706        } else {
10707
10708          if (!$truthy(step)) {
10709            self.skipped_arg = true;
10710          }          $a = [range, ($truthy(($ret_or_1 = step)) ? ($ret_or_1) : (1))], (self.range = $a[0]), (self.step = $a[1]);
10711        }        self.object = self;
10712        if ($eqeq(self.step, 0)) {
10713          $Kernel.$raise($$('ArgumentError'), "step can't be 0");
10714        }        if ($truthy(self.step['$respond_to?']("to_int"))) {
10715          return nil
10716        } else {
10717          return $Kernel.$raise($$('ArgumentError'), "" + ("no implicit conversion of " + (self.step.$class()) + " ") + "into Integer")
10718        }      }, -2);
10719      self.$attr_reader("step");
10720
10721      $def(self, '$begin', function $$begin() {
10722        var self = this;
10723
10724        return self.range.$begin()
10725      });
10726
10727      $def(self, '$end', function $$end() {
10728        var self = this;
10729
10730        return self.range.$end()
10731      });
10732
10733      $def(self, '$exclude_end?', function $ArithmeticSequence_exclude_end$ques$1() {
10734        var self = this;
10735
10736        return self.range['$exclude_end?']()
10737      });
10738
10739      $def(self, '$_lesser_than_end?', function $ArithmeticSequence__lesser_than_end$ques$2(val) {
10740        var self = this, end_ = nil, $ret_or_1 = nil;
10741
10742
10743        end_ = ($truthy(($ret_or_1 = self.$end())) ? ($ret_or_1) : (inf));
10744        if ($truthy($rb_gt(self.$step(), 0))) {
10745          if ($truthy(self['$exclude_end?']())) {
10746            return $rb_lt(val, end_)
10747          } else {
10748            return $rb_le(val, end_)
10749          }
10750        } else if ($truthy(self['$exclude_end?']())) {
10751          return $rb_gt(val, end_)
10752        } else {
10753          return $rb_ge(val, end_)
10754        }      });
10755
10756      $def(self, '$_greater_than_begin?', function $ArithmeticSequence__greater_than_begin$ques$3(val) {
10757        var self = this, begin_ = nil, $ret_or_1 = nil;
10758
10759
10760        begin_ = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']()));
10761        if ($truthy($rb_gt(self.$step(), 0))) {
10762          return $rb_gt(val, begin_)
10763        } else {
10764          return $rb_lt(val, begin_)
10765        }      });
10766
10767      $def(self, '$first', function $$first(count) {
10768        var self = this, iter = nil, $ret_or_1 = nil, out = nil;
10769        iter = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']()));
10770        if (!$truthy(count)) {
10771          return ($truthy(self['$_lesser_than_end?'](iter)) ? (iter) : (nil))
10772        }        out = [];
10773        while ($truthy(($truthy(($ret_or_1 = self['$_lesser_than_end?'](iter))) ? ($rb_gt(count, 0)) : ($ret_or_1)))) {
10774
10775          out['$<<'](iter);
10776          iter = $rb_plus(iter, self.$step());
10777          count = $rb_minus(count, 1);
10778        }        return out;
10779      }, -1);
10780
10781      $def(self, '$each', function $$each() {
10782        var block = $$each.$$p || nil, self = this, $ret_or_1 = nil, iter = nil;
10783
10784        $$each.$$p = null;
10785        if (!(block !== nil)) {
10786          return self
10787        }        if ($eqeqeq(nil, ($ret_or_1 = self.$begin()))) {
10788          $Kernel.$raise($$('TypeError'), "nil can't be coerced into Integer");
10789        }        iter = ($truthy(($ret_or_1 = self.$begin())) ? ($ret_or_1) : ((inf)['$-@']()));
10790        while ($truthy(self['$_lesser_than_end?'](iter))) {
10791
10792          Opal.yield1(block, iter);
10793          iter = $rb_plus(iter, self.$step());
10794        }        return self;
10795      });
10796
10797      $def(self, '$last', function $$last(count) {
10798        var self = this, $ret_or_1 = nil, iter = nil, out = nil;
10799        if (($eqeqeq(inf, ($ret_or_1 = self.$end())) || ($eqeqeq((inf)['$-@'](), $ret_or_1)))) {
10800          $Kernel.$raise($$$('FloatDomainError'), self.$end());
10801        } else if ($eqeqeq(nil, $ret_or_1)) {
10802          $Kernel.$raise($$$('RangeError'), "cannot get the last element of endless arithmetic sequence");
10803        } else ;        iter = $rb_minus(self.$end(), $rb_minus(self.$end(), self.$begin())['$%'](self.$step()));
10804        if (!$truthy(self['$_lesser_than_end?'](iter))) {
10805          iter = $rb_minus(iter, self.$step());
10806        }        if (!$truthy(count)) {
10807          return ($truthy(self['$_greater_than_begin?'](iter)) ? (iter) : (nil))
10808        }        out = [];
10809        while ($truthy(($truthy(($ret_or_1 = self['$_greater_than_begin?'](iter))) ? ($rb_gt(count, 0)) : ($ret_or_1)))) {
10810
10811          out['$<<'](iter);
10812          iter = $rb_minus(iter, self.$step());
10813          count = $rb_minus(count, 1);
10814        }        return out.$reverse();
10815      }, -1);
10816
10817      $def(self, '$size', function $$size() {
10818        var self = this, step_sign = nil, iter = nil;
10819
10820
10821        step_sign = ($truthy($rb_gt(self.$step(), 0)) ? (1) : (-1));
10822        if ($not(self['$_lesser_than_end?'](self.$begin()))) {
10823          return 0
10824        } else if ($truthy([(inf)['$-@'](), inf]['$include?'](self.$step()))) {
10825          return 1
10826        } else if (($truthy([$rb_times((inf)['$-@'](), step_sign), nil]['$include?'](self.$begin())) || ($truthy([$rb_times(inf, step_sign), nil]['$include?'](self.$end()))))) {
10827          return inf;
10828        } else {
10829
10830          iter = $rb_minus(self.$end(), $rb_minus(self.$end(), self.$begin())['$%'](self.$step()));
10831          if (!$truthy(self['$_lesser_than_end?'](iter))) {
10832            iter = $rb_minus(iter, self.$step());
10833          }          return $rb_plus($rb_divide($rb_minus(iter, self.$begin()), self.$step()).$abs().$to_i(), 1);
10834        }      });
10835
10836      $def(self, '$==', function $ArithmeticSequence_$eq_eq$4(other) {
10837        var self = this, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, $ret_or_4 = nil;
10838
10839        if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = ($truthy(($ret_or_4 = self.$class()['$=='](other.$class()))) ? (self.$begin()['$=='](other.$begin())) : ($ret_or_4)))) ? (self.$end()['$=='](other.$end())) : ($ret_or_3)))) ? (self.$step()['$=='](other.$step())) : ($ret_or_2))))) {
10840          return self['$exclude_end?']()['$=='](other['$exclude_end?']())
10841        } else {
10842          return $ret_or_1
10843        }
10844      });
10845
10846      $def(self, '$hash', function $$hash() {
10847        var self = this;
10848
10849        return [self.$begin(), self.$end(), self.$step(), self['$exclude_end?']()].$hash()
10850      });
10851
10852      $def(self, '$inspect', function $$inspect() {
10853        var self = this, args = nil;
10854
10855        if ($truthy(self.receiver_num)) {
10856
10857          args = ($truthy(self.step_arg2) ? ("(" + (self.topfx) + (self.step_arg1.$inspect()) + ", " + (self.bypfx) + (self.step_arg2.$inspect()) + ")") : ($truthy(self.step_arg1) ? ("(" + (self.topfx) + (self.step_arg1.$inspect()) + ")") : nil));
10858          return "(" + (self.receiver_num.$inspect()) + "." + (self.creation_method) + (args) + ")";
10859        } else {
10860
10861          args = ($truthy(self.skipped_arg) ? (nil) : ("(" + (self.step) + ")"));
10862          return "((" + (self.range.$inspect()) + ")." + (self.creation_method) + (args) + ")";
10863        }
10864      });
10865      $alias(self, "===", "==");
10866      return $alias(self, "eql?", "==");
10867    })(self, self, $nesting)
10868  })('::', null, $nesting)
10869};
10870
10871Opal.modules["corelib/enumerator/chain"] = function(Opal) {/* Generated by Opal 1.7.3 */
10872  var $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $slice = Opal.slice, $def = Opal.def, $send = Opal.send, $to_a = Opal.to_a, $truthy = Opal.truthy, $rb_plus = Opal.rb_plus, $thrower = Opal.thrower, nil = Opal.nil, $$$ = Opal.$$$;
10873
10874  Opal.add_stubs('to_enum,size,each,<<,to_proc,include?,+,reverse_each,respond_to?,rewind,inspect');
10875  return (function($base, $super) {
10876    var self = $klass($base, $super, 'Enumerator');
10877
10878
10879    return (function($base, $super) {
10880      var self = $klass($base, $super, 'Chain');
10881
10882      var $proto = self.$$prototype;
10883
10884      $proto.enums = $proto.iterated = nil;
10885
10886
10887      $def(self, '$initialize', function $$initialize($a) {
10888        var $post_args, enums, self = this;
10889
10890
10891        $post_args = $slice(arguments);
10892        enums = $post_args;
10893        $deny_frozen_access(self);
10894        self.enums = enums;
10895        self.iterated = [];
10896        return (self.object = self);
10897      }, -1);
10898
10899      $def(self, '$each', function $$each($a) {
10900        var block = $$each.$$p || nil, $post_args, args, self = this;
10901
10902        $$each.$$p = null;
10903        $post_args = $slice(arguments);
10904        args = $post_args;
10905        if (!(block !== nil)) {
10906          return $send(self, 'to_enum', ["each"].concat($to_a(args)), function $$1(){var self = $$1.$$s == null ? this : $$1.$$s;
10907
10908            return self.$size()}, {$$s: self})
10909        }        $send(self.enums, 'each', [], function $$2(enum$){var self = $$2.$$s == null ? this : $$2.$$s;
10910          if (self.iterated == null) self.iterated = nil;
10911
10912
10913          if (enum$ == null) enum$ = nil;
10914          self.iterated['$<<'](enum$);
10915          return $send(enum$, 'each', $to_a(args), block.$to_proc());}, {$$s: self});
10916        return self;
10917      }, -1);
10918
10919      $def(self, '$size', function $$size($a) {try { var $t_return = $thrower('return');
10920        var $post_args, args, self = this, accum = nil;
10921
10922
10923        $post_args = $slice(arguments);
10924        args = $post_args;
10925        accum = 0;
10926        $send(self.enums, 'each', [], function $$3(enum$){var size = nil;
10927
10928
10929          if (enum$ == null) enum$ = nil;
10930          size = $send(enum$, 'size', $to_a(args));
10931          if ($truthy([nil, $$$($$$('Float'), 'INFINITY')]['$include?'](size))) {
10932            $t_return.$throw(size);
10933          };
10934          return (accum = $rb_plus(accum, size));}, {$$ret: $t_return});
10935        return accum;} catch($e) {
10936          if ($e === $t_return) return $e.$v;
10937          throw $e;
10938        }
10939      }, -1);
10940
10941      $def(self, '$rewind', function $$rewind() {
10942        var self = this;
10943
10944
10945        $send(self.iterated, 'reverse_each', [], function $$4(enum$){
10946
10947          if (enum$ == null) enum$ = nil;
10948          if ($truthy(enum$['$respond_to?']("rewind"))) {
10949            return enum$.$rewind()
10950          } else {
10951            return nil
10952          }});
10953        self.iterated = [];
10954        return self;
10955      });
10956      return $def(self, '$inspect', function $$inspect() {
10957        var self = this;
10958
10959        return "#<Enumerator::Chain: " + (self.enums.$inspect()) + ">"
10960      });
10961    })(self, self)
10962  })('::', null)
10963};
10964
10965Opal.modules["corelib/enumerator/generator"] = function(Opal) {/* Generated by Opal 1.7.3 */
10966  var $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $slice = Opal.slice, $send = Opal.send, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
10967
10968  Opal.add_stubs('include,raise,new,to_proc');
10969  return (function($base, $super, $parent_nesting) {
10970    var self = $klass($base, $super, 'Enumerator');
10971
10972    var $nesting = [self].concat($parent_nesting);
10973
10974    return (function($base, $super, $parent_nesting) {
10975      var self = $klass($base, $super, 'Generator');
10976
10977      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
10978
10979      $proto.block = nil;
10980
10981      self.$include($$$('Enumerable'));
10982
10983      $def(self, '$initialize', function $$initialize() {
10984        var block = $$initialize.$$p || nil, self = this;
10985
10986        $$initialize.$$p = null;
10987        $deny_frozen_access(self);
10988        if (!$truthy(block)) {
10989          $Kernel.$raise($$$('LocalJumpError'), "no block given");
10990        }        return (self.block = block);
10991      });
10992      return $def(self, '$each', function $$each($a) {
10993        var block = $$each.$$p || nil, $post_args, args, self = this, yielder = nil;
10994
10995        $$each.$$p = null;
10996        $post_args = $slice(arguments);
10997        args = $post_args;
10998        yielder = $send($$('Yielder'), 'new', [], block.$to_proc());
10999
11000        try {
11001          args.unshift(yielder);
11002
11003          Opal.yieldX(self.block, args);
11004        }
11005        catch (e) {
11006          if (e && e.$thrower_type == "breaker") {
11007            return e.$v;
11008          }
11009          else {
11010            throw e;
11011          }
11012        }
11013        return self;
11014      }, -1);
11015    })($nesting[0], null, $nesting)
11016  })($nesting[0], null, $nesting)
11017};
11018
11019Opal.modules["corelib/enumerator/lazy"] = function(Opal) {/* Generated by Opal 1.7.3 */
11020  var $truthy = Opal.truthy, $coerce_to = Opal.coerce_to, $yield1 = Opal.yield1, $yieldX = Opal.yieldX, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $slice = Opal.slice, $send2 = Opal.send2, $find_super = Opal.find_super, $to_a = Opal.to_a, $defs = Opal.defs, $Kernel = Opal.Kernel, $send = Opal.send, $def = Opal.def, $return_self = Opal.return_self, $Opal = Opal.Opal, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $rb_plus = Opal.rb_plus, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
11021
11022  Opal.add_stubs('raise,each,new,enumerator_size,yield,respond_to?,try_convert,<,===,+,for,class,to_proc,destructure,inspect,to_a,find_all,collect_concat,collect,enum_for');
11023  return (function($base, $super, $parent_nesting) {
11024    var self = $klass($base, $super, 'Enumerator');
11025
11026    var $nesting = [self].concat($parent_nesting);
11027
11028    return (function($base, $super, $parent_nesting) {
11029      var self = $klass($base, $super, 'Lazy');
11030
11031      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
11032
11033      $proto.enumerator = nil;
11034
11035      $klass(self, $$$('Exception'), 'StopLazyError');
11036      $defs(self, '$for', function $Lazy_for$1(object, $a) {
11037        var $post_args, $fwd_rest, $yield = $Lazy_for$1.$$p || nil, self = this, lazy = nil;
11038
11039        $Lazy_for$1.$$p = null;
11040
11041        $post_args = $slice(arguments, 1);
11042        $fwd_rest = $post_args;
11043        lazy = $send2(self, $find_super(self, 'for', $Lazy_for$1, false, true), 'for', [object].concat($to_a($fwd_rest)), $yield);
11044        lazy.enumerator = object;
11045        return lazy;
11046      }, -2);
11047
11048      $def(self, '$initialize', function $$initialize(object, size) {
11049        var block = $$initialize.$$p || nil, self = this;
11050
11051        $$initialize.$$p = null;
11052        if (size == null) size = nil;
11053        $deny_frozen_access(self);
11054        if (!(block !== nil)) {
11055          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy new without a block");
11056        }        self.enumerator = object;
11057        return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [size], function $$2(yielder, $a){var $post_args, each_args;
11058
11059
11060          if (yielder == null) yielder = nil;
11061          $post_args = $slice(arguments, 1);
11062          each_args = $post_args;
11063          try {
11064            return $send(object, 'each', $to_a(each_args), function $$3($b){var $post_args, args;
11065
11066
11067              $post_args = $slice(arguments);
11068              args = $post_args;
11069
11070            args.unshift(yielder);
11071
11072            $yieldX(block, args);
11073          ;}, -1)
11074          } catch ($err) {
11075            if (Opal.rescue($err, [$$('StopLazyError')])) {
11076              try {
11077                return nil
11078              } finally { Opal.pop_exception(); }
11079            } else { throw $err; }
11080          }}, -2);
11081      }, -2);
11082
11083      $def(self, '$lazy', $return_self);
11084
11085      $def(self, '$collect', function $$collect() {
11086        var block = $$collect.$$p || nil, self = this;
11087
11088        $$collect.$$p = null;
11089        if (!$truthy(block)) {
11090          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy map without a block");
11091        }        return $send($$('Lazy'), 'new', [self, self.$enumerator_size()], function $$4(enum$, $a){var $post_args, args;
11092
11093
11094          if (enum$ == null) enum$ = nil;
11095          $post_args = $slice(arguments, 1);
11096          args = $post_args;
11097
11098          var value = $yieldX(block, args);
11099
11100          enum$.$yield(value);
11101}, -2);
11102      });
11103
11104      $def(self, '$collect_concat', function $$collect_concat() {
11105        var block = $$collect_concat.$$p || nil, self = this;
11106
11107        $$collect_concat.$$p = null;
11108        if (!$truthy(block)) {
11109          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy map without a block");
11110        }        return $send($$('Lazy'), 'new', [self, nil], function $$5(enum$, $a){var $post_args, args;
11111
11112
11113          if (enum$ == null) enum$ = nil;
11114          $post_args = $slice(arguments, 1);
11115          args = $post_args;
11116
11117          var value = $yieldX(block, args);
11118
11119          if ((value)['$respond_to?']("force") && (value)['$respond_to?']("each")) {
11120            $send((value), 'each', [], function $$6(v){
11121
11122            if (v == null) v = nil;
11123            return enum$.$yield(v);});
11124          }
11125          else {
11126            var array = $Opal.$try_convert(value, $$$('Array'), "to_ary");
11127
11128            if (array === nil) {
11129              enum$.$yield(value);
11130            }
11131            else {
11132              $send((value), 'each', [], function $$7(v){
11133
11134            if (v == null) v = nil;
11135            return enum$.$yield(v);});
11136            }
11137          }
11138}, -2);
11139      });
11140
11141      $def(self, '$drop', function $$drop(n) {
11142        var self = this, current_size = nil, set_size = nil, dropped = nil;
11143
11144
11145        n = $coerce_to(n, $$$('Integer'), 'to_int');
11146        if ($truthy($rb_lt(n, 0))) {
11147          $Kernel.$raise($$$('ArgumentError'), "attempt to drop negative size");
11148        }        current_size = self.$enumerator_size();
11149        set_size = ($eqeqeq($$$('Integer'), current_size) ? (($truthy($rb_lt(n, current_size)) ? (n) : (current_size))) : (current_size));
11150        dropped = 0;
11151        return $send($$('Lazy'), 'new', [self, set_size], function $$8(enum$, $a){var $post_args, args;
11152
11153
11154          if (enum$ == null) enum$ = nil;
11155          $post_args = $slice(arguments, 1);
11156          args = $post_args;
11157          if ($truthy($rb_lt(dropped, n))) {
11158            return (dropped = $rb_plus(dropped, 1))
11159          } else {
11160            return $send(enum$, 'yield', $to_a(args))
11161          }}, -2);
11162      });
11163
11164      $def(self, '$drop_while', function $$drop_while() {
11165        var block = $$drop_while.$$p || nil, self = this, succeeding = nil;
11166
11167        $$drop_while.$$p = null;
11168        if (!$truthy(block)) {
11169          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy drop_while without a block");
11170        }        succeeding = true;
11171        return $send($$('Lazy'), 'new', [self, nil], function $$9(enum$, $a){var $post_args, args;
11172
11173
11174          if (enum$ == null) enum$ = nil;
11175          $post_args = $slice(arguments, 1);
11176          args = $post_args;
11177          if ($truthy(succeeding)) {
11178
11179            var value = $yieldX(block, args);
11180
11181            if (!$truthy(value)) {
11182              succeeding = false;
11183
11184              $send(enum$, 'yield', $to_a(args));
11185            }
11186
11187          } else {
11188            return $send(enum$, 'yield', $to_a(args))
11189          }}, -2);
11190      });
11191
11192      $def(self, '$enum_for', function $$enum_for($a, $b) {
11193        var block = $$enum_for.$$p || nil, $post_args, method, args, self = this;
11194
11195        $$enum_for.$$p = null;
11196        $post_args = $slice(arguments);
11197
11198        if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each";
11199        args = $post_args;
11200        return $send(self.$class(), 'for', [self, method].concat($to_a(args)), block.$to_proc());
11201      }, -1);
11202
11203      $def(self, '$find_all', function $$find_all() {
11204        var block = $$find_all.$$p || nil, self = this;
11205
11206        $$find_all.$$p = null;
11207        if (!$truthy(block)) {
11208          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy select without a block");
11209        }        return $send($$('Lazy'), 'new', [self, nil], function $$10(enum$, $a){var $post_args, args;
11210
11211
11212          if (enum$ == null) enum$ = nil;
11213          $post_args = $slice(arguments, 1);
11214          args = $post_args;
11215
11216          var value = $yieldX(block, args);
11217
11218          if ($truthy(value)) {
11219            $send(enum$, 'yield', $to_a(args));
11220          }
11221}, -2);
11222      });
11223
11224      $def(self, '$grep', function $$grep(pattern) {
11225        var block = $$grep.$$p || nil, self = this;
11226
11227        $$grep.$$p = null;
11228        if ($truthy(block)) {
11229          return $send($$('Lazy'), 'new', [self, nil], function $$11(enum$, $a){var $post_args, args;
11230
11231
11232            if (enum$ == null) enum$ = nil;
11233            $post_args = $slice(arguments, 1);
11234            args = $post_args;
11235
11236            var param = $Opal.$destructure(args),
11237                value = pattern['$==='](param);
11238
11239            if ($truthy(value)) {
11240              value = $yield1(block, param);
11241
11242              enum$.$yield($yield1(block, param));
11243            }
11244}, -2)
11245        } else {
11246          return $send($$('Lazy'), 'new', [self, nil], function $$12(enum$, $a){var $post_args, args;
11247
11248
11249            if (enum$ == null) enum$ = nil;
11250            $post_args = $slice(arguments, 1);
11251            args = $post_args;
11252
11253            var param = $Opal.$destructure(args),
11254                value = pattern['$==='](param);
11255
11256            if ($truthy(value)) {
11257              enum$.$yield(param);
11258            }
11259}, -2)
11260        }      });
11261
11262      $def(self, '$reject', function $$reject() {
11263        var block = $$reject.$$p || nil, self = this;
11264
11265        $$reject.$$p = null;
11266        if (!$truthy(block)) {
11267          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy reject without a block");
11268        }        return $send($$('Lazy'), 'new', [self, nil], function $$13(enum$, $a){var $post_args, args;
11269
11270
11271          if (enum$ == null) enum$ = nil;
11272          $post_args = $slice(arguments, 1);
11273          args = $post_args;
11274
11275          var value = $yieldX(block, args);
11276
11277          if (!$truthy(value)) {
11278            $send(enum$, 'yield', $to_a(args));
11279          }
11280}, -2);
11281      });
11282
11283      $def(self, '$take', function $$take(n) {
11284        var self = this, current_size = nil, set_size = nil, taken = nil;
11285
11286
11287        n = $coerce_to(n, $$$('Integer'), 'to_int');
11288        if ($truthy($rb_lt(n, 0))) {
11289          $Kernel.$raise($$$('ArgumentError'), "attempt to take negative size");
11290        }        current_size = self.$enumerator_size();
11291        set_size = ($eqeqeq($$$('Integer'), current_size) ? (($truthy($rb_lt(n, current_size)) ? (n) : (current_size))) : (current_size));
11292        taken = 0;
11293        return $send($$('Lazy'), 'new', [self, set_size], function $$14(enum$, $a){var $post_args, args;
11294
11295
11296          if (enum$ == null) enum$ = nil;
11297          $post_args = $slice(arguments, 1);
11298          args = $post_args;
11299          if ($truthy($rb_lt(taken, n))) {
11300
11301            $send(enum$, 'yield', $to_a(args));
11302            return (taken = $rb_plus(taken, 1));
11303          } else {
11304            return $Kernel.$raise($$('StopLazyError'))
11305          }}, -2);
11306      });
11307
11308      $def(self, '$take_while', function $$take_while() {
11309        var block = $$take_while.$$p || nil, self = this;
11310
11311        $$take_while.$$p = null;
11312        if (!$truthy(block)) {
11313          $Kernel.$raise($$$('ArgumentError'), "tried to call lazy take_while without a block");
11314        }        return $send($$('Lazy'), 'new', [self, nil], function $$15(enum$, $a){var $post_args, args;
11315
11316
11317          if (enum$ == null) enum$ = nil;
11318          $post_args = $slice(arguments, 1);
11319          args = $post_args;
11320
11321          var value = $yieldX(block, args);
11322
11323          if ($truthy(value)) {
11324            $send(enum$, 'yield', $to_a(args));
11325          }
11326          else {
11327            $Kernel.$raise($$('StopLazyError'));
11328          }
11329}, -2);
11330      });
11331
11332      $def(self, '$inspect', function $$inspect() {
11333        var self = this;
11334
11335        return "#<" + (self.$class()) + ": " + (self.enumerator.$inspect()) + ">"
11336      });
11337      $alias(self, "force", "to_a");
11338      $alias(self, "filter", "find_all");
11339      $alias(self, "flat_map", "collect_concat");
11340      $alias(self, "map", "collect");
11341      $alias(self, "select", "find_all");
11342      return $alias(self, "to_enum", "enum_for");
11343    })(self, self, $nesting)
11344  })('::', null, $nesting)
11345};
11346
11347Opal.modules["corelib/enumerator/yielder"] = function(Opal) {/* Generated by Opal 1.7.3 */
11348  var $klass = Opal.klass, $def = Opal.def, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $nesting = [], nil = Opal.nil;
11349
11350  Opal.add_stubs('yield,proc');
11351  return (function($base, $super, $parent_nesting) {
11352    var self = $klass($base, $super, 'Enumerator');
11353
11354    var $nesting = [self].concat($parent_nesting);
11355
11356    return (function($base, $super) {
11357      var self = $klass($base, $super, 'Yielder');
11358
11359      var $proto = self.$$prototype;
11360
11361      $proto.block = nil;
11362
11363
11364      $def(self, '$initialize', function $$initialize() {
11365        var block = $$initialize.$$p || nil, self = this;
11366
11367        $$initialize.$$p = null;
11368        self.block = block;
11369        return self;
11370      });
11371
11372      $def(self, '$yield', function $Yielder_yield$1($a) {
11373        var $post_args, values, self = this;
11374
11375
11376        $post_args = $slice(arguments);
11377        values = $post_args;
11378
11379        var value = Opal.yieldX(self.block, values);
11380
11381        if (value && value.$thrower_type == "break") {
11382          throw value;
11383        }
11384
11385        return value;
11386      }, -1);
11387
11388      $def(self, '$<<', function $Yielder_$lt$lt$2(value) {
11389        var self = this;
11390
11391
11392        self.$yield(value);
11393        return self;
11394      });
11395      return $def(self, '$to_proc', function $$to_proc() {
11396        var self = this;
11397
11398        return $send(self, 'proc', [], function $$3($a){var $post_args, values, self = $$3.$$s == null ? this : $$3.$$s;
11399
11400
11401          $post_args = $slice(arguments);
11402          values = $post_args;
11403          return $send(self, 'yield', $to_a(values));}, {$$arity: -1, $$s: self})
11404      });
11405    })($nesting[0], null)
11406  })($nesting[0], null, $nesting)
11407};
11408
11409Opal.modules["corelib/enumerator"] = function(Opal) {/* Generated by Opal 1.7.3 */
11410  var $slice = Opal.slice, $coerce_to = Opal.coerce_to, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $defs = Opal.defs, $truthy = Opal.truthy, $send = Opal.send, $not = Opal.not, $def = Opal.def, $rb_plus = Opal.rb_plus, $to_a = Opal.to_a, $Opal = Opal.Opal, $send2 = Opal.send2, $find_super = Opal.find_super, $rb_ge = Opal.rb_ge, $Kernel = Opal.Kernel, $rb_le = Opal.rb_le, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
11411
11412  Opal.add_stubs('require,include,allocate,new,to_proc,!,respond_to?,empty?,nil?,+,class,__send__,call,enum_for,size,destructure,map,>=,length,raise,[],peek_values,<=,next_values,inspect,any?,each_with_object,autoload');
11413
11414  self.$require("corelib/enumerable");
11415  return (function($base, $super, $parent_nesting) {
11416    var self = $klass($base, $super, 'Enumerator');
11417
11418    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
11419
11420    $proto.size = $proto.args = $proto.object = $proto.method = $proto.values = $proto.cursor = nil;
11421
11422    self.$include($$$('Enumerable'));
11423    self.$$prototype.$$is_enumerator = true;
11424    $defs(self, '$for', function $Enumerator_for$1(object, $a, $b) {
11425      var block = $Enumerator_for$1.$$p || nil, $post_args, method, args, self = this;
11426
11427      $Enumerator_for$1.$$p = null;
11428      $post_args = $slice(arguments, 1);
11429
11430      if ($post_args.length > 0) method = $post_args.shift();if (method == null) method = "each";
11431      args = $post_args;
11432
11433      var obj = self.$allocate();
11434
11435      obj.object = object;
11436      obj.size   = block;
11437      obj.method = method;
11438      obj.args   = args;
11439      obj.cursor = 0;
11440
11441      return obj;
11442    }, -2);
11443
11444    $def(self, '$initialize', function $$initialize($a) {
11445      var block = $$initialize.$$p || nil, self = this;
11446
11447      $$initialize.$$p = null;
11448      $slice(arguments);
11449      $deny_frozen_access(self);
11450      self.cursor = 0;
11451      if ($truthy(block)) {
11452
11453        self.object = $send($$('Generator'), 'new', [], block.$to_proc());
11454        self.method = "each";
11455        self.args = [];
11456        self.size = arguments[0] || nil;
11457        if (($truthy(self.size) && ($not(self.size['$respond_to?']("call"))))) {
11458          return (self.size = $coerce_to(self.size, $$$('Integer'), 'to_int'))
11459        } else {
11460          return nil
11461        }      } else {
11462
11463        self.object = arguments[0];
11464        self.method = arguments[1] || "each";
11465        self.args = $slice(arguments, 2);
11466        return (self.size = nil);
11467      }    }, -1);
11468
11469    $def(self, '$each', function $$each($a) {
11470      var block = $$each.$$p || nil, $post_args, args, self = this;
11471
11472      $$each.$$p = null;
11473      $post_args = $slice(arguments);
11474      args = $post_args;
11475      if (($truthy(block['$nil?']()) && ($truthy(args['$empty?']())))) {
11476        return self
11477      }      args = $rb_plus(self.args, args);
11478      if ($truthy(block['$nil?']())) {
11479        return $send(self.$class(), 'new', [self.object, self.method].concat($to_a(args)))
11480      }      return $send(self.object, '__send__', [self.method].concat($to_a(args)), block.$to_proc());
11481    }, -1);
11482
11483    $def(self, '$size', function $$size() {
11484      var self = this;
11485
11486      if ($truthy(self.size['$respond_to?']("call"))) {
11487        return $send(self.size, 'call', $to_a(self.args))
11488      } else {
11489        return self.size
11490      }
11491    });
11492
11493    $def(self, '$with_index', function $$with_index(offset) {
11494      var block = $$with_index.$$p || nil, self = this;
11495
11496      $$with_index.$$p = null;
11497      if (offset == null) offset = 0;
11498      offset = ($truthy(offset) ? ($coerce_to(offset, $$$('Integer'), 'to_int')) : (0));
11499      if (!$truthy(block)) {
11500        return $send(self, 'enum_for', ["with_index", offset], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s;
11501
11502          return self.$size()}, {$$s: self})
11503      }
11504      var index = offset;
11505
11506      self.$each.$$p = function() {
11507        var param = $Opal.$destructure(arguments),
11508            value = block(param, index);
11509
11510        index++;
11511
11512        return value;
11513      };
11514
11515      return self.$each();
11516    }, -1);
11517
11518    $def(self, '$each_with_index', function $$each_with_index() {
11519      var block = $$each_with_index.$$p || nil, self = this;
11520
11521      $$each_with_index.$$p = null;
11522      if (!(block !== nil)) {
11523        return $send(self, 'enum_for', ["each_with_index"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s;
11524
11525          return self.$size()}, {$$s: self})
11526      }      $send2(self, $find_super(self, 'each_with_index', $$each_with_index, false, true), 'each_with_index', [], block);
11527      return self.object;
11528    });
11529
11530    $def(self, '$rewind', function $$rewind() {
11531      var self = this;
11532
11533
11534      self.cursor = 0;
11535      return self;
11536    });
11537
11538    $def(self, '$peek_values', function $$peek_values() {
11539      var self = this, $ret_or_1 = nil;
11540
11541
11542      self.values = ($truthy(($ret_or_1 = self.values)) ? ($ret_or_1) : ($send(self, 'map', [], function $$4($a){var $post_args, i;
11543
11544
11545        $post_args = $slice(arguments);
11546        i = $post_args;
11547        return i;}, -1)));
11548      if ($truthy($rb_ge(self.cursor, self.values.$length()))) {
11549        $Kernel.$raise($$$('StopIteration'), "iteration reached an end");
11550      }      return self.values['$[]'](self.cursor);
11551    });
11552
11553    $def(self, '$peek', function $$peek() {
11554      var self = this, values = nil;
11555
11556
11557      values = self.$peek_values();
11558      if ($truthy($rb_le(values.$length(), 1))) {
11559        return values['$[]'](0)
11560      } else {
11561        return values
11562      }    });
11563
11564    $def(self, '$next_values', function $$next_values() {
11565      var self = this, out = nil;
11566
11567
11568      out = self.$peek_values();
11569      self.cursor = $rb_plus(self.cursor, 1);
11570      return out;
11571    });
11572
11573    $def(self, '$next', function $$next() {
11574      var self = this, values = nil;
11575
11576
11577      values = self.$next_values();
11578      if ($truthy($rb_le(values.$length(), 1))) {
11579        return values['$[]'](0)
11580      } else {
11581        return values
11582      }    });
11583
11584    $def(self, '$feed', function $$feed(arg) {
11585      var self = this;
11586
11587      return self.$raise($$('NotImplementedError'), "Opal doesn't support Enumerator#feed")
11588    });
11589
11590    $def(self, '$+', function $Enumerator_$plus$5(other) {
11591      var self = this;
11592
11593      return $$$($$$('Enumerator'), 'Chain').$new(self, other)
11594    });
11595
11596    $def(self, '$inspect', function $$inspect() {
11597      var self = this, result = nil;
11598
11599
11600      result = "#<" + (self.$class()) + ": " + (self.object.$inspect()) + ":" + (self.method);
11601      if ($truthy(self.args['$any?']())) {
11602        result = $rb_plus(result, "(" + (self.args.$inspect()['$[]']($$$('Range').$new(1, -2))) + ")");
11603      }      return $rb_plus(result, ">");
11604    });
11605    $alias(self, "with_object", "each_with_object");
11606    self.$autoload("ArithmeticSequence", "corelib/enumerator/arithmetic_sequence");
11607    self.$autoload("Chain", "corelib/enumerator/chain");
11608    self.$autoload("Generator", "corelib/enumerator/generator");
11609    self.$autoload("Lazy", "corelib/enumerator/lazy");
11610    return self.$autoload("Yielder", "corelib/enumerator/yielder");
11611  })('::', null, $nesting);
11612};
11613
11614Opal.modules["corelib/numeric"] = function(Opal) {/* Generated by Opal 1.7.3 */
11615  var $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $to_ary = Opal.to_ary, $return_self = Opal.return_self, $rb_minus = Opal.rb_minus, $rb_times = Opal.rb_times, $rb_lt = Opal.rb_lt, $eqeq = Opal.eqeq, $rb_divide = Opal.rb_divide, $return_val = Opal.return_val, $Opal = Opal.Opal, $slice = Opal.slice, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $not = Opal.not, $send = Opal.send, $rb_ge = Opal.rb_ge, $rb_le = Opal.rb_le, $rb_plus = Opal.rb_plus, $rb_gt = Opal.rb_gt, $alias = Opal.alias, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$;
11616
11617  Opal.add_stubs('require,include,instance_of?,class,Float,respond_to?,coerce,__send__,raise,equal?,-,*,div,<,-@,ceil,to_f,denominator,to_r,==,floor,/,%,Complex,zero?,numerator,abs,arg,coerce_to!,round,<=>,compare,is_a?,!,new,enum_for,to_proc,negative?,>=,<=,+,to_i,truncate,>,angle,conj,imag,rect');
11618
11619  self.$require("corelib/comparable");
11620  return (function($base, $super) {
11621    var self = $klass($base, $super, 'Numeric');
11622
11623
11624
11625    self.$include($$$('Comparable'));
11626
11627    $def(self, '$coerce', function $$coerce(other) {
11628      var self = this;
11629
11630
11631      if ($truthy(other['$instance_of?'](self.$class()))) {
11632        return [other, self]
11633      }      return [$Kernel.$Float(other), $Kernel.$Float(self)];
11634    });
11635
11636    $def(self, '$__coerced__', function $$__coerced__(method, other) {
11637      var $a, $b, self = this, a = nil, b = nil;
11638
11639      if ($truthy(other['$respond_to?']("coerce"))) {
11640
11641        $b = other.$coerce(self), $a = $to_ary($b), (a = ($a[0] == null ? nil : $a[0])), (b = ($a[1] == null ? nil : $a[1]));
11642        return a.$__send__(method, b);
11643      } else
11644      switch (method) {
11645        case "+":
11646        case "-":
11647        case "*":
11648        case "/":
11649        case "%":
11650        case "&":
11651        case "|":
11652        case "^":
11653        case "**":
11654          return $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Numeric")
11655        case ">":
11656        case ">=":
11657        case "<":
11658        case "<=":
11659        case "<=>":
11660          return $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (other.$class()) + " failed")
11661        default:
11662          return nil
11663      }
11664    });
11665
11666    $def(self, '$<=>', function $Numeric_$lt_eq_gt$1(other) {
11667      var self = this;
11668
11669
11670      if ($truthy(self['$equal?'](other))) {
11671        return 0
11672      }      return nil;
11673    });
11674
11675    $def(self, '$+@', $return_self);
11676
11677    $def(self, '$-@', function $Numeric_$minus$$2() {
11678      var self = this;
11679
11680      return $rb_minus(0, self)
11681    });
11682
11683    $def(self, '$%', function $Numeric_$percent$3(other) {
11684      var self = this;
11685
11686      return $rb_minus(self, $rb_times(other, self.$div(other)))
11687    });
11688
11689    $def(self, '$abs', function $$abs() {
11690      var self = this;
11691
11692      if ($rb_lt(self, 0)) {
11693        return self['$-@']()
11694      } else {
11695        return self
11696      }
11697    });
11698
11699    $def(self, '$abs2', function $$abs2() {
11700      var self = this;
11701
11702      return $rb_times(self, self)
11703    });
11704
11705    $def(self, '$angle', function $$angle() {
11706      var self = this;
11707
11708      if ($rb_lt(self, 0)) {
11709        return $$$($$$('Math'), 'PI')
11710      } else {
11711        return 0
11712      }
11713    });
11714
11715    $def(self, '$ceil', function $$ceil(ndigits) {
11716      var self = this;
11717
11718
11719      if (ndigits == null) ndigits = 0;
11720      return self.$to_f().$ceil(ndigits);
11721    }, -1);
11722
11723    $def(self, '$conj', $return_self);
11724
11725    $def(self, '$denominator', function $$denominator() {
11726      var self = this;
11727
11728      return self.$to_r().$denominator()
11729    });
11730
11731    $def(self, '$div', function $$div(other) {
11732      var self = this;
11733
11734
11735      if ($eqeq(other, 0)) {
11736        $Kernel.$raise($$$('ZeroDivisionError'), "divided by o");
11737      }      return $rb_divide(self, other).$floor();
11738    });
11739
11740    $def(self, '$divmod', function $$divmod(other) {
11741      var self = this;
11742
11743      return [self.$div(other), self['$%'](other)]
11744    });
11745
11746    $def(self, '$fdiv', function $$fdiv(other) {
11747      var self = this;
11748
11749      return $rb_divide(self.$to_f(), other)
11750    });
11751
11752    $def(self, '$floor', function $$floor(ndigits) {
11753      var self = this;
11754
11755
11756      if (ndigits == null) ndigits = 0;
11757      return self.$to_f().$floor(ndigits);
11758    }, -1);
11759
11760    $def(self, '$i', function $$i() {
11761      var self = this;
11762
11763      return $Kernel.$Complex(0, self)
11764    });
11765
11766    $def(self, '$imag', $return_val(0));
11767
11768    $def(self, '$integer?', $return_val(false));
11769
11770    $def(self, '$nonzero?', function $Numeric_nonzero$ques$4() {
11771      var self = this;
11772
11773      if ($truthy(self['$zero?']())) {
11774        return nil
11775      } else {
11776        return self
11777      }
11778    });
11779
11780    $def(self, '$numerator', function $$numerator() {
11781      var self = this;
11782
11783      return self.$to_r().$numerator()
11784    });
11785
11786    $def(self, '$polar', function $$polar() {
11787      var self = this;
11788
11789      return [self.$abs(), self.$arg()]
11790    });
11791
11792    $def(self, '$quo', function $$quo(other) {
11793      var self = this;
11794
11795      return $rb_divide($Opal['$coerce_to!'](self, $$$('Rational'), "to_r"), other)
11796    });
11797
11798    $def(self, '$real', $return_self);
11799
11800    $def(self, '$real?', $return_val(true));
11801
11802    $def(self, '$rect', function $$rect() {
11803      var self = this;
11804
11805      return [self, 0]
11806    });
11807
11808    $def(self, '$round', function $$round(digits) {
11809      var self = this;
11810      return self.$to_f().$round(digits);
11811    }, -1);
11812
11813    $def(self, '$step', function $$step($a, $b, $c) {
11814      var block = $$step.$$p || nil, $post_args, $kwargs, limit, step, to, by, self = this, counter = nil;
11815
11816      $$step.$$p = null;
11817      $post_args = $slice(arguments);
11818      $kwargs = $extract_kwargs($post_args);
11819      $kwargs = $ensure_kwargs($kwargs);
11820
11821      if ($post_args.length > 0) limit = $post_args.shift();
11822      if ($post_args.length > 0) step = $post_args.shift();
11823      to = $kwargs.$$smap["to"];
11824      by = $kwargs.$$smap["by"];
11825      if (limit !== undefined && to !== undefined) {
11826        $Kernel.$raise($$$('ArgumentError'), "to is given twice");
11827      }
11828
11829      if (step !== undefined && by !== undefined) {
11830        $Kernel.$raise($$$('ArgumentError'), "step is given twice");
11831      }
11832
11833      if (to !== undefined) {
11834        limit = to;
11835      }
11836
11837      if (by !== undefined) {
11838        step = by;
11839      }
11840
11841      if (limit === undefined) {
11842        limit = nil;
11843      }
11844
11845      function validateParameters() {
11846        if (step === nil) {
11847          $Kernel.$raise($$$('TypeError'), "step must be numeric");
11848        }
11849
11850        if (step != null && step['$=='](0)) {
11851          $Kernel.$raise($$$('ArgumentError'), "step can't be 0");
11852        }
11853
11854        if (step === nil || step == null) {
11855          step = 1;
11856        }
11857
11858        var sign = step['$<=>'](0);
11859
11860        if (sign === nil) {
11861          $Kernel.$raise($$$('ArgumentError'), "0 can't be coerced into " + (step.$class()));
11862        }
11863
11864        if (limit === nil || limit == null) {
11865          limit = sign > 0 ? $$$($$$('Float'), 'INFINITY') : $$$($$$('Float'), 'INFINITY')['$-@']();
11866        }
11867
11868        $Opal.$compare(self, limit);
11869      }
11870
11871      function stepFloatSize() {
11872        if ((step > 0 && self > limit) || (step < 0 && self < limit)) {
11873          return 0;
11874        } else if (step === Infinity || step === -Infinity) {
11875          return 1;
11876        } else {
11877          var abs = Math.abs, floor = Math.floor,
11878              err = (abs(self) + abs(limit) + abs(limit - self)) / abs(step) * $$$($$$('Float'), 'EPSILON');
11879
11880          if (err === Infinity || err === -Infinity) {
11881            return 0;
11882          } else {
11883            if (err > 0.5) {
11884              err = 0.5;
11885            }
11886
11887            return floor((limit - self) / step + err) + 1
11888          }
11889        }
11890      }
11891
11892      function stepSize() {
11893        validateParameters();
11894
11895        if (step === 0) {
11896          return Infinity;
11897        }
11898
11899        if (step % 1 !== 0) {
11900          return stepFloatSize();
11901        } else if ((step > 0 && self > limit) || (step < 0 && self < limit)) {
11902          return 0;
11903        } else {
11904          var ceil = Math.ceil, abs = Math.abs,
11905              lhs = abs(self - limit) + 1,
11906              rhs = abs(step);
11907
11908          return ceil(lhs / rhs);
11909        }
11910      }
11911      if (!(block !== nil)) {
11912        if ((($not(limit) || ($truthy(limit['$is_a?']($$$('Numeric'))))) && (($not(step) || ($truthy(step['$is_a?']($$$('Numeric')))))))) {
11913          return $$$($$$('Enumerator'), 'ArithmeticSequence').$new([limit, step, ($truthy(to) ? ("to: ") : nil), ($truthy(by) ? ("by: ") : nil)], self)
11914        } else {
11915          return $send(self, 'enum_for', ["step", limit, step], (stepSize).$to_proc())
11916        }
11917      }
11918      validateParameters();
11919
11920      var isDesc = step['$negative?'](),
11921          isInf = step['$=='](0) ||
11922                  (limit === Infinity && !isDesc) ||
11923                  (limit === -Infinity && isDesc);
11924
11925      if (self.$$is_number && step.$$is_number && limit.$$is_number) {
11926        if (self % 1 === 0 && (isInf || limit % 1 === 0) && step % 1 === 0) {
11927          var value = self;
11928
11929          if (isInf) {
11930            for (;; value += step) {
11931              block(value);
11932            }
11933          } else if (isDesc) {
11934            for (; value >= limit; value += step) {
11935              block(value);
11936            }
11937          } else {
11938            for (; value <= limit; value += step) {
11939              block(value);
11940            }
11941          }
11942
11943          return self;
11944        } else {
11945          var begin = self.$to_f().valueOf();
11946          step = step.$to_f().valueOf();
11947          limit = limit.$to_f().valueOf();
11948
11949          var n = stepFloatSize();
11950
11951          if (!isFinite(step)) {
11952            if (n !== 0) block(begin);
11953          } else if (step === 0) {
11954            while (true) {
11955              block(begin);
11956            }
11957          } else {
11958            for (var i = 0; i < n; i++) {
11959              var d = i * step + self;
11960              if (step >= 0 ? limit < d : limit > d) {
11961                d = limit;
11962              }
11963              block(d);
11964            }
11965          }
11966
11967          return self;
11968        }
11969      }
11970      counter = self;
11971      while ($truthy(isDesc ? $rb_ge(counter, limit) : $rb_le(counter, limit))) {
11972
11973        Opal.yield1(block, counter);
11974        counter = $rb_plus(counter, step);
11975      }    }, -1);
11976
11977    $def(self, '$to_c', function $$to_c() {
11978      var self = this;
11979
11980      return $Kernel.$Complex(self, 0)
11981    });
11982
11983    $def(self, '$to_int', function $$to_int() {
11984      var self = this;
11985
11986      return self.$to_i()
11987    });
11988
11989    $def(self, '$truncate', function $$truncate(ndigits) {
11990      var self = this;
11991
11992
11993      if (ndigits == null) ndigits = 0;
11994      return self.$to_f().$truncate(ndigits);
11995    }, -1);
11996
11997    $def(self, '$zero?', function $Numeric_zero$ques$5() {
11998      var self = this;
11999
12000      return self['$=='](0)
12001    });
12002
12003    $def(self, '$positive?', function $Numeric_positive$ques$6() {
12004      var self = this;
12005
12006      return $rb_gt(self, 0)
12007    });
12008
12009    $def(self, '$negative?', function $Numeric_negative$ques$7() {
12010      var self = this;
12011
12012      return $rb_lt(self, 0)
12013    });
12014
12015    $def(self, '$dup', $return_self);
12016
12017    $def(self, '$clone', function $$clone($kwargs) {
12018      var self = this;
12019
12020
12021      $kwargs = $ensure_kwargs($kwargs);
12022
12023      $kwargs.$$smap["freeze"];      return self;
12024    }, -1);
12025
12026    $def(self, '$finite?', $return_val(true));
12027
12028    $def(self, '$infinite?', $return_val(nil));
12029    $alias(self, "arg", "angle");
12030    $alias(self, "conjugate", "conj");
12031    $alias(self, "imaginary", "imag");
12032    $alias(self, "magnitude", "abs");
12033    $alias(self, "modulo", "%");
12034    $alias(self, "phase", "arg");
12035    return $alias(self, "rectangular", "rect");
12036  })('::', null);
12037};
12038
12039Opal.modules["corelib/array"] = function(Opal) {/* Generated by Opal 1.7.3 */
12040  var $truthy = Opal.truthy, $falsy = Opal.falsy, $hash_ids = Opal.hash_ids, $yield1 = Opal.yield1, $hash_get = Opal.hash_get, $hash_put = Opal.hash_put, $hash_delete = Opal.hash_delete, $coerce_to = Opal.coerce_to, $respond_to = Opal.respond_to, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $Kernel = Opal.Kernel, $def = Opal.def, $Opal = Opal.Opal, $eqeqeq = Opal.eqeqeq, $hash2 = Opal.hash2, $send2 = Opal.send2, $find_super = Opal.find_super, $send = Opal.send, $rb_gt = Opal.rb_gt, $rb_times = Opal.rb_times, $eqeq = Opal.eqeq, $rb_minus = Opal.rb_minus, $to_a = Opal.to_a, $to_ary = Opal.to_ary, $gvars = Opal.gvars, $rb_ge = Opal.rb_ge, $assign_ivar = Opal.assign_ivar, $rb_lt = Opal.rb_lt, $return_self = Opal.return_self, $neqeq = Opal.neqeq, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
12041
12042  Opal.add_stubs('require,include,to_a,warn,raise,replace,respond_to?,to_ary,coerce_to?,===,join,to_str,hash,<=>,==,object_id,inspect,enum_for,class,bsearch_index,to_proc,nil?,coerce_to!,>,*,enumerator_size,empty?,size,map,equal?,dup,each,reduce,-,[],dig,eql?,length,exclude_end?,flatten,frozen?,__id__,&,!,intersection,to_s,new,item,max,min,>=,**,delete_if,reverse,rotate,rand,at,keep_if,shuffle!,<,sort,sort_by,!=,times,[]=,<<,uniq,|,values,is_a?,end,begin,upto,reject,push,select,select!,collect,collect!,unshift,pristine,singleton_class');
12043
12044  self.$require("corelib/enumerable");
12045  self.$require("corelib/numeric");
12046  return (function($base, $super, $parent_nesting) {
12047    var self = $klass($base, $super, 'Array');
12048
12049    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
12050
12051
12052    self.$include($$$('Enumerable'));
12053    Opal.prop(self.$$prototype, '$$is_array', true);
12054
12055    // Recent versions of V8 (> 7.1) only use an optimized implementation when Array.prototype is unmodified.
12056    // For instance, "array-splice.tq" has a "fast path" (ExtractFastJSArray, defined in "src/codegen/code-stub-assembler.cc")
12057    // but it's only enabled when "IsPrototypeInitialArrayPrototype()" is true.
12058    //
12059    // Older versions of V8 were using relatively fast JS-with-extensions code even when Array.prototype is modified:
12060    // https://github.com/v8/v8/blob/7.0.1/src/js/array.js#L599-L642
12061    //
12062    // In short, Array operations are slow in recent versions of V8 when the Array.prototype has been tampered.
12063    // So, when possible, we are using faster open-coded version to boost the performance.
12064
12065    // As of V8 8.4, depending on the size of the array, this is up to ~25x times faster than Array#shift()
12066    // Implementation is heavily inspired by: https://github.com/nodejs/node/blob/ba684805b6c0eded76e5cd89ee00328ac7a59365/lib/internal/util.js#L341-L347
12067    function shiftNoArg(list) {
12068      var r = list[0];
12069      var index = 1;
12070      var length = list.length;
12071      for (; index < length; index++) {
12072        list[index - 1] = list[index];
12073      }
12074      list.pop();
12075      return r;
12076    }
12077
12078    function toArraySubclass(obj, klass) {
12079      if (klass.$$name === Opal.Array) {
12080        return obj;
12081      } else {
12082        return klass.$allocate().$replace((obj).$to_a());
12083      }
12084    }
12085
12086    // A helper for keep_if and delete_if, filter is either Opal.truthy
12087    // or Opal.falsy.
12088    function filterIf(self, filter, block) {
12089      var value, raised = null, updated = new Array(self.length);
12090
12091      for (var i = 0, i2 = 0, length = self.length; i < length; i++) {
12092        if (!raised) {
12093          try {
12094            value = $yield1(block, self[i]);
12095          } catch(error) {
12096            raised = error;
12097          }
12098        }
12099
12100        if (raised || filter(value)) {
12101          updated[i2] = self[i];
12102          i2 += 1;
12103        }
12104      }
12105
12106      if (i2 !== i) {
12107        self.splice.apply(self, [0, updated.length].concat(updated));
12108        self.splice(i2, updated.length);
12109      }
12110
12111      if (raised) throw raised;
12112    }
12113    $defs(self, '$[]', function $Array_$$$1($a) {
12114      var $post_args, objects, self = this;
12115
12116
12117      $post_args = $slice(arguments);
12118      objects = $post_args;
12119      return toArraySubclass(objects, self);    }, -1);
12120
12121    $def(self, '$initialize', function $$initialize(size, obj) {
12122      var block = $$initialize.$$p || nil, self = this;
12123
12124      $$initialize.$$p = null;
12125      if (size == null) size = nil;
12126      if (obj == null) obj = nil;
12127
12128      $deny_frozen_access(self);
12129
12130      if (obj !== nil && block !== nil) {
12131        $Kernel.$warn("warning: block supersedes default value argument");
12132      }
12133
12134      if (size > $$$($$$('Integer'), 'MAX')) {
12135        $Kernel.$raise($$$('ArgumentError'), "array size too big");
12136      }
12137
12138      if (arguments.length > 2) {
12139        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..2)");
12140      }
12141
12142      if (arguments.length === 0) {
12143        self.splice(0, self.length);
12144        return self;
12145      }
12146
12147      if (arguments.length === 1) {
12148        if (size.$$is_array) {
12149          self.$replace(size.$to_a());
12150          return self;
12151        } else if (size['$respond_to?']("to_ary")) {
12152          self.$replace(size.$to_ary());
12153          return self;
12154        }
12155      }
12156
12157      size = $coerce_to(size, $$$('Integer'), 'to_int');
12158
12159      if (size < 0) {
12160        $Kernel.$raise($$$('ArgumentError'), "negative array size");
12161      }
12162
12163      self.splice(0, self.length);
12164      var i, value;
12165
12166      if (block === nil) {
12167        for (i = 0; i < size; i++) {
12168          self.push(obj);
12169        }
12170      }
12171      else {
12172        for (i = 0, value; i < size; i++) {
12173          value = block(i);
12174          self[i] = value;
12175        }
12176      }
12177
12178      return self;
12179    }, -1);
12180    $defs(self, '$try_convert', function $$try_convert(obj) {
12181
12182      return $Opal['$coerce_to?'](obj, $$$('Array'), "to_ary")
12183    });
12184
12185    $def(self, '$&', function $Array_$$2(other) {
12186      var self = this;
12187
12188
12189      other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
12190
12191      var result = [], hash = $hash2([], {}), i, length, item;
12192
12193      for (i = 0, length = other.length; i < length; i++) {
12194        $hash_put(hash, other[i], true);
12195      }
12196
12197      for (i = 0, length = self.length; i < length; i++) {
12198        item = self[i];
12199        if ($hash_delete(hash, item) !== undefined) {
12200          result.push(item);
12201        }
12202      }
12203
12204      return result;
12205    });
12206
12207    $def(self, '$|', function $Array_$$3(other) {
12208      var self = this;
12209
12210
12211      other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
12212
12213      var hash = $hash2([], {}), i, length;
12214
12215      for (i = 0, length = self.length; i < length; i++) {
12216        $hash_put(hash, self[i], true);
12217      }
12218
12219      for (i = 0, length = other.length; i < length; i++) {
12220        $hash_put(hash, other[i], true);
12221      }
12222
12223      return hash.$keys();
12224    });
12225
12226    $def(self, '$*', function $Array_$$4(other) {
12227      var self = this;
12228
12229
12230      if ($truthy(other['$respond_to?']("to_str"))) {
12231        return self.$join(other.$to_str())
12232      }      other = $coerce_to(other, $$$('Integer'), 'to_int');
12233      if ($truthy(other < 0)) {
12234        $Kernel.$raise($$$('ArgumentError'), "negative argument");
12235      }
12236      var result = [],
12237          converted = self.$to_a();
12238
12239      for (var i = 0; i < other; i++) {
12240        result = result.concat(converted);
12241      }
12242
12243      return result;
12244    });
12245
12246    $def(self, '$+', function $Array_$plus$5(other) {
12247      var self = this;
12248
12249
12250      other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
12251      return self.concat(other);    });
12252
12253    $def(self, '$-', function $Array_$minus$6(other) {
12254      var self = this;
12255
12256
12257      other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
12258      if ($truthy(self.length === 0)) {
12259        return []
12260      }      if ($truthy(other.length === 0)) {
12261        return self.slice()
12262      }
12263      var result = [], hash = $hash2([], {}), i, length, item;
12264
12265      for (i = 0, length = other.length; i < length; i++) {
12266        $hash_put(hash, other[i], true);
12267      }
12268
12269      for (i = 0, length = self.length; i < length; i++) {
12270        item = self[i];
12271        if ($hash_get(hash, item) === undefined) {
12272          result.push(item);
12273        }
12274      }
12275
12276      return result;
12277    });
12278
12279    $def(self, '$<<', function $Array_$lt$lt$7(object) {
12280      var self = this;
12281
12282
12283      $deny_frozen_access(self);
12284      self.push(object);
12285      return self;
12286    });
12287
12288    $def(self, '$<=>', function $Array_$lt_eq_gt$8(other) {
12289      var self = this;
12290
12291
12292      if ($eqeqeq($$$('Array'), other)) {
12293        other = other.$to_a();
12294      } else if ($truthy(other['$respond_to?']("to_ary"))) {
12295        other = other.$to_ary().$to_a();
12296      } else {
12297        return nil
12298      }
12299      if (self.$hash() === other.$hash()) {
12300        return 0;
12301      }
12302
12303      var count = Math.min(self.length, other.length);
12304
12305      for (var i = 0; i < count; i++) {
12306        var tmp = (self[i])['$<=>'](other[i]);
12307
12308        if (tmp !== 0) {
12309          return tmp;
12310        }
12311      }
12312
12313      return (self.length)['$<=>'](other.length);
12314    });
12315
12316    $def(self, '$==', function $Array_$eq_eq$9(other) {
12317      var self = this;
12318
12319
12320      var recursed = {};
12321
12322      function _eqeq(array, other) {
12323        var i, length, a, b;
12324
12325        if (array === other)
12326          return true;
12327
12328        if (!other.$$is_array) {
12329          if ($respond_to(other, '$to_ary')) {
12330            return (other)['$=='](array);
12331          } else {
12332            return false;
12333          }
12334        }
12335
12336        if (array.$$constructor !== Array)
12337          array = (array).$to_a();
12338        if (other.$$constructor !== Array)
12339          other = (other).$to_a();
12340
12341        if (array.length !== other.length) {
12342          return false;
12343        }
12344
12345        recursed[(array).$object_id()] = true;
12346
12347        for (i = 0, length = array.length; i < length; i++) {
12348          a = array[i];
12349          b = other[i];
12350          if (a.$$is_array) {
12351            if (b.$$is_array && b.length !== a.length) {
12352              return false;
12353            }
12354            if (!recursed.hasOwnProperty((a).$object_id())) {
12355              if (!_eqeq(a, b)) {
12356                return false;
12357              }
12358            }
12359          } else {
12360            if (!(a)['$=='](b)) {
12361              return false;
12362            }
12363          }
12364        }
12365
12366        return true;
12367      }
12368
12369      return _eqeq(self, other);
12370
12371    });
12372
12373    function $array_slice_range(self, index) {
12374      var size = self.length,
12375          exclude, from, to, result;
12376
12377      exclude = index.excl;
12378      from    = index.begin === nil ? 0 : $coerce_to(index.begin, Opal.Integer, 'to_int');
12379      to      = index.end === nil ? -1 : $coerce_to(index.end, Opal.Integer, 'to_int');
12380
12381      if (from < 0) {
12382        from += size;
12383
12384        if (from < 0) {
12385          return nil;
12386        }
12387      }
12388
12389      if (index.excl_rev && index.begin !== nil) {
12390        from += 1;
12391      }
12392
12393      if (from > size) {
12394        return nil;
12395      }
12396
12397      if (to < 0) {
12398        to += size;
12399
12400        if (to < 0) {
12401          return [];
12402        }
12403      }
12404
12405      if (!exclude || index.end === nil) {
12406        to += 1;
12407      }
12408
12409      result = self.slice(from, to);
12410      return result;
12411    }
12412
12413    function $array_slice_arithmetic_seq(self, index) {
12414      var array, out = [], i = 0, pseudorange;
12415
12416      if (index.step < 0) {
12417        pseudorange = {
12418          begin: index.range.end,
12419          end: index.range.begin,
12420          excl: false,
12421          excl_rev: index.range.excl
12422        };
12423        array = $array_slice_range(self, pseudorange).$reverse();
12424      }
12425      else {
12426        array = $array_slice_range(self, index.range);
12427      }
12428
12429      while (i < array.length) {
12430        out.push(array[i]);
12431        i += Math.abs(index.step);
12432      }
12433
12434      return out;
12435    }
12436
12437    function $array_slice_index_length(self, index, length) {
12438      var size = self.length,
12439          result;
12440
12441      index = $coerce_to(index, Opal.Integer, 'to_int');
12442
12443      if (index < 0) {
12444        index += size;
12445
12446        if (index < 0) {
12447          return nil;
12448        }
12449      }
12450
12451      if (length === undefined) {
12452        if (index >= size || index < 0) {
12453          return nil;
12454        }
12455
12456        return self[index];
12457      }
12458      else {
12459        length = $coerce_to(length, Opal.Integer, 'to_int');
12460
12461        if (length < 0 || index > size || index < 0) {
12462          return nil;
12463        }
12464
12465        result = self.slice(index, index + length);
12466      }
12467      return result;
12468    }
12469
12470    $def(self, '$[]', function $Array_$$$10(index, length) {
12471      var self = this;
12472
12473      if (index.$$is_range) {
12474        return $array_slice_range(self, index);
12475      }
12476      else if (index.$$is_arithmetic_seq) {
12477        return $array_slice_arithmetic_seq(self, index);
12478      }
12479      else {
12480        return $array_slice_index_length(self, index, length);
12481      }
12482    }, -2);
12483
12484    $def(self, '$[]=', function $Array_$$$eq$11(index, value, extra) {
12485      var self = this, data = nil, length = nil;
12486      $deny_frozen_access(self);
12487      data = nil;
12488
12489      var i, size = self.length;
12490
12491      if (index.$$is_range) {
12492        if (value.$$is_array)
12493          data = value.$to_a();
12494        else if (value['$respond_to?']("to_ary"))
12495          data = value.$to_ary().$to_a();
12496        else
12497          data = [value];
12498
12499        var exclude = index.excl,
12500            from    = index.begin === nil ? 0 : $coerce_to(index.begin, Opal.Integer, 'to_int'),
12501            to      = index.end === nil ? -1 : $coerce_to(index.end, Opal.Integer, 'to_int');
12502
12503        if (from < 0) {
12504          from += size;
12505
12506          if (from < 0) {
12507            $Kernel.$raise($$$('RangeError'), "" + (index.$inspect()) + " out of range");
12508          }
12509        }
12510
12511        if (to < 0) {
12512          to += size;
12513        }
12514
12515        if (!exclude || index.end === nil) {
12516          to += 1;
12517        }
12518
12519        if (from > size) {
12520          for (i = size; i < from; i++) {
12521            self[i] = nil;
12522          }
12523        }
12524
12525        if (to < 0) {
12526          self.splice.apply(self, [from, 0].concat(data));
12527        }
12528        else {
12529          self.splice.apply(self, [from, to - from].concat(data));
12530        }
12531
12532        return value;
12533      } else {
12534        if (extra === undefined) {
12535          (length = 1);
12536        } else {
12537          length = value;
12538          value  = extra;
12539
12540          if (value.$$is_array)
12541            data = value.$to_a();
12542          else if (value['$respond_to?']("to_ary"))
12543            data = value.$to_ary().$to_a();
12544          else
12545            data = [value];
12546        }
12547
12548        var old;
12549
12550        index  = $coerce_to(index, $$$('Integer'), 'to_int');
12551        length = $coerce_to(length, $$$('Integer'), 'to_int');
12552
12553        if (index < 0) {
12554          old    = index;
12555          index += size;
12556
12557          if (index < 0) {
12558            $Kernel.$raise($$$('IndexError'), "index " + (old) + " too small for array; minimum " + (-self.length));
12559          }
12560        }
12561
12562        if (length < 0) {
12563          $Kernel.$raise($$$('IndexError'), "negative length (" + (length) + ")");
12564        }
12565
12566        if (index > size) {
12567          for (i = size; i < index; i++) {
12568            self[i] = nil;
12569          }
12570        }
12571
12572        if (extra === undefined) {
12573          self[index] = value;
12574        }
12575        else {
12576          self.splice.apply(self, [index, length].concat(data));
12577        }
12578
12579        return value;
12580      }
12581    }, -3);
12582
12583    $def(self, '$any?', function $Array_any$ques$12(pattern) {
12584      var block = $Array_any$ques$12.$$p || nil, self = this;
12585
12586      $Array_any$ques$12.$$p = null;
12587      if (self.length === 0) return false;
12588      return $send2(self, $find_super(self, 'any?', $Array_any$ques$12, false, true), 'any?', [pattern], block);
12589    }, -1);
12590
12591    $def(self, '$assoc', function $$assoc(object) {
12592      var self = this;
12593
12594
12595      for (var i = 0, length = self.length, item; i < length; i++) {
12596        if (item = self[i], item.length && (item[0])['$=='](object)) {
12597          return item;
12598        }
12599      }
12600
12601      return nil;
12602
12603    });
12604
12605    $def(self, '$at', function $$at(index) {
12606      var self = this;
12607
12608
12609      index = $coerce_to(index, $$$('Integer'), 'to_int');
12610
12611      if (index < 0) {
12612        index += self.length;
12613      }
12614
12615      if (index < 0 || index >= self.length) {
12616        return nil;
12617      }
12618
12619      return self[index];
12620
12621    });
12622
12623    $def(self, '$bsearch_index', function $$bsearch_index() {
12624      var block = $$bsearch_index.$$p || nil, self = this;
12625
12626      $$bsearch_index.$$p = null;
12627      if (!(block !== nil)) {
12628        return self.$enum_for("bsearch_index")
12629      }
12630      var min = 0,
12631          max = self.length,
12632          mid,
12633          val,
12634          ret,
12635          smaller = false,
12636          satisfied = nil;
12637
12638      while (min < max) {
12639        mid = min + Math.floor((max - min) / 2);
12640        val = self[mid];
12641        ret = $yield1(block, val);
12642
12643        if (ret === true) {
12644          satisfied = mid;
12645          smaller = true;
12646        }
12647        else if (ret === false || ret === nil) {
12648          smaller = false;
12649        }
12650        else if (ret.$$is_number) {
12651          if (ret === 0) { return mid; }
12652          smaller = (ret < 0);
12653        }
12654        else {
12655          $Kernel.$raise($$$('TypeError'), "wrong argument type " + ((ret).$class()) + " (must be numeric, true, false or nil)");
12656        }
12657
12658        if (smaller) { max = mid; } else { min = mid + 1; }
12659      }
12660
12661      return satisfied;
12662    });
12663
12664    $def(self, '$bsearch', function $$bsearch() {
12665      var block = $$bsearch.$$p || nil, self = this, index = nil;
12666
12667      $$bsearch.$$p = null;
12668      if (!(block !== nil)) {
12669        return self.$enum_for("bsearch")
12670      }      index = $send(self, 'bsearch_index', [], block.$to_proc());
12671
12672      if (index != null && index.$$is_number) {
12673        return self[index];
12674      } else {
12675        return index;
12676      }
12677    });
12678
12679    $def(self, '$cycle', function $$cycle(n) {
12680      var block = $$cycle.$$p || nil, self = this;
12681
12682      $$cycle.$$p = null;
12683      if (n == null) n = nil;
12684      if (!(block !== nil)) {
12685        return $send(self, 'enum_for', ["cycle", n], function $$13(){var self = $$13.$$s == null ? this : $$13.$$s;
12686
12687          if ($truthy(n['$nil?']())) {
12688            return $$$($$$('Float'), 'INFINITY')
12689          } else {
12690
12691            n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
12692            if ($truthy($rb_gt(n, 0))) {
12693              return $rb_times(self.$enumerator_size(), n)
12694            } else {
12695              return 0
12696            }          }}, {$$s: self})
12697      }      if (($truthy(self['$empty?']()) || ($eqeq(n, 0)))) {
12698        return nil
12699      }
12700      var i, length;
12701
12702      if (n === nil) {
12703        while (true) {
12704          for (i = 0, length = self.length; i < length; i++) {
12705            $yield1(block, self[i]);
12706          }
12707        }
12708      }
12709      else {
12710        n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
12711        if (n <= 0) {
12712          return self;
12713        }
12714
12715        while (n > 0) {
12716          for (i = 0, length = self.length; i < length; i++) {
12717            $yield1(block, self[i]);
12718          }
12719
12720          n--;
12721        }
12722      }
12723      return self;
12724    }, -1);
12725
12726    $def(self, '$clear', function $$clear() {
12727      var self = this;
12728
12729
12730      $deny_frozen_access(self);
12731      self.splice(0, self.length);
12732      return self;
12733    });
12734
12735    $def(self, '$count', function $$count(object) {
12736      var block = $$count.$$p || nil, self = this;
12737
12738      $$count.$$p = null;
12739      if (($truthy(object !== undefined) || ($truthy(block)))) {
12740        return $send2(self, $find_super(self, 'count', $$count, false, true), 'count', [object], block)
12741      } else {
12742        return self.$size()
12743      }    }, -1);
12744
12745    $def(self, '$initialize_copy', function $$initialize_copy(other) {
12746      var self = this;
12747
12748      return self.$replace(other)
12749    });
12750
12751    $def(self, '$collect', function $$collect() {
12752      var block = $$collect.$$p || nil, self = this;
12753
12754      $$collect.$$p = null;
12755      if (!(block !== nil)) {
12756        return $send(self, 'enum_for', ["collect"], function $$14(){var self = $$14.$$s == null ? this : $$14.$$s;
12757
12758          return self.$size()}, {$$s: self})
12759      }
12760      var result = [];
12761
12762      for (var i = 0, length = self.length; i < length; i++) {
12763        var value = $yield1(block, self[i]);
12764        result.push(value);
12765      }
12766
12767      return result;
12768    });
12769
12770    $def(self, '$collect!', function $Array_collect$excl$15() {
12771      var block = $Array_collect$excl$15.$$p || nil, self = this;
12772
12773      $Array_collect$excl$15.$$p = null;
12774      if (!(block !== nil)) {
12775        return $send(self, 'enum_for', ["collect!"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s;
12776
12777          return self.$size()}, {$$s: self})
12778      }
12779      $deny_frozen_access(self);
12780
12781      for (var i = 0, length = self.length; i < length; i++) {
12782        var value = $yield1(block, self[i]);
12783        self[i] = value;
12784      }
12785      return self;
12786    });
12787
12788    function binomial_coefficient(n, k) {
12789      if (n === k || k === 0) {
12790        return 1;
12791      }
12792
12793      if (k > 0 && n > k) {
12794        return binomial_coefficient(n - 1, k - 1) + binomial_coefficient(n - 1, k);
12795      }
12796
12797      return 0;
12798    }
12799
12800    $def(self, '$combination', function $$combination(n) {
12801      var $yield = $$combination.$$p || nil, self = this, num = nil;
12802
12803      $$combination.$$p = null;
12804
12805      num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
12806      if (!($yield !== nil)) {
12807        return $send(self, 'enum_for', ["combination", num], function $$17(){var self = $$17.$$s == null ? this : $$17.$$s;
12808
12809          return binomial_coefficient(self.length, num)}, {$$s: self})
12810      }
12811      var i, length, stack, chosen, lev, done, next;
12812
12813      if (num === 0) {
12814        Opal.yield1($yield, []);
12815      } else if (num === 1) {
12816        for (i = 0, length = self.length; i < length; i++) {
12817          Opal.yield1($yield, [self[i]]);
12818        }
12819      }
12820      else if (num === self.length) {
12821        Opal.yield1($yield, self.slice());
12822      }
12823      else if (num >= 0 && num < self.length) {
12824        stack = [];
12825        for (i = 0; i <= num + 1; i++) {
12826          stack.push(0);
12827        }
12828
12829        chosen = [];
12830        lev = 0;
12831        done = false;
12832        stack[0] = -1;
12833
12834        while (!done) {
12835          chosen[lev] = self[stack[lev+1]];
12836          while (lev < num - 1) {
12837            lev++;
12838            next = stack[lev+1] = stack[lev] + 1;
12839            chosen[lev] = self[next];
12840          }
12841          Opal.yield1($yield, chosen.slice());
12842          lev++;
12843          do {
12844            done = (lev === 0);
12845            stack[lev]++;
12846            lev--;
12847          } while ( stack[lev+1] + num === self.length + lev + 1 );
12848        }
12849      }
12850      return self;
12851    });
12852
12853    $def(self, '$repeated_combination', function $$repeated_combination(n) {
12854      var $yield = $$repeated_combination.$$p || nil, self = this, num = nil;
12855
12856      $$repeated_combination.$$p = null;
12857
12858      num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
12859      if (!($yield !== nil)) {
12860        return $send(self, 'enum_for', ["repeated_combination", num], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s;
12861
12862          return binomial_coefficient(self.length + num - 1, num);}, {$$s: self})
12863      }
12864      function iterate(max, from, buffer, self) {
12865        if (buffer.length == max) {
12866          var copy = buffer.slice();
12867          Opal.yield1($yield, copy);
12868          return;
12869        }
12870        for (var i = from; i < self.length; i++) {
12871          buffer.push(self[i]);
12872          iterate(max, i, buffer, self);
12873          buffer.pop();
12874        }
12875      }
12876
12877      if (num >= 0) {
12878        iterate(num, 0, [], self);
12879      }
12880      return self;
12881    });
12882
12883    $def(self, '$compact', function $$compact() {
12884      var self = this;
12885
12886
12887      var result = [];
12888
12889      for (var i = 0, length = self.length, item; i < length; i++) {
12890        if ((item = self[i]) !== nil) {
12891          result.push(item);
12892        }
12893      }
12894
12895      return result;
12896
12897    });
12898
12899    $def(self, '$compact!', function $Array_compact$excl$19() {
12900      var self = this;
12901
12902
12903      $deny_frozen_access(self);
12904
12905      var original = self.length;
12906
12907      for (var i = 0, length = self.length; i < length; i++) {
12908        if (self[i] === nil) {
12909          self.splice(i, 1);
12910
12911          length--;
12912          i--;
12913        }
12914      }
12915
12916      return self.length === original ? nil : self;
12917
12918    });
12919
12920    $def(self, '$concat', function $$concat($a) {
12921      var $post_args, others, self = this;
12922
12923
12924      $post_args = $slice(arguments);
12925      others = $post_args;
12926      $deny_frozen_access(self);
12927      others = $send(others, 'map', [], function $$20(other){var self = $$20.$$s == null ? this : $$20.$$s;
12928
12929
12930        if (other == null) other = nil;
12931        other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
12932        if ($truthy(other['$equal?'](self))) {
12933          other = other.$dup();
12934        }        return other;}, {$$s: self});
12935      $send(others, 'each', [], function $$21(other){var self = $$21.$$s == null ? this : $$21.$$s;
12936
12937
12938        if (other == null) other = nil;
12939
12940        for (var i = 0, length = other.length; i < length; i++) {
12941          self.push(other[i]);
12942        }
12943}, {$$s: self});
12944      return self;
12945    }, -1);
12946
12947    $def(self, '$delete', function $Array_delete$22(object) {
12948      var $yield = $Array_delete$22.$$p || nil, self = this;
12949
12950      $Array_delete$22.$$p = null;
12951
12952      var original = self.length;
12953
12954      for (var i = 0, length = original; i < length; i++) {
12955        if ((self[i])['$=='](object)) {
12956          $deny_frozen_access(self);
12957
12958          self.splice(i, 1);
12959
12960          length--;
12961          i--;
12962        }
12963      }
12964
12965      if (self.length === original) {
12966        if (($yield !== nil)) {
12967          return Opal.yieldX($yield, []);
12968        }
12969        return nil;
12970      }
12971      return object;
12972
12973    });
12974
12975    $def(self, '$delete_at', function $$delete_at(index) {
12976      var self = this;
12977
12978
12979      $deny_frozen_access(self);
12980
12981      index = $coerce_to(index, $$$('Integer'), 'to_int');
12982
12983      if (index < 0) {
12984        index += self.length;
12985      }
12986
12987      if (index < 0 || index >= self.length) {
12988        return nil;
12989      }
12990
12991      var result = self[index];
12992
12993      self.splice(index, 1);
12994
12995      return result;
12996
12997    });
12998
12999    $def(self, '$delete_if', function $$delete_if() {
13000      var block = $$delete_if.$$p || nil, self = this;
13001
13002      $$delete_if.$$p = null;
13003      if (!(block !== nil)) {
13004        return $send(self, 'enum_for', ["delete_if"], function $$23(){var self = $$23.$$s == null ? this : $$23.$$s;
13005
13006          return self.$size()}, {$$s: self})
13007      }
13008      $deny_frozen_access(self);
13009
13010      filterIf(self, $falsy, block)
13011    ;
13012      return self;
13013    });
13014
13015    $def(self, '$difference', function $$difference($a) {
13016      var $post_args, arrays, self = this;
13017
13018
13019      $post_args = $slice(arguments);
13020      arrays = $post_args;
13021      return $send(arrays, 'reduce', [self.$to_a().$dup()], function $$24(a, b){
13022
13023        if (a == null) a = nil;
13024        if (b == null) b = nil;
13025        return $rb_minus(a, b);});
13026    }, -1);
13027
13028    $def(self, '$dig', function $$dig(idx, $a) {
13029      var $post_args, idxs, self = this, item = nil;
13030
13031
13032      $post_args = $slice(arguments, 1);
13033      idxs = $post_args;
13034      item = self['$[]'](idx);
13035
13036      if (item === nil || idxs.length === 0) {
13037        return item;
13038      }
13039      if (!$truthy(item['$respond_to?']("dig"))) {
13040        $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method");
13041      }      return $send(item, 'dig', $to_a(idxs));
13042    }, -2);
13043
13044    $def(self, '$drop', function $$drop(number) {
13045      var self = this;
13046
13047
13048      number = $coerce_to(number, $$$('Integer'), 'to_int');
13049
13050      if (number < 0) {
13051        $Kernel.$raise($$$('ArgumentError'));
13052      }
13053
13054      return self.slice(number);
13055
13056    });
13057
13058    $def(self, '$dup', function $$dup() {
13059      var $yield = $$dup.$$p || nil, self = this;
13060
13061      $$dup.$$p = null;
13062
13063
13064      if (self.$$class === Opal.Array &&
13065          self.$$class.$allocate.$$pristine &&
13066          self.$copy_instance_variables.$$pristine &&
13067          self.$initialize_dup.$$pristine) {
13068        return self.slice(0);
13069      }
13070      return $send2(self, $find_super(self, 'dup', $$dup, false, true), 'dup', [], $yield);
13071    });
13072
13073    $def(self, '$each', function $$each() {
13074      var block = $$each.$$p || nil, self = this;
13075
13076      $$each.$$p = null;
13077      if (!(block !== nil)) {
13078        return $send(self, 'enum_for', ["each"], function $$25(){var self = $$25.$$s == null ? this : $$25.$$s;
13079
13080          return self.$size()}, {$$s: self})
13081      }
13082      for (var i = 0, length = self.length; i < length; i++) {
13083        $yield1(block, self[i]);
13084      }
13085      return self;
13086    });
13087
13088    $def(self, '$each_index', function $$each_index() {
13089      var block = $$each_index.$$p || nil, self = this;
13090
13091      $$each_index.$$p = null;
13092      if (!(block !== nil)) {
13093        return $send(self, 'enum_for', ["each_index"], function $$26(){var self = $$26.$$s == null ? this : $$26.$$s;
13094
13095          return self.$size()}, {$$s: self})
13096      }
13097      for (var i = 0, length = self.length; i < length; i++) {
13098        $yield1(block, i);
13099      }
13100      return self;
13101    });
13102
13103    $def(self, '$empty?', function $Array_empty$ques$27() {
13104      var self = this;
13105
13106      return self.length === 0;
13107    });
13108
13109    $def(self, '$eql?', function $Array_eql$ques$28(other) {
13110      var self = this;
13111
13112
13113      var recursed = {};
13114
13115      function _eql(array, other) {
13116        var i, length, a, b;
13117
13118        if (!other.$$is_array) {
13119          return false;
13120        }
13121
13122        other = other.$to_a();
13123
13124        if (array.length !== other.length) {
13125          return false;
13126        }
13127
13128        recursed[(array).$object_id()] = true;
13129
13130        for (i = 0, length = array.length; i < length; i++) {
13131          a = array[i];
13132          b = other[i];
13133          if (a.$$is_array) {
13134            if (b.$$is_array && b.length !== a.length) {
13135              return false;
13136            }
13137            if (!recursed.hasOwnProperty((a).$object_id())) {
13138              if (!_eql(a, b)) {
13139                return false;
13140              }
13141            }
13142          } else {
13143            if (!(a)['$eql?'](b)) {
13144              return false;
13145            }
13146          }
13147        }
13148
13149        return true;
13150      }
13151
13152      return _eql(self, other);
13153
13154    });
13155
13156    $def(self, '$fetch', function $$fetch(index, defaults) {
13157      var block = $$fetch.$$p || nil, self = this;
13158
13159      $$fetch.$$p = null;
13160
13161      var original = index;
13162
13163      index = $coerce_to(index, $$$('Integer'), 'to_int');
13164
13165      if (index < 0) {
13166        index += self.length;
13167      }
13168
13169      if (index >= 0 && index < self.length) {
13170        return self[index];
13171      }
13172
13173      if (block !== nil && defaults != null) {
13174        self.$warn("warning: block supersedes default value argument");
13175      }
13176
13177      if (block !== nil) {
13178        return block(original);
13179      }
13180
13181      if (defaults != null) {
13182        return defaults;
13183      }
13184
13185      if (self.length === 0) {
13186        $Kernel.$raise($$$('IndexError'), "index " + (original) + " outside of array bounds: 0...0");
13187      }
13188      else {
13189        $Kernel.$raise($$$('IndexError'), "index " + (original) + " outside of array bounds: -" + (self.length) + "..." + (self.length));
13190      }
13191    }, -2);
13192
13193    $def(self, '$fill', function $$fill($a) {
13194      var block = $$fill.$$p || nil, $post_args, args, $b, $c, self = this, one = nil, two = nil, obj = nil, left = nil, right = nil;
13195
13196      $$fill.$$p = null;
13197      $post_args = $slice(arguments);
13198      args = $post_args;
13199
13200      $deny_frozen_access(self);
13201
13202      var i, value;
13203      if ($truthy(block)) {
13204
13205        if ($truthy(args.length > 2)) {
13206          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$length()) + " for 0..2)");
13207        }        $c = args, $b = $to_ary($c), (one = ($b[0] == null ? nil : $b[0])), (two = ($b[1] == null ? nil : $b[1]));
13208      } else {
13209
13210        if ($truthy(args.length == 0)) {
13211          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (0 for 1..3)");
13212        } else if ($truthy(args.length > 3)) {
13213          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (args.$length()) + " for 1..3)");
13214        }        $c = args, $b = $to_ary($c), (obj = ($b[0] == null ? nil : $b[0])), (one = ($b[1] == null ? nil : $b[1])), (two = ($b[2] == null ? nil : $b[2]));
13215      }      if ($eqeqeq($$$('Range'), one)) {
13216
13217        if ($truthy(two)) {
13218          $Kernel.$raise($$$('TypeError'), "length invalid with range");
13219        }        left = one.begin === nil ? 0 : $coerce_to(one.begin, $$$('Integer'), 'to_int');
13220        if ($truthy(left < 0)) {
13221          left += this.length;
13222        }        if ($truthy(left < 0)) {
13223          $Kernel.$raise($$$('RangeError'), "" + (one.$inspect()) + " out of range");
13224        }        right = one.end === nil ? -1 : $coerce_to(one.end, $$$('Integer'), 'to_int');
13225        if ($truthy(right < 0)) {
13226          right += this.length;
13227        }        if (!$truthy(one['$exclude_end?']())) {
13228          right += 1;
13229        }        if ($truthy(right <= left)) {
13230          return self
13231        }      } else if ($truthy(one)) {
13232
13233        left = $coerce_to(one, $$$('Integer'), 'to_int');
13234        if ($truthy(left < 0)) {
13235          left += this.length;
13236        }        if ($truthy(left < 0)) {
13237          left = 0;
13238        }        if ($truthy(two)) {
13239
13240          right = $coerce_to(two, $$$('Integer'), 'to_int');
13241          if ($truthy(right == 0)) {
13242            return self
13243          }          right += left;
13244        } else {
13245          right = this.length;
13246        }      } else {
13247
13248        left = 0;
13249        right = this.length;
13250      }      if ($truthy(left > this.length)) {
13251
13252        for (i = this.length; i < right; i++) {
13253          self[i] = nil;
13254        }
13255
13256      }      if ($truthy(right > this.length)) {
13257        this.length = right;
13258      }      if ($truthy(block)) {
13259
13260        for (this.length; left < right; left++) {
13261          value = block(left);
13262          self[left] = value;
13263        }
13264
13265      } else {
13266
13267        for (this.length; left < right; left++) {
13268          self[left] = obj;
13269        }
13270
13271      }      return self;
13272    }, -1);
13273
13274    $def(self, '$first', function $$first(count) {
13275      var self = this;
13276
13277      if (count == null) {
13278        return self.length === 0 ? nil : self[0];
13279      }
13280
13281      count = $coerce_to(count, $$$('Integer'), 'to_int');
13282
13283      if (count < 0) {
13284        $Kernel.$raise($$$('ArgumentError'), "negative array size");
13285      }
13286
13287      return self.slice(0, count);
13288    }, -1);
13289
13290    $def(self, '$flatten', function $$flatten(level) {
13291      var self = this;
13292
13293      function _flatten(array, level) {
13294        var result = [],
13295            i, length,
13296            item, ary;
13297
13298        array = (array).$to_a();
13299
13300        for (i = 0, length = array.length; i < length; i++) {
13301          item = array[i];
13302
13303          if (!$respond_to(item, '$to_ary', true)) {
13304            result.push(item);
13305            continue;
13306          }
13307
13308          ary = (item).$to_ary();
13309
13310          if (ary === nil) {
13311            result.push(item);
13312            continue;
13313          }
13314
13315          if (!ary.$$is_array) {
13316            $Kernel.$raise($$$('TypeError'));
13317          }
13318
13319          if (ary === self) {
13320            $Kernel.$raise($$$('ArgumentError'));
13321          }
13322
13323          switch (level) {
13324          case undefined:
13325            result = result.concat(_flatten(ary));
13326            break;
13327          case 0:
13328            result.push(ary);
13329            break;
13330          default:
13331            result.push.apply(result, _flatten(ary, level - 1));
13332          }
13333        }
13334        return result;
13335      }
13336
13337      if (level !== undefined) {
13338        level = $coerce_to(level, $$$('Integer'), 'to_int');
13339      }
13340
13341      return _flatten(self, level);
13342    }, -1);
13343
13344    $def(self, '$flatten!', function $Array_flatten$excl$29(level) {
13345      var self = this;
13346
13347      $deny_frozen_access(self);
13348
13349      var flattened = self.$flatten(level);
13350
13351      if (self.length == flattened.length) {
13352        for (var i = 0, length = self.length; i < length; i++) {
13353          if (self[i] !== flattened[i]) {
13354            break;
13355          }
13356        }
13357
13358        if (i == length) {
13359          return nil;
13360        }
13361      }
13362
13363      self.$replace(flattened);
13364      return self;
13365    }, -1);
13366
13367    $def(self, '$freeze', function $$freeze() {
13368      var self = this;
13369
13370
13371      if ($truthy(self['$frozen?']())) {
13372        return self
13373      }      return $freeze(self);    });
13374
13375    $def(self, '$hash', function $$hash() {
13376      var self = this;
13377
13378
13379      var top = ($hash_ids === undefined),
13380          result = ['A'],
13381          hash_id = self.$object_id(),
13382          item, i, key;
13383
13384      try {
13385        if (top) {
13386          $hash_ids = Object.create(null);
13387        }
13388
13389        // return early for recursive structures
13390        if ($hash_ids[hash_id]) {
13391          return 'self';
13392        }
13393
13394        for (key in $hash_ids) {
13395          item = $hash_ids[key];
13396          if (self['$eql?'](item)) {
13397            return 'self';
13398          }
13399        }
13400
13401        $hash_ids[hash_id] = self;
13402
13403        for (i = 0; i < self.length; i++) {
13404          item = self[i];
13405          result.push(item.$hash());
13406        }
13407
13408        return result.join(',');
13409      } finally {
13410        if (top) {
13411          $hash_ids = undefined;
13412        }
13413      }
13414
13415    });
13416
13417    $def(self, '$include?', function $Array_include$ques$30(member) {
13418      var self = this;
13419
13420
13421      for (var i = 0, length = self.length; i < length; i++) {
13422        if ((self[i])['$=='](member)) {
13423          return true;
13424        }
13425      }
13426
13427      return false;
13428
13429    });
13430
13431    $def(self, '$index', function $$index(object) {
13432      var block = $$index.$$p || nil, self = this;
13433
13434      $$index.$$p = null;
13435
13436      var i, length, value;
13437
13438      if (object != null && block !== nil) {
13439        self.$warn("warning: given block not used");
13440      }
13441
13442      if (object != null) {
13443        for (i = 0, length = self.length; i < length; i++) {
13444          if ((self[i])['$=='](object)) {
13445            return i;
13446          }
13447        }
13448      }
13449      else if (block !== nil) {
13450        for (i = 0, length = self.length; i < length; i++) {
13451          value = block(self[i]);
13452
13453          if (value !== false && value !== nil) {
13454            return i;
13455          }
13456        }
13457      }
13458      else {
13459        return self.$enum_for("index");
13460      }
13461
13462      return nil;
13463    }, -1);
13464
13465    $def(self, '$insert', function $$insert(index, $a) {
13466      var $post_args, objects, self = this;
13467
13468
13469      $post_args = $slice(arguments, 1);
13470      objects = $post_args;
13471
13472      $deny_frozen_access(self);
13473
13474      index = $coerce_to(index, $$$('Integer'), 'to_int');
13475
13476      if (objects.length > 0) {
13477        if (index < 0) {
13478          index += self.length + 1;
13479
13480          if (index < 0) {
13481            $Kernel.$raise($$$('IndexError'), "" + (index) + " is out of bounds");
13482          }
13483        }
13484        if (index > self.length) {
13485          for (var i = self.length; i < index; i++) {
13486            self.push(nil);
13487          }
13488        }
13489
13490        self.splice.apply(self, [index, 0].concat(objects));
13491      }
13492      return self;
13493    }, -2);
13494    var inspect_stack = [];
13495
13496    $def(self, '$inspect', function $$inspect() {
13497      var self = this;
13498
13499
13500
13501      var result = [],
13502      id = self.$__id__(),
13503      pushed = true;
13504
13505      return (function() { try {
13506
13507
13508        if (inspect_stack.indexOf(id) !== -1) {
13509          pushed = false;
13510          return '[...]';
13511        }
13512        inspect_stack.push(id);
13513
13514        for (var i = 0, length = self.length; i < length; i++) {
13515          var item = self['$[]'](i);
13516
13517          result.push($$('Opal').$inspect(item));
13518        }
13519
13520        return '[' + result.join(', ') + ']';
13521      ;
13522      return nil;
13523      } finally {
13524        if (pushed) inspect_stack.pop();
13525      } })();    });
13526
13527    $def(self, '$intersection', function $$intersection($a) {
13528      var $post_args, arrays, self = this;
13529
13530
13531      $post_args = $slice(arguments);
13532      arrays = $post_args;
13533      return $send(arrays, 'reduce', [self.$to_a().$dup()], function $$31(a, b){
13534
13535        if (a == null) a = nil;
13536        if (b == null) b = nil;
13537        return a['$&'](b);});
13538    }, -1);
13539
13540    $def(self, '$intersect?', function $Array_intersect$ques$32(other) {
13541      var self = this;
13542
13543      return self.$intersection(other)['$empty?']()['$!']()
13544    });
13545
13546    $def(self, '$join', function $$join(sep) {
13547      var self = this;
13548      if ($gvars[","] == null) $gvars[","] = nil;
13549
13550
13551      if (sep == null) sep = nil;
13552      if ($truthy(self.length === 0)) {
13553        return ""
13554      }      if ($truthy(sep === nil)) {
13555        sep = $gvars[","];
13556      }
13557      var result = [];
13558      var i, length, item, tmp;
13559
13560      for (i = 0, length = self.length; i < length; i++) {
13561        item = self[i];
13562
13563        if ($respond_to(item, '$to_str')) {
13564          tmp = (item).$to_str();
13565
13566          if (tmp !== nil) {
13567            result.push((tmp).$to_s());
13568
13569            continue;
13570          }
13571        }
13572
13573        if ($respond_to(item, '$to_ary')) {
13574          tmp = (item).$to_ary();
13575
13576          if (tmp === self) {
13577            $Kernel.$raise($$$('ArgumentError'));
13578          }
13579
13580          if (tmp !== nil) {
13581            result.push((tmp).$join(sep));
13582
13583            continue;
13584          }
13585        }
13586
13587        if ($respond_to(item, '$to_s')) {
13588          tmp = (item).$to_s();
13589
13590          if (tmp !== nil) {
13591            result.push(tmp);
13592
13593            continue;
13594          }
13595        }
13596
13597        $Kernel.$raise($$$('NoMethodError').$new("" + ($$('Opal').$inspect(self.$item())) + " doesn't respond to #to_str, #to_ary or #to_s", "to_str"));
13598      }
13599
13600      if (sep === nil) {
13601        return result.join('');
13602      }
13603      else {
13604        return result.join($Opal['$coerce_to!'](sep, $$$('String'), "to_str").$to_s());
13605      }
13606    }, -1);
13607
13608    $def(self, '$keep_if', function $$keep_if() {
13609      var block = $$keep_if.$$p || nil, self = this;
13610
13611      $$keep_if.$$p = null;
13612      if (!(block !== nil)) {
13613        return $send(self, 'enum_for', ["keep_if"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s;
13614
13615          return self.$size()}, {$$s: self})
13616      }
13617      $deny_frozen_access(self);
13618
13619      filterIf(self, $truthy, block)
13620    ;
13621      return self;
13622    });
13623
13624    $def(self, '$last', function $$last(count) {
13625      var self = this;
13626
13627      if (count == null) {
13628        return self.length === 0 ? nil : self[self.length - 1];
13629      }
13630
13631      count = $coerce_to(count, $$$('Integer'), 'to_int');
13632
13633      if (count < 0) {
13634        $Kernel.$raise($$$('ArgumentError'), "negative array size");
13635      }
13636
13637      if (count > self.length) {
13638        count = self.length;
13639      }
13640
13641      return self.slice(self.length - count, self.length);
13642    }, -1);
13643
13644    $def(self, '$length', function $$length() {
13645      var self = this;
13646
13647      return self.length;
13648    });
13649
13650    $def(self, '$max', function $$max(n) {
13651      var block = $$max.$$p || nil, self = this;
13652
13653      $$max.$$p = null;
13654      return $send(self.$each(), 'max', [n], block.$to_proc());
13655    }, -1);
13656
13657    $def(self, '$min', function $$min() {
13658      var block = $$min.$$p || nil, self = this;
13659
13660      $$min.$$p = null;
13661      return $send(self.$each(), 'min', [], block.$to_proc());
13662    });
13663
13664    // Returns the product of from, from-1, ..., from - how_many + 1.
13665    function descending_factorial(from, how_many) {
13666      var count = how_many >= 0 ? 1 : 0;
13667      while (how_many) {
13668        count *= from;
13669        from--;
13670        how_many--;
13671      }
13672      return count;
13673    }
13674
13675    $def(self, '$permutation', function $$permutation(num) {
13676      var block = $$permutation.$$p || nil, self = this, perm = nil, used = nil;
13677
13678      $$permutation.$$p = null;
13679      if (!(block !== nil)) {
13680        return $send(self, 'enum_for', ["permutation", num], function $$34(){var self = $$34.$$s == null ? this : $$34.$$s;
13681
13682          return descending_factorial(self.length, num === undefined ? self.length : num);}, {$$s: self})
13683      }
13684      var permute, offensive, output;
13685
13686      if (num === undefined) {
13687        num = self.length;
13688      }
13689      else {
13690        num = $coerce_to(num, $$$('Integer'), 'to_int');
13691      }
13692
13693      if (num < 0 || self.length < num) ;
13694      else if (num === 0) {
13695        // exactly one permutation: the zero-length array
13696        Opal.yield1(block, []);
13697      }
13698      else if (num === 1) {
13699        // this is a special, easy case
13700        for (var i = 0; i < self.length; i++) {
13701          Opal.yield1(block, [self[i]]);
13702        }
13703      }
13704      else {
13705        // this is the general case
13706        (perm = $$('Array').$new(num));
13707        (used = $$('Array').$new(self.length, false));
13708
13709        permute = function(num, perm, index, used, blk) {
13710          self = this;
13711          for(var i = 0; i < self.length; i++){
13712            if(used['$[]'](i)['$!']()) {
13713              perm[index] = i;
13714              if(index < num - 1) {
13715                used[i] = true;
13716                permute.call(self, num, perm, index + 1, used, blk);
13717                used[i] = false;
13718              }
13719              else {
13720                output = [];
13721                for (var j = 0; j < perm.length; j++) {
13722                  output.push(self[perm[j]]);
13723                }
13724                $yield1(blk, output);
13725              }
13726            }
13727          }
13728        };
13729
13730        if ((block !== nil)) {
13731          // offensive (both definitions) copy.
13732          offensive = self.slice();
13733          permute.call(offensive, num, perm, 0, used, block);
13734        }
13735        else {
13736          permute.call(self, num, perm, 0, used, block);
13737        }
13738      }
13739      return self;
13740    }, -1);
13741
13742    $def(self, '$repeated_permutation', function $$repeated_permutation(n) {
13743      var $yield = $$repeated_permutation.$$p || nil, self = this, num = nil;
13744
13745      $$repeated_permutation.$$p = null;
13746
13747      num = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
13748      if (!($yield !== nil)) {
13749        return $send(self, 'enum_for', ["repeated_permutation", num], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s;
13750
13751          if ($truthy($rb_ge(num, 0))) {
13752            return self.$size()['$**'](num)
13753          } else {
13754            return 0
13755          }}, {$$s: self})
13756      }
13757      function iterate(max, buffer, self) {
13758        if (buffer.length == max) {
13759          var copy = buffer.slice();
13760          Opal.yield1($yield, copy);
13761          return;
13762        }
13763        for (var i = 0; i < self.length; i++) {
13764          buffer.push(self[i]);
13765          iterate(max, buffer, self);
13766          buffer.pop();
13767        }
13768      }
13769
13770      iterate(num, [], self.slice());
13771      return self;
13772    });
13773
13774    $def(self, '$pop', function $$pop(count) {
13775      var self = this;
13776      $deny_frozen_access(self);
13777      if ($truthy(count === undefined)) {
13778
13779        if ($truthy(self.length === 0)) {
13780          return nil
13781        }        return self.pop();
13782      }      count = $coerce_to(count, $$$('Integer'), 'to_int');
13783      if ($truthy(count < 0)) {
13784        $Kernel.$raise($$$('ArgumentError'), "negative array size");
13785      }      if ($truthy(self.length === 0)) {
13786        return []
13787      }      if ($truthy(count === 1)) {
13788        return [self.pop()];
13789      } else if ($truthy(count > self.length)) {
13790        return self.splice(0, self.length);
13791      } else {
13792        return self.splice(self.length - count, self.length);
13793      }    }, -1);
13794
13795    $def(self, '$product', function $$product($a) {
13796      var block = $$product.$$p || nil, $post_args, args, self = this;
13797
13798      $$product.$$p = null;
13799      $post_args = $slice(arguments);
13800      args = $post_args;
13801
13802      var result = (block !== nil) ? null : [],
13803          n = args.length + 1,
13804          counters = new Array(n),
13805          lengths  = new Array(n),
13806          arrays   = new Array(n),
13807          i, m, subarray, len, resultlen = 1;
13808
13809      arrays[0] = self;
13810      for (i = 1; i < n; i++) {
13811        arrays[i] = $coerce_to(args[i - 1], $$$('Array'), 'to_ary');
13812      }
13813
13814      for (i = 0; i < n; i++) {
13815        len = arrays[i].length;
13816        if (len === 0) {
13817          return result || self;
13818        }
13819        resultlen *= len;
13820        if (resultlen > 2147483647) {
13821          $Kernel.$raise($$$('RangeError'), "too big to product");
13822        }
13823        lengths[i] = len;
13824        counters[i] = 0;
13825      }
13826
13827      outer_loop: for (;;) {
13828        subarray = [];
13829        for (i = 0; i < n; i++) {
13830          subarray.push(arrays[i][counters[i]]);
13831        }
13832        if (result) {
13833          result.push(subarray);
13834        } else {
13835          Opal.yield1(block, subarray);
13836        }
13837        m = n - 1;
13838        counters[m]++;
13839        while (counters[m] === lengths[m]) {
13840          counters[m] = 0;
13841          if (--m < 0) break outer_loop;
13842          counters[m]++;
13843        }
13844      }
13845
13846      return result || self;
13847    }, -1);
13848
13849    $def(self, '$push', function $$push($a) {
13850      var $post_args, objects, self = this;
13851
13852
13853      $post_args = $slice(arguments);
13854      objects = $post_args;
13855
13856      $deny_frozen_access(self);
13857
13858      for (var i = 0, length = objects.length; i < length; i++) {
13859        self.push(objects[i]);
13860      }
13861      return self;
13862    }, -1);
13863
13864    $def(self, '$rassoc', function $$rassoc(object) {
13865      var self = this;
13866
13867
13868      for (var i = 0, length = self.length, item; i < length; i++) {
13869        item = self[i];
13870
13871        if (item.length && item[1] !== undefined) {
13872          if ((item[1])['$=='](object)) {
13873            return item;
13874          }
13875        }
13876      }
13877
13878      return nil;
13879
13880    });
13881
13882    $def(self, '$reject', function $$reject() {
13883      var block = $$reject.$$p || nil, self = this;
13884
13885      $$reject.$$p = null;
13886      if (!(block !== nil)) {
13887        return $send(self, 'enum_for', ["reject"], function $$36(){var self = $$36.$$s == null ? this : $$36.$$s;
13888
13889          return self.$size()}, {$$s: self})
13890      }
13891      var result = [];
13892
13893      for (var i = 0, length = self.length, value; i < length; i++) {
13894        value = block(self[i]);
13895
13896        if (value === false || value === nil) {
13897          result.push(self[i]);
13898        }
13899      }
13900      return result;
13901    });
13902
13903    $def(self, '$reject!', function $Array_reject$excl$37() {
13904      var block = $Array_reject$excl$37.$$p || nil, self = this, original = nil;
13905
13906      $Array_reject$excl$37.$$p = null;
13907      if (!(block !== nil)) {
13908        return $send(self, 'enum_for', ["reject!"], function $$38(){var self = $$38.$$s == null ? this : $$38.$$s;
13909
13910          return self.$size()}, {$$s: self})
13911      }      $deny_frozen_access(self);
13912      original = self.$length();
13913      $send(self, 'delete_if', [], block.$to_proc());
13914      if ($eqeq(self.$length(), original)) {
13915        return nil
13916      } else {
13917        return self
13918      }    });
13919
13920    $def(self, '$replace', function $$replace(other) {
13921      var self = this;
13922
13923
13924      $deny_frozen_access(self);
13925      other = ($eqeqeq($$$('Array'), other) ? (other.$to_a()) : (($coerce_to(other, $$$('Array'), 'to_ary')).$to_a()));
13926
13927      self.splice(0, self.length);
13928      self.push.apply(self, other);
13929      return self;
13930    });
13931
13932    $def(self, '$reverse', function $$reverse() {
13933      var self = this;
13934
13935      return self.slice(0).reverse();
13936    });
13937
13938    $def(self, '$reverse!', function $Array_reverse$excl$39() {
13939      var self = this;
13940
13941
13942      $deny_frozen_access(self);
13943      return self.reverse();    });
13944
13945    $def(self, '$reverse_each', function $$reverse_each() {
13946      var block = $$reverse_each.$$p || nil, self = this;
13947
13948      $$reverse_each.$$p = null;
13949      if (!(block !== nil)) {
13950        return $send(self, 'enum_for', ["reverse_each"], function $$40(){var self = $$40.$$s == null ? this : $$40.$$s;
13951
13952          return self.$size()}, {$$s: self})
13953      }      $send(self.$reverse(), 'each', [], block.$to_proc());
13954      return self;
13955    });
13956
13957    $def(self, '$rindex', function $$rindex(object) {
13958      var block = $$rindex.$$p || nil, self = this;
13959
13960      $$rindex.$$p = null;
13961
13962      var i, value;
13963
13964      if (object != null && block !== nil) {
13965        self.$warn("warning: given block not used");
13966      }
13967
13968      if (object != null) {
13969        for (i = self.length - 1; i >= 0; i--) {
13970          if (i >= self.length) {
13971            break;
13972          }
13973          if ((self[i])['$=='](object)) {
13974            return i;
13975          }
13976        }
13977      }
13978      else if (block !== nil) {
13979        for (i = self.length - 1; i >= 0; i--) {
13980          if (i >= self.length) {
13981            break;
13982          }
13983
13984          value = block(self[i]);
13985
13986          if (value !== false && value !== nil) {
13987            return i;
13988          }
13989        }
13990      }
13991      else if (object == null) {
13992        return self.$enum_for("rindex");
13993      }
13994
13995      return nil;
13996    }, -1);
13997
13998    $def(self, '$rotate', function $$rotate(n) {
13999      var self = this;
14000
14001
14002      if (n == null) n = 1;
14003
14004      var ary, idx, firstPart, lastPart;
14005
14006      n = $coerce_to(n, $$$('Integer'), 'to_int');
14007
14008      if (self.length === 1) {
14009        return self.slice();
14010      }
14011      if (self.length === 0) {
14012        return [];
14013      }
14014
14015      ary = self.slice();
14016      idx = n % ary.length;
14017
14018      firstPart = ary.slice(idx);
14019      lastPart = ary.slice(0, idx);
14020      return firstPart.concat(lastPart);
14021    }, -1);
14022
14023    $def(self, '$rotate!', function $Array_rotate$excl$41(cnt) {
14024      var self = this, ary = nil;
14025
14026
14027      if (cnt == null) cnt = 1;
14028
14029      $deny_frozen_access(self);
14030
14031      if (self.length === 0 || self.length === 1) {
14032        return self;
14033      }
14034      cnt = $coerce_to(cnt, $$$('Integer'), 'to_int');
14035      ary = self.$rotate(cnt);
14036      return self.$replace(ary);
14037    }, -1);
14038    (function($base, $super) {
14039      var self = $klass($base, $super, 'SampleRandom');
14040
14041      var $proto = self.$$prototype;
14042
14043      $proto.rng = nil;
14044
14045
14046      $def(self, '$initialize', $assign_ivar("rng"));
14047      return $def(self, '$rand', function $$rand(size) {
14048        var self = this, random = nil;
14049
14050
14051        random = $coerce_to(self.rng.$rand(size), $$$('Integer'), 'to_int');
14052        if ($truthy(random < 0)) {
14053          $Kernel.$raise($$$('RangeError'), "random value must be >= 0");
14054        }        if (!$truthy(random < size)) {
14055          $Kernel.$raise($$$('RangeError'), "random value must be less than Array size");
14056        }        return random;
14057      });
14058    })(self, null);
14059
14060    $def(self, '$sample', function $$sample(count, options) {
14061      var self = this, o = nil, rng = nil;
14062      if ($truthy(count === undefined)) {
14063        return self.$at($Kernel.$rand(self.length))
14064      }      if ($truthy(options === undefined)) {
14065        if ($truthy((o = $Opal['$coerce_to?'](count, $$$('Hash'), "to_hash")))) {
14066
14067          options = o;
14068          count = nil;
14069        } else {
14070
14071          options = nil;
14072          count = $coerce_to(count, $$$('Integer'), 'to_int');
14073        }
14074      } else {
14075
14076        count = $coerce_to(count, $$$('Integer'), 'to_int');
14077        options = $coerce_to(options, $$$('Hash'), 'to_hash');
14078      }      if (($truthy(count) && ($truthy(count < 0)))) {
14079        $Kernel.$raise($$$('ArgumentError'), "count must be greater than 0");
14080      }      if ($truthy(options)) {
14081        rng = options['$[]']("random");
14082      }      rng = (($truthy(rng) && ($truthy(rng['$respond_to?']("rand")))) ? ($$('SampleRandom').$new(rng)) : ($Kernel));
14083      if (!$truthy(count)) {
14084        return self[rng.$rand(self.length)]
14085      }
14086
14087      var abandon, spin, result, i, j, k, targetIndex, oldValue;
14088
14089      if (count > self.length) {
14090        count = self.length;
14091      }
14092
14093      switch (count) {
14094        case 0:
14095          return [];
14096        case 1:
14097          return [self[rng.$rand(self.length)]];
14098        case 2:
14099          i = rng.$rand(self.length);
14100          j = rng.$rand(self.length - 1);
14101          if (i <= j) {
14102            j++;
14103          }
14104          return [self[i], self[j]];
14105        default:
14106          if (self.length / count > 3) {
14107            abandon = false;
14108            spin = 0;
14109
14110            result = $$('Array').$new(count);
14111            i = 1;
14112
14113            result[0] = rng.$rand(self.length);
14114            while (i < count) {
14115              k = rng.$rand(self.length);
14116              j = 0;
14117
14118              while (j < i) {
14119                while (k === result[j]) {
14120                  spin++;
14121                  if (spin > 100) {
14122                    abandon = true;
14123                    break;
14124                  }
14125                  k = rng.$rand(self.length);
14126                }
14127                if (abandon) { break; }
14128
14129                j++;
14130              }
14131
14132              if (abandon) { break; }
14133
14134              result[i] = k;
14135
14136              i++;
14137            }
14138
14139            if (!abandon) {
14140              i = 0;
14141              while (i < count) {
14142                result[i] = self[result[i]];
14143                i++;
14144              }
14145
14146              return result;
14147            }
14148          }
14149
14150          result = self.slice();
14151
14152          for (var c = 0; c < count; c++) {
14153            targetIndex = rng.$rand(self.length - c) + c;
14154            oldValue = result[c];
14155            result[c] = result[targetIndex];
14156            result[targetIndex] = oldValue;
14157          }
14158
14159          return count === self.length ? result : (result)['$[]'](0, count);
14160      }
14161    }, -1);
14162
14163    $def(self, '$select', function $$select() {
14164      var block = $$select.$$p || nil, self = this;
14165
14166      $$select.$$p = null;
14167      if (!(block !== nil)) {
14168        return $send(self, 'enum_for', ["select"], function $$42(){var self = $$42.$$s == null ? this : $$42.$$s;
14169
14170          return self.$size()}, {$$s: self})
14171      }
14172      var result = [];
14173
14174      for (var i = 0, length = self.length, item, value; i < length; i++) {
14175        item = self[i];
14176
14177        value = $yield1(block, item);
14178
14179        if ($truthy(value)) {
14180          result.push(item);
14181        }
14182      }
14183
14184      return result;
14185    });
14186
14187    $def(self, '$select!', function $Array_select$excl$43() {
14188      var block = $Array_select$excl$43.$$p || nil, self = this;
14189
14190      $Array_select$excl$43.$$p = null;
14191      if (!(block !== nil)) {
14192        return $send(self, 'enum_for', ["select!"], function $$44(){var self = $$44.$$s == null ? this : $$44.$$s;
14193
14194          return self.$size()}, {$$s: self})
14195      }
14196      $deny_frozen_access(self);
14197
14198      var original = self.length;
14199      $send(self, 'keep_if', [], block.$to_proc());
14200      return self.length === original ? nil : self;
14201    });
14202
14203    $def(self, '$shift', function $$shift(count) {
14204      var self = this;
14205      $deny_frozen_access(self);
14206      if ($truthy(count === undefined)) {
14207
14208        if ($truthy(self.length === 0)) {
14209          return nil
14210        }        return shiftNoArg(self);
14211      }      count = $coerce_to(count, $$$('Integer'), 'to_int');
14212      if ($truthy(count < 0)) {
14213        $Kernel.$raise($$$('ArgumentError'), "negative array size");
14214      }      if ($truthy(self.length === 0)) {
14215        return []
14216      }      return self.splice(0, count);    }, -1);
14217
14218    $def(self, '$shuffle', function $$shuffle(rng) {
14219      var self = this;
14220      return self.$dup().$to_a()['$shuffle!'](rng);
14221    }, -1);
14222
14223    $def(self, '$shuffle!', function $Array_shuffle$excl$45(rng) {
14224      var self = this;
14225
14226      $deny_frozen_access(self);
14227
14228      var randgen, i = self.length, j, tmp;
14229
14230      if (rng !== undefined) {
14231        rng = $Opal['$coerce_to?'](rng, $$$('Hash'), "to_hash");
14232
14233        if (rng !== nil) {
14234          rng = rng['$[]']("random");
14235
14236          if (rng !== nil && rng['$respond_to?']("rand")) {
14237            randgen = rng;
14238          }
14239        }
14240      }
14241
14242      while (i) {
14243        if (randgen) {
14244          j = randgen.$rand(i).$to_int();
14245
14246          if (j < 0) {
14247            $Kernel.$raise($$$('RangeError'), "random number too small " + (j));
14248          }
14249
14250          if (j >= i) {
14251            $Kernel.$raise($$$('RangeError'), "random number too big " + (j));
14252          }
14253        }
14254        else {
14255          j = self.$rand(i);
14256        }
14257
14258        tmp = self[--i];
14259        self[i] = self[j];
14260        self[j] = tmp;
14261      }
14262
14263      return self;
14264    }, -1);
14265
14266    $def(self, '$slice!', function $Array_slice$excl$46(index, length) {
14267      var self = this, result = nil, range = nil, range_start = nil, range_end = nil, start = nil;
14268      $deny_frozen_access(self);
14269      result = nil;
14270      if ($truthy(length === undefined)) {
14271        if ($eqeqeq($$$('Range'), index)) {
14272
14273          range = index;
14274          result = self['$[]'](range);
14275          range_start = range.begin === nil ? 0 : $coerce_to(range.begin, $$$('Integer'), 'to_int');
14276          range_end = range.end === nil ? -1 : $coerce_to(range.end, $$$('Integer'), 'to_int');
14277
14278          if (range_start < 0) {
14279            range_start += self.length;
14280          }
14281
14282          if (range_end < 0) {
14283            range_end += self.length;
14284          } else if (range_end >= self.length) {
14285            range_end = self.length - 1;
14286            if (range.excl) {
14287              range_end += 1;
14288            }
14289          }
14290
14291          var range_length = range_end - range_start;
14292          if (range.excl && range.end !== nil) {
14293            range_end -= 1;
14294          } else {
14295            range_length += 1;
14296          }
14297
14298          if (range_start < self.length && range_start >= 0 && range_end < self.length && range_end >= 0 && range_length > 0) {
14299            self.splice(range_start, range_length);
14300          }
14301        } else {
14302
14303          start = $coerce_to(index, $$$('Integer'), 'to_int');
14304
14305          if (start < 0) {
14306            start += self.length;
14307          }
14308
14309          if (start < 0 || start >= self.length) {
14310            return nil;
14311          }
14312
14313          result = self[start];
14314
14315          if (start === 0) {
14316            self.shift();
14317          } else {
14318            self.splice(start, 1);
14319          }
14320        }
14321      } else {
14322
14323        start = $coerce_to(index, $$$('Integer'), 'to_int');
14324        length = $coerce_to(length, $$$('Integer'), 'to_int');
14325
14326        if (length < 0) {
14327          return nil;
14328        }
14329
14330        result = self['$[]'](start, length);
14331
14332        if (start < 0) {
14333          start += self.length;
14334        }
14335
14336        if (start + length > self.length) {
14337          length = self.length - start;
14338        }
14339
14340        if (start < self.length && start >= 0) {
14341          self.splice(start, length);
14342        }
14343      }      return result;
14344    }, -2);
14345
14346    $def(self, '$sort', function $$sort() {
14347      var block = $$sort.$$p || nil, self = this;
14348
14349      $$sort.$$p = null;
14350      if (!$truthy(self.length > 1)) {
14351        return self
14352      }
14353      if (block === nil) {
14354        block = function(a, b) {
14355          return (a)['$<=>'](b);
14356        };
14357      }
14358
14359      return self.slice().sort(function(x, y) {
14360        var ret = block(x, y);
14361
14362        if (ret === nil) {
14363          $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((x).$inspect()) + " with " + ((y).$inspect()) + " failed");
14364        }
14365
14366        return $rb_gt(ret, 0) ? 1 : ($rb_lt(ret, 0) ? -1 : 0);
14367      });
14368    });
14369
14370    $def(self, '$sort!', function $Array_sort$excl$47() {
14371      var block = $Array_sort$excl$47.$$p || nil, self = this;
14372
14373      $Array_sort$excl$47.$$p = null;
14374
14375      $deny_frozen_access(self);
14376
14377      var result;
14378
14379      if ((block !== nil)) {
14380        result = $send((self.slice()), 'sort', [], block.$to_proc());
14381      }
14382      else {
14383        result = (self.slice()).$sort();
14384      }
14385
14386      self.length = 0;
14387      for(var i = 0, length = result.length; i < length; i++) {
14388        self.push(result[i]);
14389      }
14390
14391      return self;
14392    });
14393
14394    $def(self, '$sort_by!', function $Array_sort_by$excl$48() {
14395      var block = $Array_sort_by$excl$48.$$p || nil, self = this;
14396
14397      $Array_sort_by$excl$48.$$p = null;
14398      if (!(block !== nil)) {
14399        return $send(self, 'enum_for', ["sort_by!"], function $$49(){var self = $$49.$$s == null ? this : $$49.$$s;
14400
14401          return self.$size()}, {$$s: self})
14402      }      $deny_frozen_access(self);
14403      return self.$replace($send(self, 'sort_by', [], block.$to_proc()));
14404    });
14405
14406    $def(self, '$take', function $$take(count) {
14407      var self = this;
14408
14409
14410      if (count < 0) {
14411        $Kernel.$raise($$$('ArgumentError'));
14412      }
14413
14414      return self.slice(0, count);
14415
14416    });
14417
14418    $def(self, '$take_while', function $$take_while() {
14419      var block = $$take_while.$$p || nil, self = this;
14420
14421      $$take_while.$$p = null;
14422
14423      var result = [];
14424
14425      for (var i = 0, length = self.length, item, value; i < length; i++) {
14426        item = self[i];
14427
14428        value = block(item);
14429
14430        if (value === false || value === nil) {
14431          return result;
14432        }
14433
14434        result.push(item);
14435      }
14436
14437      return result;
14438    });
14439
14440    $def(self, '$to_a', function $$to_a() {
14441      var self = this;
14442
14443
14444      if (self.$$class === Opal.Array) {
14445        return self;
14446      }
14447      else {
14448        return Opal.Array.$new(self);
14449      }
14450
14451    });
14452
14453    $def(self, '$to_ary', $return_self);
14454
14455    $def(self, '$to_h', function $$to_h() {
14456      var block = $$to_h.$$p || nil, self = this, array = nil;
14457
14458      $$to_h.$$p = null;
14459      array = self;
14460      if ((block !== nil)) {
14461        array = $send(array, 'map', [], block.$to_proc());
14462      }
14463      var i, len = array.length, ary, key, val, hash = $hash2([], {});
14464
14465      for (i = 0; i < len; i++) {
14466        ary = $Opal['$coerce_to?'](array[i], $$$('Array'), "to_ary");
14467        if (!ary.$$is_array) {
14468          $Kernel.$raise($$$('TypeError'), "wrong element type " + ((ary).$class()) + " at " + (i) + " (expected array)");
14469        }
14470        if (ary.length !== 2) {
14471          $Kernel.$raise($$$('ArgumentError'), "wrong array length at " + (i) + " (expected 2, was " + ((ary).$length()) + ")");
14472        }
14473        key = ary[0];
14474        val = ary[1];
14475        $hash_put(hash, key, val);
14476      }
14477
14478      return hash;
14479    });
14480
14481    $def(self, '$transpose', function $$transpose() {
14482      var self = this, result = nil, max = nil;
14483
14484
14485      if ($truthy(self['$empty?']())) {
14486        return []
14487      }      result = [];
14488      max = nil;
14489      $send(self, 'each', [], function $$50(row){var $ret_or_1 = nil;
14490
14491
14492        if (row == null) row = nil;
14493        row = ($eqeqeq($$$('Array'), row) ? (row.$to_a()) : (($coerce_to(row, $$$('Array'), 'to_ary')).$to_a()));
14494        max = ($truthy(($ret_or_1 = max)) ? ($ret_or_1) : (row.length));
14495        if ($neqeq(row.length, max)) {
14496          $Kernel.$raise($$$('IndexError'), "element size differs (" + (row.length) + " should be " + (max) + ")");
14497        }        return $send((row.length), 'times', [], function $$51(i){var $a, entry = nil;
14498
14499
14500          if (i == null) i = nil;
14501          entry = ($truthy(($ret_or_1 = result['$[]'](i))) ? ($ret_or_1) : (($a = [i, []], $send(result, '[]=', $a), $a[$a.length - 1])));
14502          return entry['$<<'](row.$at(i));});});
14503      return result;
14504    });
14505
14506    $def(self, '$union', function $$union($a) {
14507      var $post_args, arrays, self = this;
14508
14509
14510      $post_args = $slice(arguments);
14511      arrays = $post_args;
14512      return $send(arrays, 'reduce', [self.$uniq()], function $$52(a, b){
14513
14514        if (a == null) a = nil;
14515        if (b == null) b = nil;
14516        return a['$|'](b);});
14517    }, -1);
14518
14519    $def(self, '$uniq', function $$uniq() {
14520      var block = $$uniq.$$p || nil, self = this;
14521
14522      $$uniq.$$p = null;
14523
14524      var hash = $hash2([], {}), i, length, item, key;
14525
14526      if (block === nil) {
14527        for (i = 0, length = self.length; i < length; i++) {
14528          item = self[i];
14529          if ($hash_get(hash, item) === undefined) {
14530            $hash_put(hash, item, item);
14531          }
14532        }
14533      }
14534      else {
14535        for (i = 0, length = self.length; i < length; i++) {
14536          item = self[i];
14537          key = $yield1(block, item);
14538          if ($hash_get(hash, key) === undefined) {
14539            $hash_put(hash, key, item);
14540          }
14541        }
14542      }
14543
14544      return (hash).$values();
14545    });
14546
14547    $def(self, '$uniq!', function $Array_uniq$excl$53() {
14548      var block = $Array_uniq$excl$53.$$p || nil, self = this;
14549
14550      $Array_uniq$excl$53.$$p = null;
14551
14552      $deny_frozen_access(self);
14553
14554      var original_length = self.length, hash = $hash2([], {}), i, length, item, key;
14555
14556      for (i = 0, length = original_length; i < length; i++) {
14557        item = self[i];
14558        key = (block === nil ? item : $yield1(block, item));
14559
14560        if ($hash_get(hash, key) === undefined) {
14561          $hash_put(hash, key, item);
14562          continue;
14563        }
14564
14565        self.splice(i, 1);
14566        length--;
14567        i--;
14568      }
14569
14570      return self.length === original_length ? nil : self;
14571    });
14572
14573    $def(self, '$unshift', function $$unshift($a) {
14574      var $post_args, objects, self = this;
14575
14576
14577      $post_args = $slice(arguments);
14578      objects = $post_args;
14579
14580      $deny_frozen_access(self);
14581
14582      var selfLength = self.length;
14583      var objectsLength = objects.length;
14584      if (objectsLength == 0) return self;
14585      var index = selfLength - objectsLength;
14586      for (var i = 0; i < objectsLength; i++) {
14587        self.push(self[index + i]);
14588      }
14589      var len = selfLength - 1;
14590      while (len - objectsLength >= 0) {
14591        self[len] = self[len - objectsLength];
14592        len--;
14593      }
14594      for (var j = 0; j < objectsLength; j++) {
14595        self[j] = objects[j];
14596      }
14597      return self;
14598    }, -1);
14599
14600    $def(self, '$values_at', function $$values_at($a) {
14601      var $post_args, args, self = this, out = nil;
14602
14603
14604      $post_args = $slice(arguments);
14605      args = $post_args;
14606      out = [];
14607      $send(args, 'each', [], function $$54(elem){var self = $$54.$$s == null ? this : $$54.$$s, finish = nil, start = nil, i = nil;
14608
14609
14610        if (elem == null) elem = nil;
14611        if ($truthy(elem['$is_a?']($$$('Range')))) {
14612
14613          finish = elem.$end() === nil ? -1 : $coerce_to(elem.$end(), $$$('Integer'), 'to_int');
14614          start = elem.$begin() === nil ? 0 : $coerce_to(elem.$begin(), $$$('Integer'), 'to_int');
14615
14616          if (start < 0) {
14617            start = start + self.length;
14618            return nil;
14619          }
14620
14621          if (finish < 0) {
14622            finish = finish + self.length;
14623          }
14624          if (elem['$exclude_end?']() && elem.$end() !== nil) {
14625            finish--;
14626          }
14627          if (finish < start) {
14628            return nil;
14629          }
14630          return $send(start, 'upto', [finish], function $$55(i){var self = $$55.$$s == null ? this : $$55.$$s;
14631
14632
14633            if (i == null) i = nil;
14634            return out['$<<'](self.$at(i));}, {$$s: self});
14635        } else {
14636
14637          i = $coerce_to(elem, $$$('Integer'), 'to_int');
14638          return out['$<<'](self.$at(i));
14639        }}, {$$s: self});
14640      return out;
14641    }, -1);
14642
14643    $def(self, '$zip', function $$zip($a) {
14644      var block = $$zip.$$p || nil, $post_args, others, self = this, $ret_or_1 = nil;
14645
14646      $$zip.$$p = null;
14647      $post_args = $slice(arguments);
14648      others = $post_args;
14649
14650      var result = [], size = self.length, part, o, i, j, jj;
14651
14652      for (j = 0, jj = others.length; j < jj; j++) {
14653        o = others[j];
14654        if (o.$$is_array) {
14655          continue;
14656        }
14657        if (o.$$is_range || o.$$is_enumerator) {
14658          others[j] = o.$take(size);
14659          continue;
14660        }
14661        others[j] = ($truthy(($ret_or_1 = $Opal['$coerce_to?'](o, $$$('Array'), "to_ary"))) ? ($ret_or_1) : ($Opal['$coerce_to!'](o, $$$('Enumerator'), "to_enum", "each"))).$to_a();
14662      }
14663
14664      for (i = 0; i < size; i++) {
14665        part = [self[i]];
14666
14667        for (j = 0, jj = others.length; j < jj; j++) {
14668          o = others[j][i];
14669
14670          if (o == null) {
14671            o = nil;
14672          }
14673
14674          part[j + 1] = o;
14675        }
14676
14677        result[i] = part;
14678      }
14679
14680      if (block !== nil) {
14681        for (i = 0; i < size; i++) {
14682          Opal.yield1(block, result[i]);
14683        }
14684
14685        return nil;
14686      }
14687
14688      return result;
14689    }, -1);
14690    $defs(self, '$inherited', function $$inherited(klass) {
14691
14692
14693      klass.$$prototype.$to_a = function() {
14694        return this.slice(0, this.length);
14695      };
14696
14697    });
14698
14699    $def(self, '$instance_variables', function $$instance_variables() {
14700      var $yield = $$instance_variables.$$p || nil, self = this;
14701
14702      $$instance_variables.$$p = null;
14703      return $send($send2(self, $find_super(self, 'instance_variables', $$instance_variables, false, true), 'instance_variables', [], $yield), 'reject', [], function $$56(ivar){var $ret_or_1 = nil;
14704
14705
14706        if (ivar == null) ivar = nil;
14707        if ($truthy(($ret_or_1 = /^@\d+$/.test(ivar)))) {
14708          return $ret_or_1
14709        } else {
14710          return ivar['$==']("@length")
14711        }})
14712    });
14713
14714    $def(self, '$pack', function $$pack($a) {
14715
14716
14717      $slice(arguments);
14718      return $Kernel.$raise("To use Array#pack, you must first require 'corelib/array/pack'.");
14719    }, -1);
14720    $alias(self, "append", "push");
14721    $alias(self, "filter", "select");
14722    $alias(self, "filter!", "select!");
14723    $alias(self, "map", "collect");
14724    $alias(self, "map!", "collect!");
14725    $alias(self, "prepend", "unshift");
14726    $alias(self, "size", "length");
14727    $alias(self, "slice", "[]");
14728    $alias(self, "to_s", "inspect");
14729    $Opal.$pristine(self.$singleton_class(), "allocate");
14730    return $Opal.$pristine(self, "copy_instance_variables", "initialize_dup");
14731  })('::', Array, $nesting);
14732};
14733
14734Opal.modules["corelib/hash"] = function(Opal) {/* Generated by Opal 1.7.3 */
14735  var $yield1 = Opal.yield1, $hash = Opal.hash, $hash_init = Opal.hash_init, $hash_get = Opal.hash_get, $hash_put = Opal.hash_put, $hash_delete = Opal.hash_delete, $deny_frozen_access = Opal.deny_frozen_access, $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $defs = Opal.defs, $def = Opal.def, $send = Opal.send, $rb_ge = Opal.rb_ge, $rb_gt = Opal.rb_gt, $hash2 = Opal.hash2, $truthy = Opal.truthy, $to_a = Opal.to_a, $return_self = Opal.return_self, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
14736
14737  Opal.add_stubs('require,include,coerce_to?,[],merge!,allocate,raise,coerce_to!,each,fetch,>=,>,==,compare_by_identity,lambda?,abs,arity,enum_for,size,respond_to?,class,dig,except!,dup,delete,new,inspect,map,to_proc,flatten,frozen?,eql?,default,default_proc,default_proc=,default=,to_h,proc,clone,select,select!,has_key?,indexes,index,length,[]=,has_value?');
14738
14739  self.$require("corelib/enumerable");
14740  return (function($base, $super, $parent_nesting) {
14741    var self = $klass($base, $super, 'Hash');
14742
14743    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
14744
14745
14746    self.$include($$$('Enumerable'));
14747    self.$$prototype.$$is_hash = true;
14748    $defs(self, '$[]', function $Hash_$$$1($a) {
14749      var $post_args, argv, self = this;
14750
14751
14752      $post_args = $slice(arguments);
14753      argv = $post_args;
14754
14755      var hash, argc = argv.length, i;
14756
14757      if (argc === 1) {
14758        hash = $Opal['$coerce_to?'](argv['$[]'](0), $$$('Hash'), "to_hash");
14759        if (hash !== nil) {
14760          return self.$allocate()['$merge!'](hash);
14761        }
14762
14763        argv = $Opal['$coerce_to?'](argv['$[]'](0), $$$('Array'), "to_ary");
14764        if (argv === nil) {
14765          $Kernel.$raise($$$('ArgumentError'), "odd number of arguments for Hash");
14766        }
14767
14768        argc = argv.length;
14769        hash = self.$allocate();
14770
14771        for (i = 0; i < argc; i++) {
14772          if (!argv[i].$$is_array) continue;
14773          switch(argv[i].length) {
14774          case 1:
14775            hash.$store(argv[i][0], nil);
14776            break;
14777          case 2:
14778            hash.$store(argv[i][0], argv[i][1]);
14779            break;
14780          default:
14781            $Kernel.$raise($$$('ArgumentError'), "invalid number of elements (" + (argv[i].length) + " for 1..2)");
14782          }
14783        }
14784
14785        return hash;
14786      }
14787
14788      if (argc % 2 !== 0) {
14789        $Kernel.$raise($$$('ArgumentError'), "odd number of arguments for Hash");
14790      }
14791
14792      hash = self.$allocate();
14793
14794      for (i = 0; i < argc; i += 2) {
14795        hash.$store(argv[i], argv[i + 1]);
14796      }
14797
14798      return hash;
14799    }, -1);
14800    $defs(self, '$allocate', function $$allocate() {
14801      var self = this;
14802
14803
14804      var hash = new self.$$constructor();
14805
14806      $hash_init(hash);
14807
14808      hash.$$none = nil;
14809      hash.$$proc = nil;
14810
14811      return hash;
14812
14813    });
14814    $defs(self, '$try_convert', function $$try_convert(obj) {
14815
14816      return $Opal['$coerce_to?'](obj, $$$('Hash'), "to_hash")
14817    });
14818
14819    $def(self, '$initialize', function $$initialize(defaults) {
14820      var block = $$initialize.$$p || nil, self = this;
14821
14822      $$initialize.$$p = null;
14823
14824      $deny_frozen_access(self);
14825
14826      if (defaults !== undefined && block !== nil) {
14827        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (1 for 0)");
14828      }
14829      self.$$none = (defaults === undefined ? nil : defaults);
14830      self.$$proc = block;
14831
14832      return self;
14833    }, -1);
14834
14835    $def(self, '$==', function $Hash_$eq_eq$2(other) {
14836      var self = this;
14837
14838
14839      if (self === other) {
14840        return true;
14841      }
14842
14843      if (!other.$$is_hash) {
14844        return false;
14845      }
14846
14847      if (self.$$keys.length !== other.$$keys.length) {
14848        return false;
14849      }
14850
14851      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, other_value; i < length; i++) {
14852        key = keys[i];
14853
14854        if (key.$$is_string) {
14855          value = self.$$smap[key];
14856          other_value = other.$$smap[key];
14857        } else {
14858          value = key.value;
14859          other_value = $hash_get(other, key.key);
14860        }
14861
14862        if (other_value === undefined || !value['$eql?'](other_value)) {
14863          return false;
14864        }
14865      }
14866
14867      return true;
14868
14869    });
14870
14871    $def(self, '$>=', function $Hash_$gt_eq$3(other) {
14872      var self = this, result = nil;
14873
14874
14875      other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash");
14876
14877      if (self.$$keys.length < other.$$keys.length) {
14878        return false
14879      }
14880      result = true;
14881      $send(other, 'each', [], function $$4(other_key, other_val){var self = $$4.$$s == null ? this : $$4.$$s, val = nil;
14882
14883
14884        if (other_key == null) other_key = nil;
14885        if (other_val == null) other_val = nil;
14886        val = self.$fetch(other_key, null);
14887
14888        if (val == null || val !== other_val) {
14889          result = false;
14890          return;
14891        }
14892}, {$$s: self});
14893      return result;
14894    });
14895
14896    $def(self, '$>', function $Hash_$gt$5(other) {
14897      var self = this;
14898
14899
14900      other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash");
14901
14902      if (self.$$keys.length <= other.$$keys.length) {
14903        return false
14904      }
14905      return $rb_ge(self, other);
14906    });
14907
14908    $def(self, '$<', function $Hash_$lt$6(other) {
14909      var self = this;
14910
14911
14912      other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash");
14913      return $rb_gt(other, self);
14914    });
14915
14916    $def(self, '$<=', function $Hash_$lt_eq$7(other) {
14917      var self = this;
14918
14919
14920      other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash");
14921      return $rb_ge(other, self);
14922    });
14923
14924    $def(self, '$[]', function $Hash_$$$8(key) {
14925      var self = this;
14926
14927
14928      var value = $hash_get(self, key);
14929
14930      if (value !== undefined) {
14931        return value;
14932      }
14933
14934      return self.$default(key);
14935
14936    });
14937
14938    $def(self, '$[]=', function $Hash_$$$eq$9(key, value) {
14939      var self = this;
14940
14941
14942      $deny_frozen_access(self);
14943
14944      $hash_put(self, key, value);
14945      return value;
14946
14947    });
14948
14949    $def(self, '$assoc', function $$assoc(object) {
14950      var self = this;
14951
14952
14953      for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
14954        key = keys[i];
14955
14956        if (key.$$is_string) {
14957          if ((key)['$=='](object)) {
14958            return [key, self.$$smap[key]];
14959          }
14960        } else {
14961          if ((key.key)['$=='](object)) {
14962            return [key.key, key.value];
14963          }
14964        }
14965      }
14966
14967      return nil;
14968
14969    });
14970
14971    $def(self, '$clear', function $$clear() {
14972      var self = this;
14973
14974
14975      $deny_frozen_access(self);
14976
14977      $hash_init(self);
14978      return self;
14979
14980    });
14981
14982    $def(self, '$clone', function $$clone() {
14983      var self = this;
14984
14985
14986      var hash = new self.$$class();
14987
14988      $hash_init(hash);
14989      Opal.hash_clone(self, hash);
14990
14991      return hash;
14992
14993    });
14994
14995    $def(self, '$compact', function $$compact() {
14996      var self = this;
14997
14998
14999      var hash = $hash();
15000
15001      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15002        key = keys[i];
15003
15004        if (key.$$is_string) {
15005          value = self.$$smap[key];
15006        } else {
15007          value = key.value;
15008          key = key.key;
15009        }
15010
15011        if (value !== nil) {
15012          $hash_put(hash, key, value);
15013        }
15014      }
15015
15016      return hash;
15017
15018    });
15019
15020    $def(self, '$compact!', function $Hash_compact$excl$10() {
15021      var self = this;
15022
15023
15024      $deny_frozen_access(self);
15025
15026      var changes_were_made = false;
15027
15028      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15029        key = keys[i];
15030
15031        if (key.$$is_string) {
15032          value = self.$$smap[key];
15033        } else {
15034          value = key.value;
15035          key = key.key;
15036        }
15037
15038        if (value === nil) {
15039          if ($hash_delete(self, key) !== undefined) {
15040            changes_were_made = true;
15041            length--;
15042            i--;
15043          }
15044        }
15045      }
15046
15047      return changes_were_made ? self : nil;
15048
15049    });
15050
15051    $def(self, '$compare_by_identity', function $$compare_by_identity() {
15052      var self = this;
15053
15054
15055      $deny_frozen_access(self);
15056
15057      var i, ii, key, keys = self.$$keys, identity_hash;
15058
15059      if (self.$$by_identity) return self;
15060      if (self.$$keys.length === 0) {
15061        self.$$by_identity = true;
15062        return self;
15063      }
15064
15065      identity_hash = $hash2([], {}).$compare_by_identity();
15066      for(i = 0, ii = keys.length; i < ii; i++) {
15067        key = keys[i];
15068        if (!key.$$is_string) key = key.key;
15069        $hash_put(identity_hash, key, $hash_get(self, key));
15070      }
15071
15072      self.$$by_identity = true;
15073      self.$$map = identity_hash.$$map;
15074      self.$$smap = identity_hash.$$smap;
15075      return self;
15076
15077    });
15078
15079    $def(self, '$compare_by_identity?', function $Hash_compare_by_identity$ques$11() {
15080      var self = this;
15081
15082      return self.$$by_identity === true;
15083    });
15084
15085    $def(self, '$default', function $Hash_default$12(key) {
15086      var self = this;
15087
15088      if (key !== undefined && self.$$proc !== nil && self.$$proc !== undefined) {
15089        return self.$$proc.$call(self, key);
15090      }
15091      if (self.$$none === undefined) {
15092        return nil;
15093      }
15094      return self.$$none;
15095    }, -1);
15096
15097    $def(self, '$default=', function $Hash_default$eq$13(object) {
15098      var self = this;
15099
15100
15101      $deny_frozen_access(self);
15102
15103      self.$$proc = nil;
15104      self.$$none = object;
15105
15106      return object;
15107
15108    });
15109
15110    $def(self, '$default_proc', function $$default_proc() {
15111      var self = this;
15112
15113
15114      if (self.$$proc !== undefined) {
15115        return self.$$proc;
15116      }
15117      return nil;
15118
15119    });
15120
15121    $def(self, '$default_proc=', function $Hash_default_proc$eq$14(default_proc) {
15122      var self = this;
15123
15124
15125      $deny_frozen_access(self);
15126
15127      var proc = default_proc;
15128
15129      if (proc !== nil) {
15130        proc = $Opal['$coerce_to!'](proc, $$$('Proc'), "to_proc");
15131
15132        if ((proc)['$lambda?']() && (proc).$arity().$abs() !== 2) {
15133          $Kernel.$raise($$$('TypeError'), "default_proc takes two arguments");
15134        }
15135      }
15136
15137      self.$$none = nil;
15138      self.$$proc = proc;
15139
15140      return default_proc;
15141
15142    });
15143
15144    $def(self, '$delete', function $Hash_delete$15(key) {
15145      var block = $Hash_delete$15.$$p || nil, self = this;
15146
15147      $Hash_delete$15.$$p = null;
15148
15149      $deny_frozen_access(self);
15150      var value = $hash_delete(self, key);
15151
15152      if (value !== undefined) {
15153        return value;
15154      }
15155
15156      if (block !== nil) {
15157        return Opal.yield1(block, key);
15158      }
15159
15160      return nil;
15161    });
15162
15163    $def(self, '$delete_if', function $$delete_if() {
15164      var block = $$delete_if.$$p || nil, self = this;
15165
15166      $$delete_if.$$p = null;
15167      if (!$truthy(block)) {
15168        return $send(self, 'enum_for', ["delete_if"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s;
15169
15170          return self.$size()}, {$$s: self})
15171      }
15172      $deny_frozen_access(self);
15173
15174      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15175        key = keys[i];
15176
15177        if (key.$$is_string) {
15178          value = self.$$smap[key];
15179        } else {
15180          value = key.value;
15181          key = key.key;
15182        }
15183
15184        obj = block(key, value);
15185
15186        if (obj !== false && obj !== nil) {
15187          if ($hash_delete(self, key) !== undefined) {
15188            length--;
15189            i--;
15190          }
15191        }
15192      }
15193
15194      return self;
15195    });
15196
15197    $def(self, '$dig', function $$dig(key, $a) {
15198      var $post_args, keys, self = this, item = nil;
15199
15200
15201      $post_args = $slice(arguments, 1);
15202      keys = $post_args;
15203      item = self['$[]'](key);
15204
15205      if (item === nil || keys.length === 0) {
15206        return item;
15207      }
15208      if (!$truthy(item['$respond_to?']("dig"))) {
15209        $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method");
15210      }      return $send(item, 'dig', $to_a(keys));
15211    }, -2);
15212
15213    $def(self, '$each', function $$each() {
15214      var block = $$each.$$p || nil, self = this;
15215
15216      $$each.$$p = null;
15217      if (!$truthy(block)) {
15218        return $send(self, 'enum_for', ["each"], function $$17(){var self = $$17.$$s == null ? this : $$17.$$s;
15219
15220          return self.$size()}, {$$s: self})
15221      }
15222      for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key, value; i < length; i++) {
15223        key = keys[i];
15224
15225        if (key.$$is_string) {
15226          value = self.$$smap[key];
15227        } else {
15228          value = key.value;
15229          key = key.key;
15230        }
15231
15232        $yield1(block, [key, value]);
15233      }
15234
15235      return self;
15236    });
15237
15238    $def(self, '$each_key', function $$each_key() {
15239      var block = $$each_key.$$p || nil, self = this;
15240
15241      $$each_key.$$p = null;
15242      if (!$truthy(block)) {
15243        return $send(self, 'enum_for', ["each_key"], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s;
15244
15245          return self.$size()}, {$$s: self})
15246      }
15247      for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key; i < length; i++) {
15248        key = keys[i];
15249
15250        block(key.$$is_string ? key : key.key);
15251      }
15252
15253      return self;
15254    });
15255
15256    $def(self, '$each_value', function $$each_value() {
15257      var block = $$each_value.$$p || nil, self = this;
15258
15259      $$each_value.$$p = null;
15260      if (!$truthy(block)) {
15261        return $send(self, 'enum_for', ["each_value"], function $$19(){var self = $$19.$$s == null ? this : $$19.$$s;
15262
15263          return self.$size()}, {$$s: self})
15264      }
15265      for (var i = 0, keys = self.$$keys.slice(), length = keys.length, key; i < length; i++) {
15266        key = keys[i];
15267
15268        block(key.$$is_string ? self.$$smap[key] : key.value);
15269      }
15270
15271      return self;
15272    });
15273
15274    $def(self, '$empty?', function $Hash_empty$ques$20() {
15275      var self = this;
15276
15277      return self.$$keys.length === 0;
15278    });
15279
15280    $def(self, '$except', function $$except($a) {
15281      var $post_args, keys, self = this;
15282
15283
15284      $post_args = $slice(arguments);
15285      keys = $post_args;
15286      return $send(self.$dup(), 'except!', $to_a(keys));
15287    }, -1);
15288
15289    $def(self, '$except!', function $Hash_except$excl$21($a) {
15290      var $post_args, keys, self = this;
15291
15292
15293      $post_args = $slice(arguments);
15294      keys = $post_args;
15295      $send(keys, 'each', [], function $$22(key){var self = $$22.$$s == null ? this : $$22.$$s;
15296
15297
15298        if (key == null) key = nil;
15299        return self.$delete(key);}, {$$s: self});
15300      return self;
15301    }, -1);
15302
15303    $def(self, '$fetch', function $$fetch(key, defaults) {
15304      var block = $$fetch.$$p || nil, self = this;
15305
15306      $$fetch.$$p = null;
15307
15308      var value = $hash_get(self, key);
15309
15310      if (value !== undefined) {
15311        return value;
15312      }
15313
15314      if (block !== nil) {
15315        return block(key);
15316      }
15317
15318      if (defaults !== undefined) {
15319        return defaults;
15320      }
15321      return $Kernel.$raise($$$('KeyError').$new("key not found: " + (key.$inspect()), $hash2(["key", "receiver"], {"key": key, "receiver": self})));
15322    }, -2);
15323
15324    $def(self, '$fetch_values', function $$fetch_values($a) {
15325      var block = $$fetch_values.$$p || nil, $post_args, keys, self = this;
15326
15327      $$fetch_values.$$p = null;
15328      $post_args = $slice(arguments);
15329      keys = $post_args;
15330      return $send(keys, 'map', [], function $$23(key){var self = $$23.$$s == null ? this : $$23.$$s;
15331
15332
15333        if (key == null) key = nil;
15334        return $send(self, 'fetch', [key], block.$to_proc());}, {$$s: self});
15335    }, -1);
15336
15337    $def(self, '$flatten', function $$flatten(level) {
15338      var self = this;
15339
15340
15341      if (level == null) level = 1;
15342      level = $Opal['$coerce_to!'](level, $$$('Integer'), "to_int");
15343
15344      var result = [];
15345
15346      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15347        key = keys[i];
15348
15349        if (key.$$is_string) {
15350          value = self.$$smap[key];
15351        } else {
15352          value = key.value;
15353          key = key.key;
15354        }
15355
15356        result.push(key);
15357
15358        if (value.$$is_array) {
15359          if (level === 1) {
15360            result.push(value);
15361            continue;
15362          }
15363
15364          result = result.concat((value).$flatten(level - 2));
15365          continue;
15366        }
15367
15368        result.push(value);
15369      }
15370
15371      return result;
15372    }, -1);
15373
15374    $def(self, '$freeze', function $$freeze() {
15375      var self = this;
15376
15377
15378      if ($truthy(self['$frozen?']())) {
15379        return self
15380      }      return $freeze(self);    });
15381
15382    $def(self, '$has_key?', function $Hash_has_key$ques$24(key) {
15383      var self = this;
15384
15385      return $hash_get(self, key) !== undefined;
15386    });
15387
15388    $def(self, '$has_value?', function $Hash_has_value$ques$25(value) {
15389      var self = this;
15390
15391
15392      for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
15393        key = keys[i];
15394
15395        if (((key.$$is_string ? self.$$smap[key] : key.value))['$=='](value)) {
15396          return true;
15397        }
15398      }
15399
15400      return false;
15401
15402    });
15403
15404    $def(self, '$hash', function $$hash() {
15405      var self = this;
15406
15407
15408      var top = (Opal.hash_ids === undefined),
15409          hash_id = self.$object_id(),
15410          result = ['Hash'],
15411          key, item;
15412
15413      try {
15414        if (top) {
15415          Opal.hash_ids = Object.create(null);
15416        }
15417
15418        if (Opal[hash_id]) {
15419          return 'self';
15420        }
15421
15422        for (key in Opal.hash_ids) {
15423          item = Opal.hash_ids[key];
15424          if (self['$eql?'](item)) {
15425            return 'self';
15426          }
15427        }
15428
15429        Opal.hash_ids[hash_id] = self;
15430
15431        for (var i = 0, keys = self.$$keys, length = keys.length; i < length; i++) {
15432          key = keys[i];
15433
15434          if (key.$$is_string) {
15435            result.push([key, self.$$smap[key].$hash()]);
15436          } else {
15437            result.push([key.key_hash, key.value.$hash()]);
15438          }
15439        }
15440
15441        return result.sort().join();
15442
15443      } finally {
15444        if (top) {
15445          Opal.hash_ids = undefined;
15446        }
15447      }
15448
15449    });
15450
15451    $def(self, '$index', function $$index(object) {
15452      var self = this;
15453
15454
15455      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15456        key = keys[i];
15457
15458        if (key.$$is_string) {
15459          value = self.$$smap[key];
15460        } else {
15461          value = key.value;
15462          key = key.key;
15463        }
15464
15465        if ((value)['$=='](object)) {
15466          return key;
15467        }
15468      }
15469
15470      return nil;
15471
15472    });
15473
15474    $def(self, '$indexes', function $$indexes($a) {
15475      var $post_args, args, self = this;
15476
15477
15478      $post_args = $slice(arguments);
15479      args = $post_args;
15480
15481      var result = [];
15482
15483      for (var i = 0, length = args.length, key, value; i < length; i++) {
15484        key = args[i];
15485        value = $hash_get(self, key);
15486
15487        if (value === undefined) {
15488          result.push(self.$default());
15489          continue;
15490        }
15491
15492        result.push(value);
15493      }
15494
15495      return result;
15496    }, -1);
15497    var inspect_ids;
15498
15499    $def(self, '$inspect', function $$inspect() {
15500      var self = this;
15501
15502
15503
15504      var top = (inspect_ids === undefined),
15505          hash_id = self.$object_id(),
15506          result = [];
15507
15508      return (function() { try {
15509
15510
15511        if (top) {
15512          inspect_ids = {};
15513        }
15514
15515        if (inspect_ids.hasOwnProperty(hash_id)) {
15516          return '{...}';
15517        }
15518
15519        inspect_ids[hash_id] = true;
15520
15521        for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15522          key = keys[i];
15523
15524          if (key.$$is_string) {
15525            value = self.$$smap[key];
15526          } else {
15527            value = key.value;
15528            key = key.key;
15529          }
15530
15531          key = $$('Opal').$inspect(key);
15532          value = $$('Opal').$inspect(value);
15533
15534          result.push(key + '=>' + value);
15535        }
15536
15537        return '{' + result.join(', ') + '}';
15538      ;
15539      return nil;
15540      } finally {
15541        if (top) inspect_ids = undefined;
15542      } })();    });
15543
15544    $def(self, '$invert', function $$invert() {
15545      var self = this;
15546
15547
15548      var hash = $hash();
15549
15550      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15551        key = keys[i];
15552
15553        if (key.$$is_string) {
15554          value = self.$$smap[key];
15555        } else {
15556          value = key.value;
15557          key = key.key;
15558        }
15559
15560        $hash_put(hash, value, key);
15561      }
15562
15563      return hash;
15564
15565    });
15566
15567    $def(self, '$keep_if', function $$keep_if() {
15568      var block = $$keep_if.$$p || nil, self = this;
15569
15570      $$keep_if.$$p = null;
15571      if (!$truthy(block)) {
15572        return $send(self, 'enum_for', ["keep_if"], function $$26(){var self = $$26.$$s == null ? this : $$26.$$s;
15573
15574          return self.$size()}, {$$s: self})
15575      }
15576      $deny_frozen_access(self);
15577
15578      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15579        key = keys[i];
15580
15581        if (key.$$is_string) {
15582          value = self.$$smap[key];
15583        } else {
15584          value = key.value;
15585          key = key.key;
15586        }
15587
15588        obj = block(key, value);
15589
15590        if (obj === false || obj === nil) {
15591          if ($hash_delete(self, key) !== undefined) {
15592            length--;
15593            i--;
15594          }
15595        }
15596      }
15597
15598      return self;
15599    });
15600
15601    $def(self, '$keys', function $$keys() {
15602      var self = this;
15603
15604
15605      var result = [];
15606
15607      for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
15608        key = keys[i];
15609
15610        if (key.$$is_string) {
15611          result.push(key);
15612        } else {
15613          result.push(key.key);
15614        }
15615      }
15616
15617      return result;
15618
15619    });
15620
15621    $def(self, '$length', function $$length() {
15622      var self = this;
15623
15624      return self.$$keys.length;
15625    });
15626
15627    $def(self, '$merge', function $$merge($a) {
15628      var block = $$merge.$$p || nil, $post_args, others, self = this;
15629
15630      $$merge.$$p = null;
15631      $post_args = $slice(arguments);
15632      others = $post_args;
15633      return $send(self.$dup(), 'merge!', $to_a(others), block.$to_proc());
15634    }, -1);
15635
15636    $def(self, '$merge!', function $Hash_merge$excl$27($a) {
15637      var block = $Hash_merge$excl$27.$$p || nil, $post_args, others, self = this;
15638
15639      $Hash_merge$excl$27.$$p = null;
15640      $post_args = $slice(arguments);
15641      others = $post_args;
15642
15643      $deny_frozen_access(self);
15644      var i, j, other, other_keys, length, key, value, other_value;
15645      for (i = 0; i < others.length; ++i) {
15646        other = $Opal['$coerce_to!'](others[i], $$$('Hash'), "to_hash");
15647        other_keys = other.$$keys, length = other_keys.length;
15648
15649        if (block === nil) {
15650          for (j = 0; j < length; j++) {
15651            key = other_keys[j];
15652
15653            if (key.$$is_string) {
15654              other_value = other.$$smap[key];
15655            } else {
15656              other_value = key.value;
15657              key = key.key;
15658            }
15659
15660            $hash_put(self, key, other_value);
15661          }
15662        } else {
15663          for (j = 0; j < length; j++) {
15664            key = other_keys[j];
15665
15666            if (key.$$is_string) {
15667              other_value = other.$$smap[key];
15668            } else {
15669              other_value = key.value;
15670              key = key.key;
15671            }
15672
15673            value = $hash_get(self, key);
15674
15675            if (value === undefined) {
15676              $hash_put(self, key, other_value);
15677              continue;
15678            }
15679
15680            $hash_put(self, key, block(key, value, other_value));
15681          }
15682        }
15683      }
15684
15685      return self;
15686    }, -1);
15687
15688    $def(self, '$rassoc', function $$rassoc(object) {
15689      var self = this;
15690
15691
15692      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15693        key = keys[i];
15694
15695        if (key.$$is_string) {
15696          value = self.$$smap[key];
15697        } else {
15698          value = key.value;
15699          key = key.key;
15700        }
15701
15702        if ((value)['$=='](object)) {
15703          return [key, value];
15704        }
15705      }
15706
15707      return nil;
15708
15709    });
15710
15711    $def(self, '$rehash', function $$rehash() {
15712      var self = this;
15713
15714
15715      $deny_frozen_access(self);
15716      Opal.hash_rehash(self);
15717      return self;
15718
15719    });
15720
15721    $def(self, '$reject', function $$reject() {
15722      var block = $$reject.$$p || nil, self = this;
15723
15724      $$reject.$$p = null;
15725      if (!$truthy(block)) {
15726        return $send(self, 'enum_for', ["reject"], function $$28(){var self = $$28.$$s == null ? this : $$28.$$s;
15727
15728          return self.$size()}, {$$s: self})
15729      }
15730      var hash = $hash();
15731
15732      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15733        key = keys[i];
15734
15735        if (key.$$is_string) {
15736          value = self.$$smap[key];
15737        } else {
15738          value = key.value;
15739          key = key.key;
15740        }
15741
15742        obj = block(key, value);
15743
15744        if (obj === false || obj === nil) {
15745          $hash_put(hash, key, value);
15746        }
15747      }
15748
15749      return hash;
15750    });
15751
15752    $def(self, '$reject!', function $Hash_reject$excl$29() {
15753      var block = $Hash_reject$excl$29.$$p || nil, self = this;
15754
15755      $Hash_reject$excl$29.$$p = null;
15756      if (!$truthy(block)) {
15757        return $send(self, 'enum_for', ["reject!"], function $$30(){var self = $$30.$$s == null ? this : $$30.$$s;
15758
15759          return self.$size()}, {$$s: self})
15760      }
15761      $deny_frozen_access(self);
15762
15763      var changes_were_made = false;
15764
15765      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15766        key = keys[i];
15767
15768        if (key.$$is_string) {
15769          value = self.$$smap[key];
15770        } else {
15771          value = key.value;
15772          key = key.key;
15773        }
15774
15775        obj = block(key, value);
15776
15777        if (obj !== false && obj !== nil) {
15778          if ($hash_delete(self, key) !== undefined) {
15779            changes_were_made = true;
15780            length--;
15781            i--;
15782          }
15783        }
15784      }
15785
15786      return changes_were_made ? self : nil;
15787    });
15788
15789    $def(self, '$replace', function $$replace(other) {
15790      var self = this;
15791
15792
15793      $deny_frozen_access(self);      other = $Opal['$coerce_to!'](other, $$$('Hash'), "to_hash");
15794
15795      $hash_init(self);
15796
15797      for (var i = 0, other_keys = other.$$keys, length = other_keys.length, key, value, other_value; i < length; i++) {
15798        key = other_keys[i];
15799
15800        if (key.$$is_string) {
15801          other_value = other.$$smap[key];
15802        } else {
15803          other_value = key.value;
15804          key = key.key;
15805        }
15806
15807        $hash_put(self, key, other_value);
15808      }
15809      if ($truthy(other.$default_proc())) {
15810        self['$default_proc='](other.$default_proc());
15811      } else {
15812        self['$default='](other.$default());
15813      }      return self;
15814    });
15815
15816    $def(self, '$select', function $$select() {
15817      var block = $$select.$$p || nil, self = this;
15818
15819      $$select.$$p = null;
15820      if (!$truthy(block)) {
15821        return $send(self, 'enum_for', ["select"], function $$31(){var self = $$31.$$s == null ? this : $$31.$$s;
15822
15823          return self.$size()}, {$$s: self})
15824      }
15825      var hash = $hash();
15826
15827      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15828        key = keys[i];
15829
15830        if (key.$$is_string) {
15831          value = self.$$smap[key];
15832        } else {
15833          value = key.value;
15834          key = key.key;
15835        }
15836
15837        obj = block(key, value);
15838
15839        if (obj !== false && obj !== nil) {
15840          $hash_put(hash, key, value);
15841        }
15842      }
15843
15844      return hash;
15845    });
15846
15847    $def(self, '$select!', function $Hash_select$excl$32() {
15848      var block = $Hash_select$excl$32.$$p || nil, self = this;
15849
15850      $Hash_select$excl$32.$$p = null;
15851      if (!$truthy(block)) {
15852        return $send(self, 'enum_for', ["select!"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s;
15853
15854          return self.$size()}, {$$s: self})
15855      }
15856      $deny_frozen_access(self);
15857
15858      var result = nil;
15859
15860      for (var i = 0, keys = self.$$keys, length = keys.length, key, value, obj; i < length; i++) {
15861        key = keys[i];
15862
15863        if (key.$$is_string) {
15864          value = self.$$smap[key];
15865        } else {
15866          value = key.value;
15867          key = key.key;
15868        }
15869
15870        obj = block(key, value);
15871
15872        if (obj === false || obj === nil) {
15873          if ($hash_delete(self, key) !== undefined) {
15874            length--;
15875            i--;
15876          }
15877          result = self;
15878        }
15879      }
15880
15881      return result;
15882    });
15883
15884    $def(self, '$shift', function $$shift() {
15885      var self = this;
15886
15887
15888      $deny_frozen_access(self);
15889      var keys = self.$$keys,
15890          key;
15891
15892      if (keys.length > 0) {
15893        key = keys[0];
15894
15895        key = key.$$is_string ? key : key.key;
15896
15897        return [key, $hash_delete(self, key)];
15898      }
15899
15900      return nil;
15901
15902    });
15903
15904    $def(self, '$slice', function $$slice($a) {
15905      var $post_args, keys, self = this;
15906
15907
15908      $post_args = $slice(arguments);
15909      keys = $post_args;
15910
15911      var result = $hash();
15912
15913      for (var i = 0, length = keys.length; i < length; i++) {
15914        var key = keys[i], value = $hash_get(self, key);
15915
15916        if (value !== undefined) {
15917          $hash_put(result, key, value);
15918        }
15919      }
15920
15921      return result;
15922    }, -1);
15923
15924    $def(self, '$to_a', function $$to_a() {
15925      var self = this;
15926
15927
15928      var result = [];
15929
15930      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15931        key = keys[i];
15932
15933        if (key.$$is_string) {
15934          value = self.$$smap[key];
15935        } else {
15936          value = key.value;
15937          key = key.key;
15938        }
15939
15940        result.push([key, value]);
15941      }
15942
15943      return result;
15944
15945    });
15946
15947    $def(self, '$to_h', function $$to_h() {
15948      var block = $$to_h.$$p || nil, self = this;
15949
15950      $$to_h.$$p = null;
15951      if ((block !== nil)) {
15952        return $send(self, 'map', [], block.$to_proc()).$to_h()
15953      }
15954      if (self.$$class === Opal.Hash) {
15955        return self;
15956      }
15957
15958      var hash = new Opal.Hash();
15959
15960      $hash_init(hash);
15961      Opal.hash_clone(self, hash);
15962
15963      return hash;
15964    });
15965
15966    $def(self, '$to_hash', $return_self);
15967
15968    $def(self, '$to_proc', function $$to_proc() {
15969      var self = this;
15970
15971      return $send(self, 'proc', [], function $$34(key){var self = $$34.$$s == null ? this : $$34.$$s;
15972
15973        if (key == null) {
15974          $Kernel.$raise($$$('ArgumentError'), "no key given");
15975        }
15976        return self['$[]'](key);}, {$$arity: -1, $$s: self})
15977    });
15978
15979    $def(self, '$transform_keys', function $$transform_keys() {
15980      var block = $$transform_keys.$$p || nil, self = this;
15981
15982      $$transform_keys.$$p = null;
15983      if (!$truthy(block)) {
15984        return $send(self, 'enum_for', ["transform_keys"], function $$35(){var self = $$35.$$s == null ? this : $$35.$$s;
15985
15986          return self.$size()}, {$$s: self})
15987      }
15988      var result = $hash();
15989
15990      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
15991        key = keys[i];
15992
15993        if (key.$$is_string) {
15994          value = self.$$smap[key];
15995        } else {
15996          value = key.value;
15997          key = key.key;
15998        }
15999
16000        key = $yield1(block, key);
16001
16002        $hash_put(result, key, value);
16003      }
16004
16005      return result;
16006    });
16007
16008    $def(self, '$transform_keys!', function $Hash_transform_keys$excl$36() {
16009      var block = $Hash_transform_keys$excl$36.$$p || nil, self = this;
16010
16011      $Hash_transform_keys$excl$36.$$p = null;
16012      if (!$truthy(block)) {
16013        return $send(self, 'enum_for', ["transform_keys!"], function $$37(){var self = $$37.$$s == null ? this : $$37.$$s;
16014
16015          return self.$size()}, {$$s: self})
16016      }
16017      $deny_frozen_access(self);
16018
16019      var keys = Opal.slice(self.$$keys),
16020          i, length = keys.length, key, value, new_key;
16021
16022      for (i = 0; i < length; i++) {
16023        key = keys[i];
16024
16025        if (key.$$is_string) {
16026          value = self.$$smap[key];
16027        } else {
16028          value = key.value;
16029          key = key.key;
16030        }
16031
16032        new_key = $yield1(block, key);
16033
16034        $hash_delete(self, key);
16035        $hash_put(self, new_key, value);
16036      }
16037
16038      return self;
16039    });
16040
16041    $def(self, '$transform_values', function $$transform_values() {
16042      var block = $$transform_values.$$p || nil, self = this;
16043
16044      $$transform_values.$$p = null;
16045      if (!$truthy(block)) {
16046        return $send(self, 'enum_for', ["transform_values"], function $$38(){var self = $$38.$$s == null ? this : $$38.$$s;
16047
16048          return self.$size()}, {$$s: self})
16049      }
16050      var result = $hash();
16051
16052      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
16053        key = keys[i];
16054
16055        if (key.$$is_string) {
16056          value = self.$$smap[key];
16057        } else {
16058          value = key.value;
16059          key = key.key;
16060        }
16061
16062        value = $yield1(block, value);
16063
16064        $hash_put(result, key, value);
16065      }
16066
16067      return result;
16068    });
16069
16070    $def(self, '$transform_values!', function $Hash_transform_values$excl$39() {
16071      var block = $Hash_transform_values$excl$39.$$p || nil, self = this;
16072
16073      $Hash_transform_values$excl$39.$$p = null;
16074      if (!$truthy(block)) {
16075        return $send(self, 'enum_for', ["transform_values!"], function $$40(){var self = $$40.$$s == null ? this : $$40.$$s;
16076
16077          return self.$size()}, {$$s: self})
16078      }
16079      $deny_frozen_access(self);
16080
16081      for (var i = 0, keys = self.$$keys, length = keys.length, key, value; i < length; i++) {
16082        key = keys[i];
16083
16084        if (key.$$is_string) {
16085          value = self.$$smap[key];
16086        } else {
16087          value = key.value;
16088          key = key.key;
16089        }
16090
16091        value = $yield1(block, value);
16092
16093        $hash_put(self, key, value);
16094      }
16095
16096      return self;
16097    });
16098
16099    $def(self, '$values', function $$values() {
16100      var self = this;
16101
16102
16103      var result = [];
16104
16105      for (var i = 0, keys = self.$$keys, length = keys.length, key; i < length; i++) {
16106        key = keys[i];
16107
16108        if (key.$$is_string) {
16109          result.push(self.$$smap[key]);
16110        } else {
16111          result.push(key.value);
16112        }
16113      }
16114
16115      return result;
16116
16117    });
16118    $alias(self, "dup", "clone");
16119    $alias(self, "each_pair", "each");
16120    $alias(self, "eql?", "==");
16121    $alias(self, "filter", "select");
16122    $alias(self, "filter!", "select!");
16123    $alias(self, "include?", "has_key?");
16124    $alias(self, "indices", "indexes");
16125    $alias(self, "key", "index");
16126    $alias(self, "key?", "has_key?");
16127    $alias(self, "member?", "has_key?");
16128    $alias(self, "size", "length");
16129    $alias(self, "store", "[]=");
16130    $alias(self, "to_s", "inspect");
16131    $alias(self, "update", "merge!");
16132    $alias(self, "value?", "has_value?");
16133    return $alias(self, "values_at", "indexes");
16134  })('::', null, $nesting);
16135};
16136
16137Opal.modules["corelib/number"] = function(Opal) {/* Generated by Opal 1.7.3 */
16138  var $klass = Opal.klass, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $not = Opal.not, $rb_lt = Opal.rb_lt, $alias = Opal.alias, $send2 = Opal.send2, $find_super = Opal.find_super, $send = Opal.send, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $eqeq = Opal.eqeq, $return_self = Opal.return_self, $rb_divide = Opal.rb_divide, $to_ary = Opal.to_ary, $rb_times = Opal.rb_times, $rb_le = Opal.rb_le, $rb_ge = Opal.rb_ge, $return_val = Opal.return_val, $const_set = Opal.const_set, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
16139
16140  Opal.add_stubs('require,bridge,raise,name,class,Float,respond_to?,coerce_to!,__coerced__,===,>,!,**,new,<,to_f,==,nan?,infinite?,enum_for,+,-,gcd,lcm,%,/,frexp,to_i,ldexp,rationalize,*,<<,to_r,truncate,-@,size,<=,>=,inspect,angle,to_s,is_a?,abs,__id__,next,coerce_to?');
16141
16142  self.$require("corelib/numeric");
16143  (function($base, $super, $parent_nesting) {
16144    var self = $klass($base, $super, 'Number');
16145
16146
16147    $Opal.$bridge(Number, self);
16148    Opal.prop(self.$$prototype, '$$is_number', true);
16149    self.$$is_number_class = true;
16150    (function(self, $parent_nesting) {
16151
16152
16153
16154      $def(self, '$allocate', function $$allocate() {
16155        var self = this;
16156
16157        return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name()))
16158      });
16159
16160
16161      Opal.udef(self, '$' + "new");      return nil;    })(Opal.get_singleton_class(self));
16162
16163    $def(self, '$coerce', function $$coerce(other) {
16164      var self = this;
16165
16166
16167      if (other === nil) {
16168        $Kernel.$raise($$$('TypeError'), "can't convert " + (other.$class()) + " into Float");
16169      }
16170      else if (other.$$is_string) {
16171        return [$Kernel.$Float(other), self];
16172      }
16173      else if (other['$respond_to?']("to_f")) {
16174        return [$Opal['$coerce_to!'](other, $$$('Float'), "to_f"), self];
16175      }
16176      else if (other.$$is_number) {
16177        return [other, self];
16178      }
16179      else {
16180        $Kernel.$raise($$$('TypeError'), "can't convert " + (other.$class()) + " into Float");
16181      }
16182
16183    });
16184
16185    $def(self, '$__id__', function $$__id__() {
16186      var self = this;
16187
16188      return (self * 2) + 1;
16189    });
16190
16191    $def(self, '$+', function $Number_$plus$1(other) {
16192      var self = this;
16193
16194
16195      if (other.$$is_number) {
16196        return self + other;
16197      }
16198      else {
16199        return self.$__coerced__("+", other);
16200      }
16201
16202    });
16203
16204    $def(self, '$-', function $Number_$minus$2(other) {
16205      var self = this;
16206
16207
16208      if (other.$$is_number) {
16209        return self - other;
16210      }
16211      else {
16212        return self.$__coerced__("-", other);
16213      }
16214
16215    });
16216
16217    $def(self, '$*', function $Number_$$3(other) {
16218      var self = this;
16219
16220
16221      if (other.$$is_number) {
16222        return self * other;
16223      }
16224      else {
16225        return self.$__coerced__("*", other);
16226      }
16227
16228    });
16229
16230    $def(self, '$/', function $Number_$slash$4(other) {
16231      var self = this;
16232
16233
16234      if (other.$$is_number) {
16235        return self / other;
16236      }
16237      else {
16238        return self.$__coerced__("/", other);
16239      }
16240
16241    });
16242
16243    $def(self, '$%', function $Number_$percent$5(other) {
16244      var self = this;
16245
16246
16247      if (other.$$is_number) {
16248        if (other == -Infinity) {
16249          return other;
16250        }
16251        else if (other == 0) {
16252          $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0");
16253        }
16254        else if (other < 0 || self < 0) {
16255          return (self % other + other) % other;
16256        }
16257        else {
16258          return self % other;
16259        }
16260      }
16261      else {
16262        return self.$__coerced__("%", other);
16263      }
16264
16265    });
16266
16267    $def(self, '$&', function $Number_$$6(other) {
16268      var self = this;
16269
16270
16271      if (other.$$is_number) {
16272        return self & other;
16273      }
16274      else {
16275        return self.$__coerced__("&", other);
16276      }
16277
16278    });
16279
16280    $def(self, '$|', function $Number_$$7(other) {
16281      var self = this;
16282
16283
16284      if (other.$$is_number) {
16285        return self | other;
16286      }
16287      else {
16288        return self.$__coerced__("|", other);
16289      }
16290
16291    });
16292
16293    $def(self, '$^', function $Number_$$8(other) {
16294      var self = this;
16295
16296
16297      if (other.$$is_number) {
16298        return self ^ other;
16299      }
16300      else {
16301        return self.$__coerced__("^", other);
16302      }
16303
16304    });
16305
16306    $def(self, '$<', function $Number_$lt$9(other) {
16307      var self = this;
16308
16309
16310      if (other.$$is_number) {
16311        return self < other;
16312      }
16313      else {
16314        return self.$__coerced__("<", other);
16315      }
16316
16317    });
16318
16319    $def(self, '$<=', function $Number_$lt_eq$10(other) {
16320      var self = this;
16321
16322
16323      if (other.$$is_number) {
16324        return self <= other;
16325      }
16326      else {
16327        return self.$__coerced__("<=", other);
16328      }
16329
16330    });
16331
16332    $def(self, '$>', function $Number_$gt$11(other) {
16333      var self = this;
16334
16335
16336      if (other.$$is_number) {
16337        return self > other;
16338      }
16339      else {
16340        return self.$__coerced__(">", other);
16341      }
16342
16343    });
16344
16345    $def(self, '$>=', function $Number_$gt_eq$12(other) {
16346      var self = this;
16347
16348
16349      if (other.$$is_number) {
16350        return self >= other;
16351      }
16352      else {
16353        return self.$__coerced__(">=", other);
16354      }
16355
16356    });
16357
16358    var spaceship_operator = function(self, other) {
16359      if (other.$$is_number) {
16360        if (isNaN(self) || isNaN(other)) {
16361          return nil;
16362        }
16363
16364        if (self > other) {
16365          return 1;
16366        } else if (self < other) {
16367          return -1;
16368        } else {
16369          return 0;
16370        }
16371      }
16372      else {
16373        return self.$__coerced__("<=>", other);
16374      }
16375    }
16376  ;
16377
16378    $def(self, '$<=>', function $Number_$lt_eq_gt$13(other) {
16379      var self = this;
16380
16381      try {
16382        return spaceship_operator(self, other);
16383      } catch ($err) {
16384        if (Opal.rescue($err, [$$$('ArgumentError')])) {
16385          try {
16386            return nil
16387          } finally { Opal.pop_exception(); }
16388        } else { throw $err; }
16389      }
16390    });
16391
16392    $def(self, '$<<', function $Number_$lt$lt$14(count) {
16393      var self = this;
16394
16395
16396      count = $Opal['$coerce_to!'](count, $$$('Integer'), "to_int");
16397      return count > 0 ? self << count : self >> -count;
16398    });
16399
16400    $def(self, '$>>', function $Number_$gt$gt$15(count) {
16401      var self = this;
16402
16403
16404      count = $Opal['$coerce_to!'](count, $$$('Integer'), "to_int");
16405      return count > 0 ? self >> count : self << -count;
16406    });
16407
16408    $def(self, '$[]', function $Number_$$$16(bit) {
16409      var self = this;
16410
16411
16412      bit = $Opal['$coerce_to!'](bit, $$$('Integer'), "to_int");
16413
16414      if (bit < 0) {
16415        return 0;
16416      }
16417      if (bit >= 32) {
16418        return self < 0 ? 1 : 0;
16419      }
16420      return (self >> bit) & 1;
16421    });
16422
16423    $def(self, '$+@', function $Number_$plus$$17() {
16424      var self = this;
16425
16426      return +self;
16427    });
16428
16429    $def(self, '$-@', function $Number_$minus$$18() {
16430      var self = this;
16431
16432      return -self;
16433    });
16434
16435    $def(self, '$~', function $Number_$$19() {
16436      var self = this;
16437
16438      return ~self;
16439    });
16440
16441    $def(self, '$**', function $Number_$$$20(other) {
16442      var self = this;
16443
16444      if ($eqeqeq($$$('Integer'), other)) {
16445        if (($not($$$('Integer')['$==='](self)) || ($truthy($rb_gt(other, 0))))) {
16446          return Math.pow(self, other);
16447        } else {
16448          return $$$('Rational').$new(self, 1)['$**'](other)
16449        }
16450      } else if (($rb_lt(self, 0) && (($eqeqeq($$$('Float'), other) || ($eqeqeq($$$('Rational'), other)))))) {
16451        return $$$('Complex').$new(self, 0)['$**'](other.$to_f())
16452      } else if ($truthy(other.$$is_number != null)) {
16453        return Math.pow(self, other);
16454      } else {
16455        return self.$__coerced__("**", other)
16456      }
16457    });
16458
16459    $def(self, '$==', function $Number_$eq_eq$21(other) {
16460      var self = this;
16461
16462
16463      if (other.$$is_number) {
16464        return self.valueOf() === other.valueOf();
16465      }
16466      else if (other['$respond_to?']("==")) {
16467        return other['$=='](self);
16468      }
16469      else {
16470        return false;
16471      }
16472
16473    });
16474    $alias(self, "===", "==");
16475
16476    $def(self, '$abs', function $$abs() {
16477      var self = this;
16478
16479      return Math.abs(self);
16480    });
16481
16482    $def(self, '$abs2', function $$abs2() {
16483      var self = this;
16484
16485      return Math.abs(self * self);
16486    });
16487
16488    $def(self, '$allbits?', function $Number_allbits$ques$22(mask) {
16489      var self = this;
16490
16491
16492      mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int");
16493      return (self & mask) == mask;    });
16494
16495    $def(self, '$anybits?', function $Number_anybits$ques$23(mask) {
16496      var self = this;
16497
16498
16499      mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int");
16500      return (self & mask) !== 0;    });
16501
16502    $def(self, '$angle', function $$angle() {
16503      var self = this;
16504
16505
16506      if ($truthy(self['$nan?']())) {
16507        return self
16508      }
16509      if (self == 0) {
16510        if (1 / self > 0) {
16511          return 0;
16512        }
16513        else {
16514          return Math.PI;
16515        }
16516      }
16517      else if (self < 0) {
16518        return Math.PI;
16519      }
16520      else {
16521        return 0;
16522      }
16523    });
16524
16525    $def(self, '$bit_length', function $$bit_length() {
16526      var self = this;
16527
16528
16529      if (!$eqeqeq($$$('Integer'), self)) {
16530        $Kernel.$raise($$$('NoMethodError').$new("undefined method `bit_length` for " + (self) + ":Float", "bit_length"));
16531      }
16532      if (self === 0 || self === -1) {
16533        return 0;
16534      }
16535
16536      var result = 0,
16537          value  = self < 0 ? ~self : self;
16538
16539      while (value != 0) {
16540        result   += 1;
16541        value  >>>= 1;
16542      }
16543
16544      return result;
16545    });
16546
16547    $def(self, '$ceil', function $$ceil(ndigits) {
16548      var self = this;
16549
16550
16551      if (ndigits == null) ndigits = 0;
16552
16553      var f = self.$to_f();
16554
16555      if (f % 1 === 0 && ndigits >= 0) {
16556        return f;
16557      }
16558
16559      var factor = Math.pow(10, ndigits),
16560          result = Math.ceil(f * factor) / factor;
16561
16562      if (f % 1 === 0) {
16563        result = Math.round(result);
16564      }
16565
16566      return result;
16567    }, -1);
16568
16569    $def(self, '$chr', function $$chr(encoding) {
16570      var self = this;
16571      return Opal.enc(String.fromCharCode(self), encoding || "BINARY");    }, -1);
16572
16573    $def(self, '$denominator', function $$denominator() {
16574      var $yield = $$denominator.$$p || nil, self = this;
16575
16576      $$denominator.$$p = null;
16577      if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) {
16578        return 1
16579      } else {
16580        return $send2(self, $find_super(self, 'denominator', $$denominator, false, true), 'denominator', [], $yield)
16581      }
16582    });
16583
16584    $def(self, '$downto', function $$downto(stop) {
16585      var block = $$downto.$$p || nil, self = this;
16586
16587      $$downto.$$p = null;
16588      if (!(block !== nil)) {
16589        return $send(self, 'enum_for', ["downto", stop], function $$24(){var self = $$24.$$s == null ? this : $$24.$$s;
16590
16591
16592          if (!$eqeqeq($$$('Numeric'), stop)) {
16593            $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed");
16594          }          if ($truthy($rb_gt(stop, self))) {
16595            return 0
16596          } else {
16597            return $rb_plus($rb_minus(self, stop), 1)
16598          }}, {$$s: self})
16599      }
16600      if (!stop.$$is_number) {
16601        $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed");
16602      }
16603      for (var i = self; i >= stop; i--) {
16604        block(i);
16605      }
16606      return self;
16607    });
16608
16609    $def(self, '$equal?', function $Number_equal$ques$25(other) {
16610      var self = this, $ret_or_1 = nil;
16611
16612      if ($truthy(($ret_or_1 = self['$=='](other)))) {
16613        return $ret_or_1
16614      } else {
16615        return isNaN(self) && isNaN(other);
16616      }
16617    });
16618
16619    $def(self, '$even?', function $Number_even$ques$26() {
16620      var self = this;
16621
16622      return self % 2 === 0;
16623    });
16624
16625    $def(self, '$floor', function $$floor(ndigits) {
16626      var self = this;
16627
16628
16629      if (ndigits == null) ndigits = 0;
16630
16631      var f = self.$to_f();
16632
16633      if (f % 1 === 0 && ndigits >= 0) {
16634        return f;
16635      }
16636
16637      var factor = Math.pow(10, ndigits),
16638          result = Math.floor(f * factor) / factor;
16639
16640      if (f % 1 === 0) {
16641        result = Math.round(result);
16642      }
16643
16644      return result;
16645    }, -1);
16646
16647    $def(self, '$gcd', function $$gcd(other) {
16648      var self = this;
16649
16650
16651      if (!$eqeqeq($$$('Integer'), other)) {
16652        $Kernel.$raise($$$('TypeError'), "not an integer");
16653      }
16654      var min = Math.abs(self),
16655          max = Math.abs(other);
16656
16657      while (min > 0) {
16658        var tmp = min;
16659
16660        min = max % min;
16661        max = tmp;
16662      }
16663
16664      return max;
16665    });
16666
16667    $def(self, '$gcdlcm', function $$gcdlcm(other) {
16668      var self = this;
16669
16670      return [self.$gcd(other), self.$lcm(other)]
16671    });
16672
16673    $def(self, '$integer?', function $Number_integer$ques$27() {
16674      var self = this;
16675
16676      return self % 1 === 0;
16677    });
16678
16679    $def(self, '$is_a?', function $Number_is_a$ques$28(klass) {
16680      var $yield = $Number_is_a$ques$28.$$p || nil, self = this;
16681
16682      $Number_is_a$ques$28.$$p = null;
16683
16684      if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) {
16685        return true
16686      }      if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) {
16687        return true
16688      }      if (($eqeq(klass, $$$('Float')) && ($eqeqeq($$$('Float'), self)))) {
16689        return true
16690      }      return $send2(self, $find_super(self, 'is_a?', $Number_is_a$ques$28, false, true), 'is_a?', [klass], $yield);
16691    });
16692
16693    $def(self, '$instance_of?', function $Number_instance_of$ques$29(klass) {
16694      var $yield = $Number_instance_of$ques$29.$$p || nil, self = this;
16695
16696      $Number_instance_of$ques$29.$$p = null;
16697
16698      if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) {
16699        return true
16700      }      if (($eqeq(klass, $$$('Integer')) && ($eqeqeq($$$('Integer'), self)))) {
16701        return true
16702      }      if (($eqeq(klass, $$$('Float')) && ($eqeqeq($$$('Float'), self)))) {
16703        return true
16704      }      return $send2(self, $find_super(self, 'instance_of?', $Number_instance_of$ques$29, false, true), 'instance_of?', [klass], $yield);
16705    });
16706
16707    $def(self, '$lcm', function $$lcm(other) {
16708      var self = this;
16709
16710
16711      if (!$eqeqeq($$$('Integer'), other)) {
16712        $Kernel.$raise($$$('TypeError'), "not an integer");
16713      }
16714      if (self == 0 || other == 0) {
16715        return 0;
16716      }
16717      else {
16718        return Math.abs(self * other / self.$gcd(other));
16719      }
16720    });
16721
16722    $def(self, '$next', function $$next() {
16723      var self = this;
16724
16725      return self + 1;
16726    });
16727
16728    $def(self, '$nobits?', function $Number_nobits$ques$30(mask) {
16729      var self = this;
16730
16731
16732      mask = $Opal['$coerce_to!'](mask, $$$('Integer'), "to_int");
16733      return (self & mask) == 0;    });
16734
16735    $def(self, '$nonzero?', function $Number_nonzero$ques$31() {
16736      var self = this;
16737
16738      return self == 0 ? nil : self;
16739    });
16740
16741    $def(self, '$numerator', function $$numerator() {
16742      var $yield = $$numerator.$$p || nil, self = this;
16743
16744      $$numerator.$$p = null;
16745      if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) {
16746        return self
16747      } else {
16748        return $send2(self, $find_super(self, 'numerator', $$numerator, false, true), 'numerator', [], $yield)
16749      }
16750    });
16751
16752    $def(self, '$odd?', function $Number_odd$ques$32() {
16753      var self = this;
16754
16755      return self % 2 !== 0;
16756    });
16757
16758    $def(self, '$ord', $return_self);
16759
16760    $def(self, '$pow', function $$pow(b, m) {
16761      var self = this;
16762
16763      if (self == 0) {
16764        $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0");
16765      }
16766
16767      if (m === undefined) {
16768        return self['$**'](b);
16769      } else {
16770        if (!($$$('Integer')['$==='](b))) {
16771          $Kernel.$raise($$$('TypeError'), "Integer#pow() 2nd argument not allowed unless a 1st argument is integer");
16772        }
16773
16774        if (b < 0) {
16775          $Kernel.$raise($$$('TypeError'), "Integer#pow() 1st argument cannot be negative when 2nd argument specified");
16776        }
16777
16778        if (!($$$('Integer')['$==='](m))) {
16779          $Kernel.$raise($$$('TypeError'), "Integer#pow() 2nd argument not allowed unless all arguments are integers");
16780        }
16781
16782        if (m === 0) {
16783          $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0");
16784        }
16785
16786        return self['$**'](b)['$%'](m)
16787      }
16788    }, -2);
16789
16790    $def(self, '$pred', function $$pred() {
16791      var self = this;
16792
16793      return self - 1;
16794    });
16795
16796    $def(self, '$quo', function $$quo(other) {
16797      var $yield = $$quo.$$p || nil, self = this;
16798
16799      $$quo.$$p = null;
16800      if ($eqeqeq($$$('Integer'), self)) {
16801        return $send2(self, $find_super(self, 'quo', $$quo, false, true), 'quo', [other], $yield)
16802      } else {
16803        return $rb_divide(self, other)
16804      }
16805    });
16806
16807    $def(self, '$rationalize', function $$rationalize(eps) {
16808      var $a, $b, self = this, f = nil, n = nil;
16809
16810      if (arguments.length > 1) {
16811        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)");
16812      }
16813      if ($eqeqeq($$$('Integer'), self)) {
16814        return $$$('Rational').$new(self, 1)
16815      } else if ($truthy(self['$infinite?']())) {
16816        return $Kernel.$raise($$$('FloatDomainError'), "Infinity")
16817      } else if ($truthy(self['$nan?']())) {
16818        return $Kernel.$raise($$$('FloatDomainError'), "NaN")
16819      } else if ($truthy(eps == null)) {
16820
16821        $b = $$$('Math').$frexp(self), $a = $to_ary($b), (f = ($a[0] == null ? nil : $a[0])), (n = ($a[1] == null ? nil : $a[1]));
16822        f = $$$('Math').$ldexp(f, $$$($$$('Float'), 'MANT_DIG')).$to_i();
16823        n = $rb_minus(n, $$$($$$('Float'), 'MANT_DIG'));
16824        return $$$('Rational').$new($rb_times(2, f), (1)['$<<']($rb_minus(1, n))).$rationalize($$$('Rational').$new(1, (1)['$<<']($rb_minus(1, n))));
16825      } else {
16826        return self.$to_r().$rationalize(eps)
16827      }    }, -1);
16828
16829    $def(self, '$remainder', function $$remainder(y) {
16830      var self = this;
16831
16832      return $rb_minus(self, $rb_times(y, $rb_divide(self, y).$truncate()))
16833    });
16834
16835    $def(self, '$round', function $$round(ndigits) {
16836      var $a, $b, self = this, exp = nil;
16837      if ($eqeqeq($$$('Integer'), self)) {
16838
16839        if ($truthy(ndigits == null)) {
16840          return self
16841        }        if (($eqeqeq($$$('Float'), ndigits) && ($truthy(ndigits['$infinite?']())))) {
16842          $Kernel.$raise($$$('RangeError'), "Infinity");
16843        }        ndigits = $Opal['$coerce_to!'](ndigits, $$$('Integer'), "to_int");
16844        if ($truthy($rb_lt(ndigits, $$$($$$('Integer'), 'MIN')))) {
16845          $Kernel.$raise($$$('RangeError'), "out of bounds");
16846        }        if ($truthy(ndigits >= 0)) {
16847          return self
16848        }        ndigits = ndigits['$-@']();
16849
16850        if (0.415241 * ndigits - 0.125 > self.$size()) {
16851          return 0;
16852        }
16853
16854        var f = Math.pow(10, ndigits),
16855            x = Math.floor((Math.abs(self) + f / 2) / f) * f;
16856
16857        return self < 0 ? -x : x;
16858      } else {
16859
16860        if (($truthy(self['$nan?']()) && ($truthy(ndigits == null)))) {
16861          $Kernel.$raise($$$('FloatDomainError'), "NaN");
16862        }        ndigits = $Opal['$coerce_to!'](ndigits || 0, $$$('Integer'), "to_int");
16863        if ($truthy($rb_le(ndigits, 0))) {
16864          if ($truthy(self['$nan?']())) {
16865            $Kernel.$raise($$$('RangeError'), "NaN");
16866          } else if ($truthy(self['$infinite?']())) {
16867            $Kernel.$raise($$$('FloatDomainError'), "Infinity");
16868          }
16869        } else if ($eqeq(ndigits, 0)) {
16870          return Math.round(self)
16871        } else if (($truthy(self['$nan?']()) || ($truthy(self['$infinite?']())))) {
16872          return self
16873        }        $b = $$$('Math').$frexp(self), $a = $to_ary($b), (($a[0] == null ? nil : $a[0])), (exp = ($a[1] == null ? nil : $a[1]));
16874        if ($truthy($rb_ge(ndigits, $rb_minus($rb_plus($$$($$$('Float'), 'DIG'), 2), ($truthy($rb_gt(exp, 0)) ? ($rb_divide(exp, 4)) : ($rb_minus($rb_divide(exp, 3), 1))))))) {
16875          return self
16876        }        if ($truthy($rb_lt(ndigits, ($truthy($rb_gt(exp, 0)) ? ($rb_plus($rb_divide(exp, 3), 1)) : ($rb_divide(exp, 4)))['$-@']()))) {
16877          return 0
16878        }        return Math.round(self * Math.pow(10, ndigits)) / Math.pow(10, ndigits);      }    }, -1);
16879
16880    $def(self, '$times', function $$times() {
16881      var block = $$times.$$p || nil, self = this;
16882
16883      $$times.$$p = null;
16884      if (!$truthy(block)) {
16885        return $send(self, 'enum_for', ["times"], function $$33(){var self = $$33.$$s == null ? this : $$33.$$s;
16886
16887          return self}, {$$s: self})
16888      }
16889      for (var i = 0; i < self; i++) {
16890        block(i);
16891      }
16892      return self;
16893    });
16894
16895    $def(self, '$to_f', $return_self);
16896
16897    $def(self, '$to_i', function $$to_i() {
16898      var self = this;
16899
16900      return self < 0 ? Math.ceil(self) : Math.floor(self);
16901    });
16902
16903    $def(self, '$to_r', function $$to_r() {
16904      var $a, $b, self = this, f = nil, e = nil;
16905
16906      if ($eqeqeq($$$('Integer'), self)) {
16907        return $$$('Rational').$new(self, 1)
16908      } else {
16909
16910        $b = $$$('Math').$frexp(self), $a = $to_ary($b), (f = ($a[0] == null ? nil : $a[0])), (e = ($a[1] == null ? nil : $a[1]));
16911        f = $$$('Math').$ldexp(f, $$$($$$('Float'), 'MANT_DIG')).$to_i();
16912        e = $rb_minus(e, $$$($$$('Float'), 'MANT_DIG'));
16913        return $rb_times(f, $$$($$$('Float'), 'RADIX')['$**'](e)).$to_r();
16914      }
16915    });
16916
16917    $def(self, '$to_s', function $$to_s(base) {
16918      var self = this;
16919
16920
16921      if (base == null) base = 10;
16922      base = $Opal['$coerce_to!'](base, $$$('Integer'), "to_int");
16923      if (($truthy($rb_lt(base, 2)) || ($truthy($rb_gt(base, 36))))) {
16924        $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base));
16925      }      if (($eqeq(self, 0) && ($truthy(1/self === -Infinity)))) {
16926        return "-0.0"
16927      }      return self.toString(base);    }, -1);
16928
16929    $def(self, '$truncate', function $$truncate(ndigits) {
16930      var self = this;
16931
16932
16933      if (ndigits == null) ndigits = 0;
16934
16935      var f = self.$to_f();
16936
16937      if (f % 1 === 0 && ndigits >= 0) {
16938        return f;
16939      }
16940
16941      var factor = Math.pow(10, ndigits),
16942          result = parseInt(f * factor, 10) / factor;
16943
16944      if (f % 1 === 0) {
16945        result = Math.round(result);
16946      }
16947
16948      return result;
16949    }, -1);
16950
16951    $def(self, '$digits', function $$digits(base) {
16952      var self = this;
16953
16954
16955      if (base == null) base = 10;
16956      if ($rb_lt(self, 0)) {
16957        $Kernel.$raise($$$($$$('Math'), 'DomainError'), "out of domain");
16958      }      base = $Opal['$coerce_to!'](base, $$$('Integer'), "to_int");
16959      if ($truthy($rb_lt(base, 2))) {
16960        $Kernel.$raise($$$('ArgumentError'), "invalid radix " + (base));
16961      }
16962      if (self != parseInt(self)) $Kernel.$raise($$$('NoMethodError'), "undefined method `digits' for " + (self.$inspect()));
16963
16964      var value = self, result = [];
16965
16966      if (self == 0) {
16967        return [0];
16968      }
16969
16970      while (value != 0) {
16971        result.push(value % base);
16972        value = parseInt(value / base, 10);
16973      }
16974
16975      return result;
16976    }, -1);
16977
16978    $def(self, '$divmod', function $$divmod(other) {
16979      var $yield = $$divmod.$$p || nil, self = this;
16980
16981      $$divmod.$$p = null;
16982      if (($truthy(self['$nan?']()) || ($truthy(other['$nan?']())))) {
16983        return $Kernel.$raise($$$('FloatDomainError'), "NaN")
16984      } else if ($truthy(self['$infinite?']())) {
16985        return $Kernel.$raise($$$('FloatDomainError'), "Infinity")
16986      } else {
16987        return $send2(self, $find_super(self, 'divmod', $$divmod, false, true), 'divmod', [other], $yield)
16988      }
16989    });
16990
16991    $def(self, '$upto', function $$upto(stop) {
16992      var block = $$upto.$$p || nil, self = this;
16993
16994      $$upto.$$p = null;
16995      if (!(block !== nil)) {
16996        return $send(self, 'enum_for', ["upto", stop], function $$34(){var self = $$34.$$s == null ? this : $$34.$$s;
16997
16998
16999          if (!$eqeqeq($$$('Numeric'), stop)) {
17000            $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed");
17001          }          if ($truthy($rb_lt(stop, self))) {
17002            return 0
17003          } else {
17004            return $rb_plus($rb_minus(stop, self), 1)
17005          }}, {$$s: self})
17006      }
17007      if (!stop.$$is_number) {
17008        $Kernel.$raise($$$('ArgumentError'), "comparison of " + (self.$class()) + " with " + (stop.$class()) + " failed");
17009      }
17010      for (var i = self; i <= stop; i++) {
17011        block(i);
17012      }
17013      return self;
17014    });
17015
17016    $def(self, '$zero?', function $Number_zero$ques$35() {
17017      var self = this;
17018
17019      return self == 0;
17020    });
17021
17022    $def(self, '$size', $return_val(4));
17023
17024    $def(self, '$nan?', function $Number_nan$ques$36() {
17025      var self = this;
17026
17027      return isNaN(self);
17028    });
17029
17030    $def(self, '$finite?', function $Number_finite$ques$37() {
17031      var self = this;
17032
17033      return self != Infinity && self != -Infinity && !isNaN(self);
17034    });
17035
17036    $def(self, '$infinite?', function $Number_infinite$ques$38() {
17037      var self = this;
17038
17039
17040      if (self == Infinity) {
17041        return +1;
17042      }
17043      else if (self == -Infinity) {
17044        return -1;
17045      }
17046      else {
17047        return nil;
17048      }
17049
17050    });
17051
17052    $def(self, '$positive?', function $Number_positive$ques$39() {
17053      var self = this;
17054
17055      return self != 0 && (self == Infinity || 1 / self > 0);
17056    });
17057
17058    $def(self, '$negative?', function $Number_negative$ques$40() {
17059      var self = this;
17060
17061      return self == -Infinity || 1 / self < 0;
17062    });
17063
17064    function numberToUint8Array(num) {
17065      var uint8array = new Uint8Array(8);
17066      new DataView(uint8array.buffer).setFloat64(0, num, true);
17067      return uint8array;
17068    }
17069
17070    function uint8ArrayToNumber(arr) {
17071      return new DataView(arr.buffer).getFloat64(0, true);
17072    }
17073
17074    function incrementNumberBit(num) {
17075      var arr = numberToUint8Array(num);
17076      for (var i = 0; i < arr.length; i++) {
17077        if (arr[i] === 0xff) {
17078          arr[i] = 0;
17079        } else {
17080          arr[i]++;
17081          break;
17082        }
17083      }
17084      return uint8ArrayToNumber(arr);
17085    }
17086
17087    function decrementNumberBit(num) {
17088      var arr = numberToUint8Array(num);
17089      for (var i = 0; i < arr.length; i++) {
17090        if (arr[i] === 0) {
17091          arr[i] = 0xff;
17092        } else {
17093          arr[i]--;
17094          break;
17095        }
17096      }
17097      return uint8ArrayToNumber(arr);
17098    }
17099
17100    $def(self, '$next_float', function $$next_float() {
17101      var self = this;
17102
17103
17104      if ($eqeq(self, $$$($$$('Float'), 'INFINITY'))) {
17105        return $$$($$$('Float'), 'INFINITY')
17106      }      if ($truthy(self['$nan?']())) {
17107        return $$$($$$('Float'), 'NAN')
17108      }      if ($rb_ge(self, 0)) {
17109        return incrementNumberBit(Math.abs(self));
17110      } else {
17111        return decrementNumberBit(self);
17112      }    });
17113
17114    $def(self, '$prev_float', function $$prev_float() {
17115      var self = this;
17116
17117
17118      if ($eqeq(self, $$$($$$('Float'), 'INFINITY')['$-@']())) {
17119        return $$$($$$('Float'), 'INFINITY')['$-@']()
17120      }      if ($truthy(self['$nan?']())) {
17121        return $$$($$$('Float'), 'NAN')
17122      }      if ($rb_gt(self, 0)) {
17123        return decrementNumberBit(self);
17124      } else {
17125        return -incrementNumberBit(Math.abs(self));
17126      }    });
17127    $alias(self, "arg", "angle");
17128    $alias(self, "eql?", "==");
17129    $alias(self, "fdiv", "/");
17130    $alias(self, "inspect", "to_s");
17131    $alias(self, "kind_of?", "is_a?");
17132    $alias(self, "magnitude", "abs");
17133    $alias(self, "modulo", "%");
17134    $alias(self, "object_id", "__id__");
17135    $alias(self, "phase", "angle");
17136    $alias(self, "succ", "next");
17137    return $alias(self, "to_int", "to_i");
17138  })('::', $$$('Numeric'));
17139  $const_set('::', 'Fixnum', $$$('Number'));
17140  (function($base, $super, $parent_nesting) {
17141    var self = $klass($base, $super, 'Integer');
17142
17143    var $nesting = [self].concat($parent_nesting);
17144
17145
17146    self.$$is_number_class = true;
17147    self.$$is_integer_class = true;
17148    (function(self, $parent_nesting) {
17149      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
17150
17151
17152
17153      $def(self, '$allocate', function $$allocate() {
17154        var self = this;
17155
17156        return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name()))
17157      });
17158
17159      Opal.udef(self, '$' + "new");
17160      $def(self, '$sqrt', function $$sqrt(n) {
17161
17162
17163        n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
17164
17165        if (n < 0) {
17166          $Kernel.$raise($$$($$$('Math'), 'DomainError'), "Numerical argument is out of domain - \"isqrt\"");
17167        }
17168
17169        return parseInt(Math.sqrt(n), 10);
17170      });
17171      return $def(self, '$try_convert', function $$try_convert(object) {
17172        var self = this;
17173
17174        return $$('Opal')['$coerce_to?'](object, self, "to_int")
17175      });
17176    })(Opal.get_singleton_class(self), $nesting);
17177    $const_set(self, 'MAX', Math.pow(2, 30) - 1);
17178    return $const_set(self, 'MIN', -Math.pow(2, 30));
17179  })('::', $$$('Numeric'), $nesting);
17180  return (function($base, $super, $parent_nesting) {
17181    var self = $klass($base, $super, 'Float');
17182
17183
17184    self.$$is_number_class = true;
17185    (function(self, $parent_nesting) {
17186
17187
17188
17189      $def(self, '$allocate', function $$allocate() {
17190        var self = this;
17191
17192        return $Kernel.$raise($$$('TypeError'), "allocator undefined for " + (self.$name()))
17193      });
17194
17195      Opal.udef(self, '$' + "new");      return $def(self, '$===', function $eq_eq_eq$41(other) {
17196
17197        return !!other.$$is_number;
17198      });
17199    })(Opal.get_singleton_class(self));
17200    $const_set(self, 'INFINITY', Infinity);
17201    $const_set(self, 'MAX', Number.MAX_VALUE);
17202    $const_set(self, 'MIN', Number.MIN_VALUE);
17203    $const_set(self, 'NAN', NaN);
17204    $const_set(self, 'DIG', 15);
17205    $const_set(self, 'MANT_DIG', 53);
17206    $const_set(self, 'RADIX', 2);
17207    return $const_set(self, 'EPSILON', Number.EPSILON || 2.2204460492503130808472633361816E-16);
17208  })('::', $$$('Numeric'));
17209};
17210
17211Opal.modules["corelib/range"] = function(Opal) {/* Generated by Opal 1.7.3 */
17212  var $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $def = Opal.def, $not = Opal.not, $send2 = Opal.send2, $find_super = Opal.find_super, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $send = Opal.send, $eqeq = Opal.eqeq, $eqeqeq = Opal.eqeqeq, $return_ivar = Opal.return_ivar, $rb_gt = Opal.rb_gt, $rb_minus = Opal.rb_minus, $Opal = Opal.Opal, $rb_divide = Opal.rb_divide, $rb_plus = Opal.rb_plus, $rb_times = Opal.rb_times, $rb_ge = Opal.rb_ge, $thrower = Opal.thrower, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
17213
17214  Opal.add_stubs('require,include,attr_reader,raise,nil?,<=>,include?,!,<,<=,enum_for,size,upto,to_proc,respond_to?,class,succ,==,===,exclude_end?,eql?,begin,end,last,to_a,>,-@,-,to_i,coerce_to!,ceil,/,is_a?,new,loop,+,*,>=,each_with_index,%,step,bsearch,inspect,[],hash,cover?');
17215
17216  self.$require("corelib/enumerable");
17217  return (function($base, $super, $parent_nesting) {
17218    var self = $klass($base, $super, 'Range');
17219
17220    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
17221
17222    $proto.begin = $proto.end = $proto.excl = nil;
17223
17224    self.$include($$$('Enumerable'));
17225    self.$$prototype.$$is_range = true;
17226    self.$attr_reader("begin", "end");
17227
17228    $def(self, '$initialize', function $$initialize(first, last, exclude) {
17229      var self = this;
17230
17231
17232      if (exclude == null) exclude = false;
17233      if ($truthy(self.begin)) {
17234        $Kernel.$raise($$$('NameError'), "'initialize' called twice");
17235      }      if (!(($truthy(first['$<=>'](last)) || ($truthy(first['$nil?']()))) || ($truthy(last['$nil?']())))) {
17236        $Kernel.$raise($$$('ArgumentError'), "bad value for range");
17237      }      self.begin = first;
17238      self.end = last;
17239      return (self.excl = exclude);
17240    }, -3);
17241
17242    $def(self, '$===', function $Range_$eq_eq_eq$1(value) {
17243      var self = this;
17244
17245      return self['$include?'](value)
17246    });
17247
17248    function is_infinite(self) {
17249      if (self.begin === nil || self.end === nil ||
17250          self.begin === -Infinity || self.end === Infinity ||
17251          self.begin === Infinity || self.end === -Infinity) return true;
17252      return false;
17253    }
17254
17255    $def(self, '$count', function $$count() {
17256      var block = $$count.$$p || nil, self = this;
17257
17258      $$count.$$p = null;
17259      if (($not((block !== nil)) && ($truthy(is_infinite(self))))) {
17260        return $$$($$$('Float'), 'INFINITY')
17261      }      return $send2(self, $find_super(self, 'count', $$count, false, true), 'count', [], block);
17262    });
17263
17264    $def(self, '$to_a', function $$to_a() {
17265      var $yield = $$to_a.$$p || nil, self = this;
17266
17267      $$to_a.$$p = null;
17268
17269      if ($truthy(is_infinite(self))) {
17270        $Kernel.$raise($$$('TypeError'), "cannot convert endless range to an array");
17271      }      return $send2(self, $find_super(self, 'to_a', $$to_a, false, true), 'to_a', [], $yield);
17272    });
17273
17274    $def(self, '$cover?', function $Range_cover$ques$2(value) {
17275      var self = this, beg_cmp = nil, $ret_or_1 = nil, $ret_or_2 = nil, $ret_or_3 = nil, end_cmp = nil;
17276
17277
17278      beg_cmp = ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = self.begin['$nil?']())) ? (-1) : ($ret_or_3)))) ? ($ret_or_2) : (self.begin['$<=>'](value))))) && ($ret_or_1));
17279      end_cmp = ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(($ret_or_3 = self.end['$nil?']())) ? (-1) : ($ret_or_3)))) ? ($ret_or_2) : (value['$<=>'](self.end))))) && ($ret_or_1));
17280      if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = ($truthy(self.excl) ? (($truthy(($ret_or_3 = end_cmp)) ? ($rb_lt(end_cmp, 0)) : ($ret_or_3))) : ($truthy(($ret_or_3 = end_cmp)) ? ($rb_le(end_cmp, 0)) : ($ret_or_3))))) ? (beg_cmp) : ($ret_or_2))))) {
17281        return $rb_le(beg_cmp, 0)
17282      } else {
17283        return $ret_or_1
17284      }    });
17285
17286    $def(self, '$each', function $$each() {
17287      var block = $$each.$$p || nil, self = this, current = nil, last = nil, $ret_or_1 = nil;
17288
17289      $$each.$$p = null;
17290      if (!(block !== nil)) {
17291        return $send(self, 'enum_for', ["each"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s;
17292
17293          return self.$size()}, {$$s: self})
17294      }
17295      var i, limit;
17296
17297      if (self.begin.$$is_number && self.end.$$is_number) {
17298        if (self.begin % 1 !== 0 || self.end % 1 !== 0) {
17299          $Kernel.$raise($$$('TypeError'), "can't iterate from Float");
17300        }
17301
17302        for (i = self.begin, limit = self.end + ($truthy(self.excl) ? (0) : (1)); i < limit; i++) {
17303          block(i);
17304        }
17305
17306        return self;
17307      }
17308
17309      if (self.begin.$$is_string && self.end.$$is_string) {
17310        $send(self.begin, 'upto', [self.end, self.excl], block.$to_proc());
17311        return self;
17312      }
17313      current = self.begin;
17314      last = self.end;
17315      if (!$truthy(current['$respond_to?']("succ"))) {
17316        $Kernel.$raise($$$('TypeError'), "can't iterate from " + (current.$class()));
17317      }      while ($truthy(($truthy(($ret_or_1 = self.end['$nil?']())) ? ($ret_or_1) : ($rb_lt(current['$<=>'](last), 0))))) {
17318
17319        Opal.yield1(block, current);
17320        current = current.$succ();
17321      }      if (($not(self.excl) && ($eqeq(current, last)))) {
17322        Opal.yield1(block, current);
17323      }      return self;
17324    });
17325
17326    $def(self, '$eql?', function $Range_eql$ques$4(other) {
17327      var self = this, $ret_or_1 = nil, $ret_or_2 = nil;
17328
17329
17330      if (!$eqeqeq($$$('Range'), other)) {
17331        return false
17332      }      if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = self.excl['$==='](other['$exclude_end?']()))) ? (self.begin['$eql?'](other.$begin())) : ($ret_or_2))))) {
17333        return self.end['$eql?'](other.$end())
17334      } else {
17335        return $ret_or_1
17336      }    });
17337
17338    $def(self, '$exclude_end?', $return_ivar("excl"));
17339
17340    $def(self, '$first', function $$first(n) {
17341      var $yield = $$first.$$p || nil, self = this;
17342
17343      $$first.$$p = null;
17344      if ($truthy(self.begin['$nil?']())) {
17345        $Kernel.$raise($$$('RangeError'), "cannot get the minimum of beginless range");
17346      }      if ($truthy(n == null)) {
17347        return self.begin
17348      }      return $send2(self, $find_super(self, 'first', $$first, false, true), 'first', [n], $yield);
17349    }, -1);
17350
17351    $def(self, '$last', function $$last(n) {
17352      var self = this;
17353      if ($truthy(self.end['$nil?']())) {
17354        $Kernel.$raise($$$('RangeError'), "cannot get the maximum of endless range");
17355      }      if ($truthy(n == null)) {
17356        return self.end
17357      }      return self.$to_a().$last(n);
17358    }, -1);
17359
17360    $def(self, '$max', function $$max() {
17361      var $yield = $$max.$$p || nil, self = this;
17362
17363      $$max.$$p = null;
17364      if ($truthy(self.end['$nil?']())) {
17365        return $Kernel.$raise($$$('RangeError'), "cannot get the maximum of endless range")
17366      } else if (($yield !== nil)) {
17367        return $send2(self, $find_super(self, 'max', $$max, false, true), 'max', [], $yield)
17368      } else if (($not(self.begin['$nil?']()) && (($truthy($rb_gt(self.begin, self.end)) || (($truthy(self.excl) && ($eqeq(self.begin, self.end)))))))) {
17369        return nil
17370      } else {
17371        return self.excl ? self.end - 1 : self.end
17372      }
17373    });
17374
17375    $def(self, '$min', function $$min() {
17376      var $yield = $$min.$$p || nil, self = this;
17377
17378      $$min.$$p = null;
17379      if ($truthy(self.begin['$nil?']())) {
17380        return $Kernel.$raise($$$('RangeError'), "cannot get the minimum of beginless range")
17381      } else if (($yield !== nil)) {
17382        return $send2(self, $find_super(self, 'min', $$min, false, true), 'min', [], $yield)
17383      } else if (($not(self.end['$nil?']()) && (($truthy($rb_gt(self.begin, self.end)) || (($truthy(self.excl) && ($eqeq(self.begin, self.end)))))))) {
17384        return nil
17385      } else {
17386        return self.begin
17387      }
17388    });
17389
17390    $def(self, '$size', function $$size() {
17391      var self = this, infinity = nil, range_begin = nil, range_end = nil;
17392
17393
17394      infinity = $$$($$$('Float'), 'INFINITY');
17395      if ((($eqeq(self.begin, infinity) && ($not(self.end['$nil?']()))) || (($eqeq(self.end, infinity['$-@']()) && ($not(self.begin['$nil?']())))))) {
17396        return 0
17397      }      if ($truthy(is_infinite(self))) {
17398        return infinity
17399      }      if (!($eqeqeq($$$('Numeric'), self.begin) && ($eqeqeq($$$('Numeric'), self.end)))) {
17400        return nil
17401      }      range_begin = self.begin;
17402      range_end = self.end;
17403      if ($truthy(self.excl)) {
17404        range_end = $rb_minus(range_end, 1);
17405      }      if ($truthy($rb_lt(range_end, range_begin))) {
17406        return 0
17407      }      return (Math.abs(range_end - range_begin) + 1).$to_i();
17408    });
17409
17410    $def(self, '$step', function $$step(n) {
17411      var $yield = $$step.$$p || nil, self = this, $ret_or_1 = nil, i = nil;
17412
17413      $$step.$$p = null;
17414
17415      function coerceStepSize() {
17416        if (n == null) {
17417          n = 1;
17418        }
17419        else if (!n.$$is_number) {
17420          n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
17421        }
17422
17423        if (n < 0) {
17424          $Kernel.$raise($$$('ArgumentError'), "step can't be negative");
17425        } else if (n === 0) {
17426          $Kernel.$raise($$$('ArgumentError'), "step can't be 0");
17427        }
17428      }
17429
17430      function enumeratorSize() {
17431        if (!self.begin['$respond_to?']("succ")) {
17432          return nil;
17433        }
17434
17435        if (self.begin.$$is_string && self.end.$$is_string) {
17436          return nil;
17437        }
17438
17439        if (n % 1 === 0) {
17440          return $rb_divide(self.$size(), n).$ceil();
17441        } else {
17442          // n is a float
17443          var begin = self.begin, end = self.end,
17444              abs = Math.abs, floor = Math.floor,
17445              err = (abs(begin) + abs(end) + abs(end - begin)) / abs(n) * $$$($$$('Float'), 'EPSILON'),
17446              size;
17447
17448          if (err > 0.5) {
17449            err = 0.5;
17450          }
17451
17452          if (self.excl) {
17453            size = floor((end - begin) / n - err);
17454            if (size * n + begin < end) {
17455              size++;
17456            }
17457          } else {
17458            size = floor((end - begin) / n + err) + 1;
17459          }
17460
17461          return size;
17462        }
17463      }
17464      if (!($yield !== nil)) {
17465        if (((($truthy(self.begin['$is_a?']($$('Numeric'))) || ($truthy(self.begin['$nil?']()))) && (($truthy(self.end['$is_a?']($$('Numeric'))) || ($truthy(self.end['$nil?']()))))) && ($not(($truthy(($ret_or_1 = self.begin['$nil?']())) ? (self.end['$nil?']()) : ($ret_or_1)))))) {
17466          return $$$($$$('Enumerator'), 'ArithmeticSequence').$new(self, n, "step")
17467        } else {
17468          return $send(self, 'enum_for', ["step", n], function $$5(){
17469
17470            coerceStepSize();
17471            return enumeratorSize();
17472          })
17473        }
17474      }      coerceStepSize();
17475      if ($truthy(self.begin.$$is_number && self.end.$$is_number)) {
17476
17477        i = 0;
17478        (function(){try { var $t_break = $thrower('break'); return $send(self, 'loop', [], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s, current = nil;
17479          if (self.begin == null) self.begin = nil;
17480          if (self.excl == null) self.excl = nil;
17481          if (self.end == null) self.end = nil;
17482
17483
17484          current = $rb_plus(self.begin, $rb_times(i, n));
17485          if ($truthy(self.excl)) {
17486            if ($truthy($rb_ge(current, self.end))) {
17487              $t_break.$throw();
17488            }
17489          } else if ($truthy($rb_gt(current, self.end))) {
17490            $t_break.$throw();
17491          };
17492          Opal.yield1($yield, current);
17493          return (i = $rb_plus(i, 1));}, {$$s: self})} catch($e) {
17494          if ($e === $t_break) return $e.$v;
17495          throw $e;
17496        }})();
17497      } else {
17498
17499
17500        if (self.begin.$$is_string && self.end.$$is_string && n % 1 !== 0) {
17501          $Kernel.$raise($$$('TypeError'), "no implicit conversion to float from string");
17502        }
17503        $send(self, 'each_with_index', [], function $$7(value, idx){
17504
17505          if (value == null) value = nil;
17506          if (idx == null) idx = nil;
17507          if ($eqeq(idx['$%'](n), 0)) {
17508            return Opal.yield1($yield, value);
17509          } else {
17510            return nil
17511          }});
17512      }      return self;
17513    }, -1);
17514
17515    $def(self, '$%', function $Range_$percent$8(n) {
17516      var self = this;
17517
17518      if (($truthy(self.begin['$is_a?']($$('Numeric'))) && ($truthy(self.end['$is_a?']($$('Numeric')))))) {
17519        return $$$($$$('Enumerator'), 'ArithmeticSequence').$new(self, n, "%")
17520      } else {
17521        return self.$step(n)
17522      }
17523    });
17524
17525    $def(self, '$bsearch', function $$bsearch() {
17526      var block = $$bsearch.$$p || nil, self = this;
17527
17528      $$bsearch.$$p = null;
17529      if (!(block !== nil)) {
17530        return self.$enum_for("bsearch")
17531      }      if ($truthy(is_infinite(self) && (self.begin.$$is_number || self.end.$$is_number))) {
17532        $Kernel.$raise($$$('NotImplementedError'), "Can't #bsearch an infinite range");
17533      }      if (!$truthy(self.begin.$$is_number && self.end.$$is_number)) {
17534        $Kernel.$raise($$$('TypeError'), "can't do binary search for " + (self.begin.$class()));
17535      }      return $send(self.$to_a(), 'bsearch', [], block.$to_proc());
17536    });
17537
17538    $def(self, '$to_s', function $$to_s() {
17539      var self = this, $ret_or_1 = nil;
17540
17541      return "" + (($truthy(($ret_or_1 = self.begin)) ? ($ret_or_1) : (""))) + (($truthy(self.excl) ? ("...") : (".."))) + (($truthy(($ret_or_1 = self.end)) ? ($ret_or_1) : ("")))
17542    });
17543
17544    $def(self, '$inspect', function $$inspect() {
17545      var self = this, $ret_or_1 = nil;
17546
17547      return "" + (($truthy(($ret_or_1 = self.begin)) ? (self.begin.$inspect()) : ($ret_or_1))) + (($truthy(self.excl) ? ("...") : (".."))) + (($truthy(($ret_or_1 = self.end)) ? (self.end.$inspect()) : ($ret_or_1)))
17548    });
17549
17550    $def(self, '$marshal_load', function $$marshal_load(args) {
17551      var self = this;
17552
17553
17554      self.begin = args['$[]']("begin");
17555      self.end = args['$[]']("end");
17556      return (self.excl = args['$[]']("excl"));
17557    });
17558
17559    $def(self, '$hash', function $$hash() {
17560      var self = this;
17561
17562      return [self.begin, self.end, self.excl].$hash()
17563    });
17564    $alias(self, "==", "eql?");
17565    $alias(self, "include?", "cover?");
17566    return $alias(self, "member?", "cover?");
17567  })('::', null, $nesting);
17568};
17569
17570Opal.modules["corelib/proc"] = function(Opal) {/* Generated by Opal 1.7.3 */
17571  var $slice = Opal.slice, $klass = Opal.klass, $truthy = Opal.truthy, $Kernel = Opal.Kernel, $defs = Opal.defs, $def = Opal.def, $send = Opal.send, $to_a = Opal.to_a, $return_self = Opal.return_self, $ensure_kwargs = Opal.ensure_kwargs, $Opal = Opal.Opal, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$;
17572
17573  Opal.add_stubs('raise,proc,call,to_proc,new,source_location,coerce_to!,dup');
17574  return (function($base, $super) {
17575    var self = $klass($base, $super, 'Proc');
17576
17577
17578
17579    Opal.prop(self.$$prototype, '$$is_proc', true);
17580    Opal.prop(self.$$prototype, '$$is_lambda', false);
17581    $defs(self, '$new', function $Proc_new$1() {
17582      var block = $Proc_new$1.$$p || nil;
17583
17584      $Proc_new$1.$$p = null;
17585      if (!$truthy(block)) {
17586        $Kernel.$raise($$$('ArgumentError'), "tried to create a Proc object without a block");
17587      }      return block;
17588    });
17589
17590    $def(self, '$call', function $$call($a) {
17591      var block = $$call.$$p || nil, $post_args, args, self = this;
17592
17593      $$call.$$p = null;
17594      $post_args = $slice(arguments);
17595      args = $post_args;
17596
17597      if (block !== nil) {
17598        self.$$p = block;
17599      }
17600
17601      var result, $brk = self.$$brk, $ret = self.$$ret;
17602
17603      if ($brk || ($ret && self.$$is_lambda)) {
17604        try {
17605          if (self.$$is_lambda) {
17606            result = self.apply(null, args);
17607          }
17608          else {
17609            result = Opal.yieldX(self, args);
17610          }
17611        } catch (err) {
17612          if (err === $brk) {
17613            return err.$v;
17614          }
17615          else if (self.$$is_lambda && err === $ret) {
17616            return err.$v;
17617          }
17618          else {
17619            throw err;
17620          }
17621        }
17622      }
17623      else {
17624        if (self.$$is_lambda) {
17625          result = self.apply(null, args);
17626        }
17627        else {
17628          result = Opal.yieldX(self, args);
17629        }
17630      }
17631
17632      return result;
17633    }, -1);
17634
17635    $def(self, '$>>', function $Proc_$gt$gt$2(other) {
17636      var self = this;
17637
17638      $Proc_$gt$gt$2.$$p = null;
17639      return $send($Kernel, 'proc', [], function $$3($a){var block = $$3.$$p || nil, $post_args, args, self = $$3.$$s == null ? this : $$3.$$s, out = nil;
17640
17641        $$3.$$p = null;
17642        $post_args = $slice(arguments);
17643        args = $post_args;
17644        out = $send(self, 'call', $to_a(args), block.$to_proc());
17645        return other.$call(out);}, {$$arity: -1, $$s: self})
17646    });
17647
17648    $def(self, '$<<', function $Proc_$lt$lt$4(other) {
17649      var self = this;
17650
17651      $Proc_$lt$lt$4.$$p = null;
17652      return $send($Kernel, 'proc', [], function $$5($a){var block = $$5.$$p || nil, $post_args, args, self = $$5.$$s == null ? this : $$5.$$s, out = nil;
17653
17654        $$5.$$p = null;
17655        $post_args = $slice(arguments);
17656        args = $post_args;
17657        out = $send(other, 'call', $to_a(args), block.$to_proc());
17658        return self.$call(out);}, {$$arity: -1, $$s: self})
17659    });
17660
17661    $def(self, '$to_proc', $return_self);
17662
17663    $def(self, '$lambda?', function $Proc_lambda$ques$6() {
17664      var self = this;
17665
17666      return !!self.$$is_lambda;
17667    });
17668
17669    $def(self, '$arity', function $$arity() {
17670      var self = this;
17671
17672
17673      if (self.$$is_curried) {
17674        return -1;
17675      } else if (self.$$arity != null) {
17676        return self.$$arity;
17677      } else {
17678        return self.length;
17679      }
17680
17681    });
17682
17683    $def(self, '$source_location', function $$source_location() {
17684      var self = this, $ret_or_1 = nil;
17685
17686
17687      if (self.$$is_curried) { return nil; }      if ($truthy(($ret_or_1 = self.$$source_location))) {
17688        return $ret_or_1
17689      } else {
17690        return nil
17691      }    });
17692
17693    $def(self, '$binding', function $$binding() {
17694      var self = this;
17695
17696
17697      if (self.$$is_curried) { $Kernel.$raise($$$('ArgumentError'), "Can't create Binding"); }      if ($truthy((($$$('::', 'Binding', 'skip_raise')) ? 'constant' : nil))) {
17698        return $$$('Binding').$new(nil, [], self.$$s, self.$source_location())
17699      } else {
17700        return nil
17701      }    });
17702
17703    $def(self, '$parameters', function $$parameters($kwargs) {
17704      var lambda, self = this;
17705
17706
17707      $kwargs = $ensure_kwargs($kwargs);
17708
17709      lambda = $kwargs.$$smap["lambda"];
17710      if (self.$$is_curried) {
17711        return [["rest"]];
17712      } else if (self.$$parameters) {
17713        if (lambda == null ? self.$$is_lambda : lambda) {
17714          return self.$$parameters;
17715        } else {
17716          var result = [], i, length;
17717
17718          for (i = 0, length = self.$$parameters.length; i < length; i++) {
17719            var parameter = self.$$parameters[i];
17720
17721            if (parameter[0] === 'req') {
17722              // required arguments always have name
17723              parameter = ['opt', parameter[1]];
17724            }
17725
17726            result.push(parameter);
17727          }
17728
17729          return result;
17730        }
17731      } else {
17732        return [];
17733      }
17734    }, -1);
17735
17736    $def(self, '$curry', function $$curry(arity) {
17737      var self = this;
17738
17739      if (arity === undefined) {
17740        arity = self.length;
17741      }
17742      else {
17743        arity = $Opal['$coerce_to!'](arity, $$$('Integer'), "to_int");
17744        if (self.$$is_lambda && arity !== self.length) {
17745          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arity) + " for " + (self.length) + ")");
17746        }
17747      }
17748
17749      function curried () {
17750        var args = $slice(arguments),
17751            length = args.length,
17752            result;
17753
17754        if (length > arity && self.$$is_lambda && !self.$$is_curried) {
17755          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (length) + " for " + (arity) + ")");
17756        }
17757
17758        if (length >= arity) {
17759          return self.$call.apply(self, args);
17760        }
17761
17762        result = function () {
17763          return curried.apply(null,
17764            args.concat($slice(arguments)));
17765        };
17766        result.$$is_lambda = self.$$is_lambda;
17767        result.$$is_curried = true;
17768
17769        return result;
17770      }
17771      curried.$$is_lambda = self.$$is_lambda;
17772      curried.$$is_curried = true;
17773      return curried;
17774    }, -1);
17775
17776    $def(self, '$dup', function $$dup() {
17777      var self = this;
17778
17779
17780      var original_proc = self.$$original_proc || self,
17781          proc = function () {
17782            return original_proc.apply(this, arguments);
17783          };
17784
17785      for (var prop in self) {
17786        if (self.hasOwnProperty(prop)) {
17787          proc[prop] = self[prop];
17788        }
17789      }
17790
17791      return proc;
17792
17793    });
17794    $alias(self, "===", "call");
17795    $alias(self, "clone", "dup");
17796    $alias(self, "yield", "call");
17797    return $alias(self, "[]", "call");
17798  })('::', Function)
17799};
17800
17801Opal.modules["corelib/method"] = function(Opal) {/* Generated by Opal 1.7.3 */
17802  var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $slice = Opal.slice, $alias = Opal.alias, $Kernel = Opal.Kernel, $send = Opal.send, $to_a = Opal.to_a, nil = Opal.nil, $$$ = Opal.$$$;
17803
17804  Opal.add_stubs('attr_reader,arity,curry,>>,<<,new,class,join,source_location,call,raise,bind,to_proc');
17805
17806  (function($base, $super) {
17807    var self = $klass($base, $super, 'Method');
17808
17809    var $proto = self.$$prototype;
17810
17811    $proto.method = $proto.receiver = $proto.owner = $proto.name = nil;
17812
17813    self.$attr_reader("owner", "receiver", "name");
17814
17815    $def(self, '$initialize', function $$initialize(receiver, owner, method, name) {
17816      var self = this;
17817
17818
17819      self.receiver = receiver;
17820      self.owner = owner;
17821      self.name = name;
17822      return (self.method = method);
17823    });
17824
17825    $def(self, '$arity', function $$arity() {
17826      var self = this;
17827
17828      return self.method.$arity()
17829    });
17830
17831    $def(self, '$parameters', function $$parameters() {
17832      var self = this;
17833
17834      return self.method.$$parameters
17835    });
17836
17837    $def(self, '$source_location', function $$source_location() {
17838      var self = this, $ret_or_1 = nil;
17839
17840      if ($truthy(($ret_or_1 = self.method.$$source_location))) {
17841        return $ret_or_1
17842      } else {
17843        return ["(eval)", 0]
17844      }
17845    });
17846
17847    $def(self, '$comments', function $$comments() {
17848      var self = this, $ret_or_1 = nil;
17849
17850      if ($truthy(($ret_or_1 = self.method.$$comments))) {
17851        return $ret_or_1
17852      } else {
17853        return []
17854      }
17855    });
17856
17857    $def(self, '$call', function $$call($a) {
17858      var block = $$call.$$p || nil, $post_args, args, self = this;
17859
17860      $$call.$$p = null;
17861      $post_args = $slice(arguments);
17862      args = $post_args;
17863
17864      self.method.$$p = block;
17865
17866      return self.method.apply(self.receiver, args);
17867    }, -1);
17868
17869    $def(self, '$curry', function $$curry(arity) {
17870      var self = this;
17871      return self.method.$curry(arity);
17872    }, -1);
17873
17874    $def(self, '$>>', function $Method_$gt$gt$1(other) {
17875      var self = this;
17876
17877      return self.method['$>>'](other)
17878    });
17879
17880    $def(self, '$<<', function $Method_$lt$lt$2(other) {
17881      var self = this;
17882
17883      return self.method['$<<'](other)
17884    });
17885
17886    $def(self, '$unbind', function $$unbind() {
17887      var self = this;
17888
17889      return $$$('UnboundMethod').$new(self.receiver.$class(), self.owner, self.method, self.name)
17890    });
17891
17892    $def(self, '$to_proc', function $$to_proc() {
17893      var self = this;
17894
17895
17896      var proc = self.$call.bind(self);
17897      proc.$$unbound = self.method;
17898      proc.$$is_lambda = true;
17899      proc.$$arity = self.method.$$arity == null ? self.method.length : self.method.$$arity;
17900      proc.$$parameters = self.method.$$parameters;
17901      return proc;
17902
17903    });
17904
17905    $def(self, '$inspect', function $$inspect() {
17906      var self = this;
17907
17908      return "#<" + (self.$class()) + ": " + (self.receiver.$class()) + "#" + (self.name) + " (defined in " + (self.owner) + " in " + (self.$source_location().$join(":")) + ")>"
17909    });
17910    $alias(self, "[]", "call");
17911    return $alias(self, "===", "call");
17912  })('::', null);
17913  return (function($base, $super) {
17914    var self = $klass($base, $super, 'UnboundMethod');
17915
17916    var $proto = self.$$prototype;
17917
17918    $proto.method = $proto.owner = $proto.name = $proto.source = nil;
17919
17920    self.$attr_reader("source", "owner", "name");
17921
17922    $def(self, '$initialize', function $$initialize(source, owner, method, name) {
17923      var self = this;
17924
17925
17926      self.source = source;
17927      self.owner = owner;
17928      self.method = method;
17929      return (self.name = name);
17930    });
17931
17932    $def(self, '$arity', function $$arity() {
17933      var self = this;
17934
17935      return self.method.$arity()
17936    });
17937
17938    $def(self, '$parameters', function $$parameters() {
17939      var self = this;
17940
17941      return self.method.$$parameters
17942    });
17943
17944    $def(self, '$source_location', function $$source_location() {
17945      var self = this, $ret_or_1 = nil;
17946
17947      if ($truthy(($ret_or_1 = self.method.$$source_location))) {
17948        return $ret_or_1
17949      } else {
17950        return ["(eval)", 0]
17951      }
17952    });
17953
17954    $def(self, '$comments', function $$comments() {
17955      var self = this, $ret_or_1 = nil;
17956
17957      if ($truthy(($ret_or_1 = self.method.$$comments))) {
17958        return $ret_or_1
17959      } else {
17960        return []
17961      }
17962    });
17963
17964    $def(self, '$bind', function $$bind(object) {
17965      var self = this;
17966
17967
17968      if (self.owner.$$is_module || Opal.is_a(object, self.owner)) {
17969        return $$$('Method').$new(object, self.owner, self.method, self.name);
17970      }
17971      else {
17972        $Kernel.$raise($$$('TypeError'), "can't bind singleton method to a different class (expected " + (object) + ".kind_of?(" + (self.owner) + " to be true)");
17973      }
17974
17975    });
17976
17977    $def(self, '$bind_call', function $$bind_call(object, $a) {
17978      var block = $$bind_call.$$p || nil, $post_args, args, self = this;
17979
17980      $$bind_call.$$p = null;
17981      $post_args = $slice(arguments, 1);
17982      args = $post_args;
17983      return $send(self.$bind(object), 'call', $to_a(args), block.$to_proc());
17984    }, -2);
17985    return $def(self, '$inspect', function $$inspect() {
17986      var self = this;
17987
17988      return "#<" + (self.$class()) + ": " + (self.source) + "#" + (self.name) + " (defined in " + (self.owner) + " in " + (self.$source_location().$join(":")) + ")>"
17989    });
17990  })('::', null);
17991};
17992
17993Opal.modules["corelib/variables"] = function(Opal) {/* Generated by Opal 1.7.3 */
17994  var $gvars = Opal.gvars, $const_set = Opal.const_set, $Object = Opal.Object, $hash2 = Opal.hash2, nil = Opal.nil;
17995
17996  Opal.add_stubs('new');
17997
17998  $gvars['&'] = $gvars['~'] = $gvars['`'] = $gvars["'"] = nil;
17999  $gvars.LOADED_FEATURES = ($gvars["\""] = Opal.loaded_features);
18000  $gvars.LOAD_PATH = ($gvars[":"] = []);
18001  $gvars["/"] = "\n";
18002  $gvars[","] = nil;
18003  $const_set('::', 'ARGV', []);
18004  $const_set('::', 'ARGF', $Object.$new());
18005  $const_set('::', 'ENV', $hash2([], {}));
18006  $gvars.VERBOSE = false;
18007  $gvars.DEBUG = false;
18008  return ($gvars.SAFE = 0);
18009};
18010
18011Opal.modules["corelib/io"] = function(Opal) {/* Generated by Opal 1.7.3 */
18012  var $klass = Opal.klass, $const_set = Opal.const_set, $not = Opal.not, $truthy = Opal.truthy, $def = Opal.def, $return_ivar = Opal.return_ivar, $return_val = Opal.return_val, $slice = Opal.slice, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $send = Opal.send, $to_a = Opal.to_a, $rb_plus = Opal.rb_plus, $neqeq = Opal.neqeq, $range = Opal.range, $hash2 = Opal.hash2, $eqeq = Opal.eqeq, $to_ary = Opal.to_ary, $rb_gt = Opal.rb_gt, $assign_ivar_val = Opal.assign_ivar_val, $alias = Opal.alias, $a, nil = Opal.nil, $$$ = Opal.$$$;
18013
18014  Opal.add_stubs('attr_reader,attr_accessor,!,match?,include?,size,write,String,flatten,puts,sysread_noraise,+,!=,[],ord,getc,readchar,raise,gets,==,to_str,length,split,sub,sysread,>,to_a,each_line,enum_for,getbyte,closed_write?,closed_read?,each,eof,new,write_proc=,read_proc=');
18015
18016  (function($base, $super) {
18017    var self = $klass($base, $super, 'IO');
18018
18019    var $proto = self.$$prototype;
18020
18021    $proto.read_buffer = $proto.closed = nil;
18022
18023    $const_set(self, 'SEEK_SET', 0);
18024    $const_set(self, 'SEEK_CUR', 1);
18025    $const_set(self, 'SEEK_END', 2);
18026    $const_set(self, 'SEEK_DATA', 3);
18027    $const_set(self, 'SEEK_HOLE', 4);
18028    $const_set(self, 'READABLE', 1);
18029    $const_set(self, 'WRITABLE', 4);
18030    self.$attr_reader("eof");
18031    self.$attr_accessor("read_proc", "sync", "tty", "write_proc");
18032
18033    $def(self, '$initialize', function $$initialize(fd, flags) {
18034      var self = this;
18035
18036
18037      if (flags == null) flags = "r";
18038      self.fd = fd;
18039      self.flags = flags;
18040      self.eof = false;
18041      if (($truthy(flags['$include?']("r")) && ($not(flags['$match?'](/[wa+]/))))) {
18042        return (self.closed = "write")
18043      } else if (($truthy(flags['$match?'](/[wa]/)) && ($not(flags['$match?'](/[r+]/))))) {
18044        return (self.closed = "read")
18045      } else {
18046        return nil
18047      }    }, -2);
18048
18049    $def(self, '$fileno', $return_ivar("fd"));
18050
18051    $def(self, '$tty?', function $IO_tty$ques$1() {
18052      var self = this;
18053
18054      return self.tty == true;
18055    });
18056
18057    $def(self, '$write', function $$write(string) {
18058      var self = this;
18059
18060
18061      self.write_proc(string);
18062      return string.$size();
18063    });
18064
18065    $def(self, '$flush', $return_val(nil));
18066
18067    $def(self, '$<<', function $IO_$lt$lt$2(string) {
18068      var self = this;
18069
18070
18071      self.$write(string);
18072      return self;
18073    });
18074
18075    $def(self, '$print', function $$print($a) {
18076      var $post_args, args, self = this;
18077      if ($gvars[","] == null) $gvars[","] = nil;
18078
18079
18080      $post_args = $slice(arguments);
18081      args = $post_args;
18082
18083      for (var i = 0, ii = args.length; i < ii; i++) {
18084        args[i] = $Kernel.$String(args[i]);
18085      }
18086      self.$write(args.join($gvars[","]));
18087      return nil;
18088    }, -1);
18089
18090    $def(self, '$puts', function $$puts($a) {
18091      var $post_args, args, self = this;
18092
18093
18094      $post_args = $slice(arguments);
18095      args = $post_args;
18096
18097      var line;
18098      if (args.length === 0) {
18099        self.$write("\n");
18100        return nil;
18101      } else {
18102        for (var i = 0, ii = args.length; i < ii; i++) {
18103          if (args[i].$$is_array){
18104            var ary = (args[i]).$flatten();
18105            if (ary.length > 0) $send(self, 'puts', $to_a((ary)));
18106          } else {
18107            if (args[i].$$is_string) {
18108              line = args[i].valueOf();
18109            } else {
18110              line = $Kernel.$String(args[i]);
18111            }
18112            if (!line.endsWith("\n")) line += "\n";
18113            self.$write(line);
18114          }
18115        }
18116      }
18117      return nil;
18118    }, -1);
18119
18120    $def(self, '$getc', function $$getc() {
18121      var self = this, $ret_or_1 = nil, parts = nil, ret = nil;
18122
18123
18124      self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : (""));
18125      parts = "";
18126      do {
18127
18128        self.read_buffer = $rb_plus(self.read_buffer, parts);
18129        if ($neqeq(self.read_buffer, "")) {
18130
18131          ret = self.read_buffer['$[]'](0);
18132          self.read_buffer = self.read_buffer['$[]']($range(1, -1, false));
18133          return ret;
18134        }      } while ($truthy((parts = self.$sysread_noraise(1))));      return nil;
18135    });
18136
18137    $def(self, '$getbyte', function $$getbyte() {
18138      var $a, self = this;
18139
18140      return ($a = self.$getc(), ($a === nil || $a == null) ? nil : $a.$ord())
18141    });
18142
18143    $def(self, '$readbyte', function $$readbyte() {
18144      var self = this;
18145
18146      return self.$readchar().$ord()
18147    });
18148
18149    $def(self, '$readchar', function $$readchar() {
18150      var self = this, $ret_or_1 = nil;
18151
18152      if ($truthy(($ret_or_1 = self.$getc()))) {
18153        return $ret_or_1
18154      } else {
18155        return $Kernel.$raise($$$('EOFError'), "end of file reached")
18156      }
18157    });
18158
18159    $def(self, '$readline', function $$readline($a) {
18160      var $post_args, args, self = this, $ret_or_1 = nil;
18161
18162
18163      $post_args = $slice(arguments);
18164      args = $post_args;
18165      if ($truthy(($ret_or_1 = $send(self, 'gets', $to_a(args))))) {
18166        return $ret_or_1
18167      } else {
18168        return $Kernel.$raise($$$('EOFError'), "end of file reached")
18169      }    }, -1);
18170
18171    $def(self, '$gets', function $$gets(sep, limit, opts) {
18172      var $a, $b, self = this, orig_sep = nil, $ret_or_1 = nil, seplen = nil, data = nil, ret = nil, orig_buffer = nil;
18173      if ($gvars["/"] == null) $gvars["/"] = nil;
18174
18175
18176      if (sep == null) sep = false;
18177      if (limit == null) limit = nil;
18178      if (opts == null) opts = $hash2([], {});
18179      if (($truthy(sep.$$is_number) && ($not(limit)))) {
18180        $a = [false, sep, limit], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]);
18181      }      if ((($truthy(sep.$$is_hash) && ($not(limit))) && ($eqeq(opts, $hash2([], {}))))) {
18182        $a = [false, nil, sep], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]);
18183      } else if (($truthy(limit.$$is_hash) && ($eqeq(opts, $hash2([], {}))))) {
18184        $a = [sep, nil, limit], (sep = $a[0]), (limit = $a[1]), (opts = $a[2]);
18185      }      orig_sep = sep;
18186      if ($eqeq(sep, false)) {
18187        sep = $gvars["/"];
18188      }      if ($eqeq(sep, "")) {
18189        sep = /\r?\n\r?\n/;
18190      }      sep = ($truthy(($ret_or_1 = sep)) ? ($ret_or_1) : (""));
18191      if (!$eqeq(orig_sep, "")) {
18192        sep = sep.$to_str();
18193      }      seplen = ($eqeq(orig_sep, "") ? (2) : (sep.$length()));
18194      if ($eqeq(sep, " ")) {
18195        sep = / /;
18196      }      self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : (""));
18197      data = "";
18198      ret = nil;
18199      do {
18200
18201        self.read_buffer = $rb_plus(self.read_buffer, data);
18202        if (($neqeq(sep, "") && ($truthy(($truthy(sep.$$is_regexp) ? (self.read_buffer['$match?'](sep)) : (self.read_buffer['$include?'](sep))))))) {
18203
18204          orig_buffer = self.read_buffer;
18205          $b = self.read_buffer.$split(sep, 2), $a = $to_ary($b), (ret = ($a[0] == null ? nil : $a[0])), (self.read_buffer = ($a[1] == null ? nil : $a[1]));
18206          if ($neqeq(ret, orig_buffer)) {
18207            ret = $rb_plus(ret, orig_buffer['$[]'](ret.$length(), seplen));
18208          }          break;
18209        }      } while ($truthy((data = self.$sysread_noraise(($eqeq(sep, "") ? (65536) : (1))))));      if (!$truthy(ret)) {
18210
18211        $a = [($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : ("")), ""], (ret = $a[0]), (self.read_buffer = $a[1]);
18212        if ($eqeq(ret, "")) {
18213          ret = nil;
18214        }      }      if ($truthy(ret)) {
18215
18216        if ($truthy(limit)) {
18217
18218          ret = ret['$[]'](Opal.Range.$new(0,limit, true));
18219          self.read_buffer = $rb_plus(ret['$[]'](Opal.Range.$new(limit, -1, false)), self.read_buffer);
18220        }        if ($truthy(opts['$[]']("chomp"))) {
18221          ret = ret.$sub(/\r?\n$/, "");
18222        }        if ($eqeq(orig_sep, "")) {
18223          ret = ret.$sub(/^[\r\n]+/, "");
18224        }      }      if ($eqeq(orig_sep, false)) {
18225        $gvars._ = ret;
18226      }      return ret;
18227    }, -1);
18228
18229    $def(self, '$sysread', function $$sysread(integer) {
18230      var self = this, $ret_or_1 = nil;
18231
18232      if ($truthy(($ret_or_1 = self.read_proc(integer)))) {
18233        return $ret_or_1
18234      } else {
18235
18236        self.eof = true;
18237        return $Kernel.$raise($$$('EOFError'), "end of file reached");
18238      }
18239    });
18240
18241    $def(self, '$sysread_noraise', function $$sysread_noraise(integer) {
18242      var self = this;
18243
18244      try {
18245        return self.$sysread(integer)
18246      } catch ($err) {
18247        if (Opal.rescue($err, [$$$('EOFError')])) {
18248          try {
18249            return nil
18250          } finally { Opal.pop_exception(); }
18251        } else { throw $err; }
18252      }
18253    });
18254
18255    $def(self, '$readpartial', function $$readpartial(integer) {
18256      var $a, self = this, $ret_or_1 = nil, part = nil, ret = nil;
18257
18258
18259      self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : (""));
18260      part = self.$sysread(integer);
18261      $a = [$rb_plus(self.read_buffer, ($truthy(($ret_or_1 = part)) ? ($ret_or_1) : (""))), ""], (ret = $a[0]), (self.read_buffer = $a[1]);
18262      if ($eqeq(ret, "")) {
18263        ret = nil;
18264      }      return ret;
18265    });
18266
18267    $def(self, '$read', function $$read(integer) {
18268      var $a, self = this, $ret_or_1 = nil, parts = nil, ret = nil;
18269
18270
18271      if (integer == null) integer = nil;
18272      self.read_buffer = ($truthy(($ret_or_1 = self.read_buffer)) ? ($ret_or_1) : (""));
18273      parts = "";
18274      ret = nil;
18275      do {
18276
18277        self.read_buffer = $rb_plus(self.read_buffer, parts);
18278        if (($truthy(integer) && ($truthy($rb_gt(self.read_buffer.$length(), integer))))) {
18279
18280          $a = [self.read_buffer['$[]'](Opal.Range.$new(0,integer, true)), self.read_buffer['$[]'](Opal.Range.$new(integer, -1, false))], (ret = $a[0]), (self.read_buffer = $a[1]);
18281          return ret;
18282        }      } while ($truthy((parts = self.$sysread_noraise(($truthy(($ret_or_1 = integer)) ? ($ret_or_1) : (65536))))));      $a = [self.read_buffer, ""], (ret = $a[0]), (self.read_buffer = $a[1]);
18283      return ret;
18284    }, -1);
18285
18286    $def(self, '$readlines', function $$readlines(separator) {
18287      var self = this;
18288      if ($gvars["/"] == null) $gvars["/"] = nil;
18289
18290
18291      if (separator == null) separator = $gvars["/"];
18292      return self.$each_line(separator).$to_a();
18293    }, -1);
18294
18295    $def(self, '$each', function $$each($a, $b) {
18296      var block = $$each.$$p || nil, $post_args, sep, args, self = this, s = nil;
18297      if ($gvars["/"] == null) $gvars["/"] = nil;
18298
18299      $$each.$$p = null;
18300      $post_args = $slice(arguments);
18301
18302      if ($post_args.length > 0) sep = $post_args.shift();if (sep == null) sep = $gvars["/"];
18303      args = $post_args;
18304      if (!(block !== nil)) {
18305        return $send(self, 'enum_for', ["each", sep].concat($to_a(args)))
18306      }      while ($truthy((s = $send(self, 'gets', [sep].concat($to_a(args)))))) {
18307      Opal.yield1(block, s);
18308      }      return self;
18309    }, -1);
18310
18311    $def(self, '$each_byte', function $$each_byte() {
18312      var block = $$each_byte.$$p || nil, self = this, s = nil;
18313
18314      $$each_byte.$$p = null;
18315      if (!(block !== nil)) {
18316        return self.$enum_for("each_byte")
18317      }      while ($truthy((s = self.$getbyte()))) {
18318      Opal.yield1(block, s);
18319      }      return self;
18320    });
18321
18322    $def(self, '$each_char', function $$each_char() {
18323      var block = $$each_char.$$p || nil, self = this, s = nil;
18324
18325      $$each_char.$$p = null;
18326      if (!(block !== nil)) {
18327        return self.$enum_for("each_char")
18328      }      while ($truthy((s = self.$getc()))) {
18329      Opal.yield1(block, s);
18330      }      return self;
18331    });
18332
18333    $def(self, '$close', $assign_ivar_val("closed", "both"));
18334
18335    $def(self, '$close_read', function $$close_read() {
18336      var self = this;
18337
18338      if ($eqeq(self.closed, "write")) {
18339        return (self.closed = "both")
18340      } else {
18341        return (self.closed = "read")
18342      }
18343    });
18344
18345    $def(self, '$close_write', function $$close_write() {
18346      var self = this;
18347
18348      if ($eqeq(self.closed, "read")) {
18349        return (self.closed = "both")
18350      } else {
18351        return (self.closed = "write")
18352      }
18353    });
18354
18355    $def(self, '$closed?', function $IO_closed$ques$3() {
18356      var self = this;
18357
18358      return self.closed['$==']("both")
18359    });
18360
18361    $def(self, '$closed_read?', function $IO_closed_read$ques$4() {
18362      var self = this, $ret_or_1 = nil;
18363
18364      if ($truthy(($ret_or_1 = self.closed['$==']("read")))) {
18365        return $ret_or_1
18366      } else {
18367        return self.closed['$==']("both")
18368      }
18369    });
18370
18371    $def(self, '$closed_write?', function $IO_closed_write$ques$5() {
18372      var self = this, $ret_or_1 = nil;
18373
18374      if ($truthy(($ret_or_1 = self.closed['$==']("write")))) {
18375        return $ret_or_1
18376      } else {
18377        return self.closed['$==']("both")
18378      }
18379    });
18380
18381    $def(self, '$check_writable', function $$check_writable() {
18382      var self = this;
18383
18384      if ($truthy(self['$closed_write?']())) {
18385        return $Kernel.$raise($$$('IOError'), "not opened for writing")
18386      } else {
18387        return nil
18388      }
18389    });
18390
18391    $def(self, '$check_readable', function $$check_readable() {
18392      var self = this;
18393
18394      if ($truthy(self['$closed_read?']())) {
18395        return $Kernel.$raise($$$('IOError'), "not opened for reading")
18396      } else {
18397        return nil
18398      }
18399    });
18400    $alias(self, "each_line", "each");
18401    return $alias(self, "eof?", "eof");
18402  })('::', null);
18403  $const_set('::', 'STDIN', ($gvars.stdin = $$$('IO').$new(0, "r")));
18404  $const_set('::', 'STDOUT', ($gvars.stdout = $$$('IO').$new(1, "w")));
18405  $const_set('::', 'STDERR', ($gvars.stderr = $$$('IO').$new(2, "w")));
18406  var console = Opal.global.console;
18407  $$$('STDOUT')['$write_proc='](typeof(process) === 'object' && typeof(process.stdout) === 'object' ? function(s){process.stdout.write(s);} : function(s){console.log(s);});
18408  $$$('STDERR')['$write_proc='](typeof(process) === 'object' && typeof(process.stderr) === 'object' ? function(s){process.stderr.write(s);} : function(s){console.warn(s);});
18409  return ($a = [function(s) { var p = prompt(); if (p !== null) return p + "\n"; return nil; }], $send($$$('STDIN'), 'read_proc=', $a), $a[$a.length - 1]);
18410};
18411
18412Opal.modules["opal/regexp_anchors"] = function(Opal) {/* Generated by Opal 1.7.3 */
18413  var $module = Opal.module, $const_set = Opal.const_set, $nesting = []; Opal.nil; var $$$ = Opal.$$$;
18414
18415  Opal.add_stubs('new');
18416  return (function($base, $parent_nesting) {
18417    var self = $module($base, 'Opal');
18418
18419    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
18420
18421
18422    $const_set(self, 'REGEXP_START', "^");
18423    $const_set(self, 'REGEXP_END', "$");
18424    $const_set(self, 'FORBIDDEN_STARTING_IDENTIFIER_CHARS', "\\u0001-\\u002F\\u003A-\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F");
18425    $const_set(self, 'FORBIDDEN_ENDING_IDENTIFIER_CHARS', "\\u0001-\\u0020\\u0022-\\u002F\\u003A-\\u003E\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F");
18426    $const_set(self, 'INLINE_IDENTIFIER_REGEXP', $$('Regexp').$new("[^" + ($$$(self, 'FORBIDDEN_STARTING_IDENTIFIER_CHARS')) + "]*[^" + ($$$(self, 'FORBIDDEN_ENDING_IDENTIFIER_CHARS')) + "]"));
18427    $const_set(self, 'FORBIDDEN_CONST_NAME_CHARS', "\\u0001-\\u0020\\u0021-\\u002F\\u003B-\\u003F\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F");
18428    return $const_set(self, 'CONST_NAME_REGEXP', $$('Regexp').$new("" + ($$$(self, 'REGEXP_START')) + "(::)?[A-Z][^" + ($$$(self, 'FORBIDDEN_CONST_NAME_CHARS')) + "]*" + ($$$(self, 'REGEXP_END'))));
18429  })($nesting[0], $nesting)
18430};
18431
18432Opal.modules["opal/mini"] = function(Opal) {/* Generated by Opal 1.7.3 */
18433  var $Object = Opal.Object; Opal.nil;
18434
18435  Opal.add_stubs('require');
18436
18437  $Object.$require("opal/base");
18438  $Object.$require("corelib/nil");
18439  $Object.$require("corelib/boolean");
18440  $Object.$require("corelib/string");
18441  $Object.$require("corelib/comparable");
18442  $Object.$require("corelib/enumerable");
18443  $Object.$require("corelib/enumerator");
18444  $Object.$require("corelib/array");
18445  $Object.$require("corelib/hash");
18446  $Object.$require("corelib/number");
18447  $Object.$require("corelib/range");
18448  $Object.$require("corelib/proc");
18449  $Object.$require("corelib/method");
18450  $Object.$require("corelib/regexp");
18451  $Object.$require("corelib/variables");
18452  $Object.$require("corelib/io");
18453  return $Object.$require("opal/regexp_anchors");
18454};
18455
18456Opal.modules["corelib/kernel/format"] = function(Opal) {/* Generated by Opal 1.7.3 */
18457  var $coerce_to = Opal.coerce_to, $module = Opal.module, $slice = Opal.slice, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $Opal = Opal.Opal, $Kernel = Opal.Kernel, $gvars = Opal.gvars, $def = Opal.def, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$;
18458
18459  Opal.add_stubs('respond_to?,[],==,length,coerce_to?,nil?,to_a,raise,to_int,fetch,Integer,Float,to_ary,to_str,inspect,to_s,format');
18460  return (function($base) {
18461    var self = $module($base, 'Kernel');
18462
18463
18464
18465
18466    $def(self, '$format', function $$format(format_string, $a) {
18467      var $post_args, args, ary = nil;
18468      if ($gvars.DEBUG == null) $gvars.DEBUG = nil;
18469
18470
18471      $post_args = $slice(arguments, 1);
18472      args = $post_args;
18473      if (($eqeq(args.$length(), 1) && ($truthy(args['$[]'](0)['$respond_to?']("to_ary"))))) {
18474
18475        ary = $Opal['$coerce_to?'](args['$[]'](0), $$$('Array'), "to_ary");
18476        if (!$truthy(ary['$nil?']())) {
18477          args = ary.$to_a();
18478        }      }
18479      var result = '',
18480          //used for slicing:
18481          begin_slice = 0,
18482          end_slice,
18483          //used for iterating over the format string:
18484          i,
18485          len = format_string.length,
18486          //used for processing field values:
18487          arg,
18488          str,
18489          //used for processing %g and %G fields:
18490          exponent,
18491          //used for keeping track of width and precision:
18492          width,
18493          precision,
18494          //used for holding temporary values:
18495          tmp_num,
18496          //used for processing %{} and %<> fileds:
18497          hash_parameter_key,
18498          closing_brace_char,
18499          //used for processing %b, %B, %o, %x, and %X fields:
18500          base_number,
18501          base_prefix,
18502          base_neg_zero_regex,
18503          base_neg_zero_digit,
18504          //used for processing arguments:
18505          next_arg,
18506          seq_arg_num = 1,
18507          pos_arg_num = 0,
18508          //used for keeping track of flags:
18509          flags,
18510          FNONE  = 0,
18511          FSHARP = 1,
18512          FMINUS = 2,
18513          FPLUS  = 4,
18514          FZERO  = 8,
18515          FSPACE = 16,
18516          FWIDTH = 32,
18517          FPREC  = 64,
18518          FPREC0 = 128;
18519
18520      function CHECK_FOR_FLAGS() {
18521        if (flags&FWIDTH) { $Kernel.$raise($$$('ArgumentError'), "flag after width"); }
18522        if (flags&FPREC0) { $Kernel.$raise($$$('ArgumentError'), "flag after precision"); }
18523      }
18524
18525      function CHECK_FOR_WIDTH() {
18526        if (flags&FWIDTH) { $Kernel.$raise($$$('ArgumentError'), "width given twice"); }
18527        if (flags&FPREC0) { $Kernel.$raise($$$('ArgumentError'), "width after precision"); }
18528      }
18529
18530      function GET_NTH_ARG(num) {
18531        if (num >= args.length) { $Kernel.$raise($$$('ArgumentError'), "too few arguments"); }
18532        return args[num];
18533      }
18534
18535      function GET_NEXT_ARG() {
18536        switch (pos_arg_num) {
18537        case -1: $Kernel.$raise($$$('ArgumentError'), "unnumbered(" + (seq_arg_num) + ") mixed with numbered"); // raise
18538        case -2: $Kernel.$raise($$$('ArgumentError'), "unnumbered(" + (seq_arg_num) + ") mixed with named"); // raise
18539        }
18540        pos_arg_num = seq_arg_num++;
18541        return GET_NTH_ARG(pos_arg_num - 1);
18542      }
18543
18544      function GET_POS_ARG(num) {
18545        if (pos_arg_num > 0) {
18546          $Kernel.$raise($$$('ArgumentError'), "numbered(" + (num) + ") after unnumbered(" + (pos_arg_num) + ")");
18547        }
18548        if (pos_arg_num === -2) {
18549          $Kernel.$raise($$$('ArgumentError'), "numbered(" + (num) + ") after named");
18550        }
18551        if (num < 1) {
18552          $Kernel.$raise($$$('ArgumentError'), "invalid index - " + (num) + "$");
18553        }
18554        pos_arg_num = -1;
18555        return GET_NTH_ARG(num - 1);
18556      }
18557
18558      function GET_ARG() {
18559        return (next_arg === undefined ? GET_NEXT_ARG() : next_arg);
18560      }
18561
18562      function READ_NUM(label) {
18563        var num, str = '';
18564        for (;; i++) {
18565          if (i === len) {
18566            $Kernel.$raise($$$('ArgumentError'), "malformed format string - %*[0-9]");
18567          }
18568          if (format_string.charCodeAt(i) < 48 || format_string.charCodeAt(i) > 57) {
18569            i--;
18570            num = parseInt(str, 10) || 0;
18571            if (num > 2147483647) {
18572              $Kernel.$raise($$$('ArgumentError'), "" + (label) + " too big");
18573            }
18574            return num;
18575          }
18576          str += format_string.charAt(i);
18577        }
18578      }
18579
18580      function READ_NUM_AFTER_ASTER(label) {
18581        var arg, num = READ_NUM(label);
18582        if (format_string.charAt(i + 1) === '$') {
18583          i++;
18584          arg = GET_POS_ARG(num);
18585        } else {
18586          arg = GET_NEXT_ARG();
18587        }
18588        return (arg).$to_int();
18589      }
18590
18591      for (i = format_string.indexOf('%'); i !== -1; i = format_string.indexOf('%', i)) {
18592        str = undefined;
18593
18594        flags = FNONE;
18595        width = -1;
18596        precision = -1;
18597        next_arg = undefined;
18598
18599        end_slice = i;
18600
18601        i++;
18602
18603        switch (format_string.charAt(i)) {
18604        case '%':
18605          begin_slice = i;
18606          // no-break
18607        case '':
18608        case '\n':
18609        case '\0':
18610          i++;
18611          continue;
18612        }
18613
18614        format_sequence: for (; i < len; i++) {
18615          switch (format_string.charAt(i)) {
18616
18617          case ' ':
18618            CHECK_FOR_FLAGS();
18619            flags |= FSPACE;
18620            continue format_sequence;
18621
18622          case '#':
18623            CHECK_FOR_FLAGS();
18624            flags |= FSHARP;
18625            continue format_sequence;
18626
18627          case '+':
18628            CHECK_FOR_FLAGS();
18629            flags |= FPLUS;
18630            continue format_sequence;
18631
18632          case '-':
18633            CHECK_FOR_FLAGS();
18634            flags |= FMINUS;
18635            continue format_sequence;
18636
18637          case '0':
18638            CHECK_FOR_FLAGS();
18639            flags |= FZERO;
18640            continue format_sequence;
18641
18642          case '1':
18643          case '2':
18644          case '3':
18645          case '4':
18646          case '5':
18647          case '6':
18648          case '7':
18649          case '8':
18650          case '9':
18651            tmp_num = READ_NUM('width');
18652            if (format_string.charAt(i + 1) === '$') {
18653              if (i + 2 === len) {
18654                str = '%';
18655                i++;
18656                break format_sequence;
18657              }
18658              if (next_arg !== undefined) {
18659                $Kernel.$raise($$$('ArgumentError'), "value given twice - %" + (tmp_num) + "$");
18660              }
18661              next_arg = GET_POS_ARG(tmp_num);
18662              i++;
18663            } else {
18664              CHECK_FOR_WIDTH();
18665              flags |= FWIDTH;
18666              width = tmp_num;
18667            }
18668            continue format_sequence;
18669
18670          case '<':
18671          case '\{':
18672            closing_brace_char = (format_string.charAt(i) === '<' ? '>' : '\}');
18673            hash_parameter_key = '';
18674
18675            i++;
18676
18677            for (;; i++) {
18678              if (i === len) {
18679                $Kernel.$raise($$$('ArgumentError'), "malformed name - unmatched parenthesis");
18680              }
18681              if (format_string.charAt(i) === closing_brace_char) {
18682
18683                if (pos_arg_num > 0) {
18684                  $Kernel.$raise($$$('ArgumentError'), "named " + (hash_parameter_key) + " after unnumbered(" + (pos_arg_num) + ")");
18685                }
18686                if (pos_arg_num === -1) {
18687                  $Kernel.$raise($$$('ArgumentError'), "named " + (hash_parameter_key) + " after numbered");
18688                }
18689                pos_arg_num = -2;
18690
18691                if (args[0] === undefined || !args[0].$$is_hash) {
18692                  $Kernel.$raise($$$('ArgumentError'), "one hash required");
18693                }
18694
18695                next_arg = (args[0]).$fetch(hash_parameter_key);
18696
18697                if (closing_brace_char === '>') {
18698                  continue format_sequence;
18699                } else {
18700                  str = next_arg.toString();
18701                  if (precision !== -1) { str = str.slice(0, precision); }
18702                  if (flags&FMINUS) {
18703                    while (str.length < width) { str = str + ' '; }
18704                  } else {
18705                    while (str.length < width) { str = ' ' + str; }
18706                  }
18707                  break format_sequence;
18708                }
18709              }
18710              hash_parameter_key += format_string.charAt(i);
18711            }
18712            // raise
18713
18714          case '*':
18715            i++;
18716            CHECK_FOR_WIDTH();
18717            flags |= FWIDTH;
18718            width = READ_NUM_AFTER_ASTER('width');
18719            if (width < 0) {
18720              flags |= FMINUS;
18721              width = -width;
18722            }
18723            continue format_sequence;
18724
18725          case '.':
18726            if (flags&FPREC0) {
18727              $Kernel.$raise($$$('ArgumentError'), "precision given twice");
18728            }
18729            flags |= FPREC|FPREC0;
18730            precision = 0;
18731            i++;
18732            if (format_string.charAt(i) === '*') {
18733              i++;
18734              precision = READ_NUM_AFTER_ASTER('precision');
18735              if (precision < 0) {
18736                flags &= ~FPREC;
18737              }
18738              continue format_sequence;
18739            }
18740            precision = READ_NUM('precision');
18741            continue format_sequence;
18742
18743          case 'd':
18744          case 'i':
18745          case 'u':
18746            arg = $Kernel.$Integer(GET_ARG());
18747            if (arg >= 0) {
18748              str = arg.toString();
18749              while (str.length < precision) { str = '0' + str; }
18750              if (flags&FMINUS) {
18751                if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18752                while (str.length < width) { str = str + ' '; }
18753              } else {
18754                if (flags&FZERO && precision === -1) {
18755                  while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0)) { str = '0' + str; }
18756                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18757                } else {
18758                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18759                  while (str.length < width) { str = ' ' + str; }
18760                }
18761              }
18762            } else {
18763              str = (-arg).toString();
18764              while (str.length < precision) { str = '0' + str; }
18765              if (flags&FMINUS) {
18766                str = '-' + str;
18767                while (str.length < width) { str = str + ' '; }
18768              } else {
18769                if (flags&FZERO && precision === -1) {
18770                  while (str.length < width - 1) { str = '0' + str; }
18771                  str = '-' + str;
18772                } else {
18773                  str = '-' + str;
18774                  while (str.length < width) { str = ' ' + str; }
18775                }
18776              }
18777            }
18778            break format_sequence;
18779
18780          case 'b':
18781          case 'B':
18782          case 'o':
18783          case 'x':
18784          case 'X':
18785            switch (format_string.charAt(i)) {
18786            case 'b':
18787            case 'B':
18788              base_number = 2;
18789              base_prefix = '0b';
18790              base_neg_zero_regex = /^1+/;
18791              base_neg_zero_digit = '1';
18792              break;
18793            case 'o':
18794              base_number = 8;
18795              base_prefix = '0';
18796              base_neg_zero_regex = /^3?7+/;
18797              base_neg_zero_digit = '7';
18798              break;
18799            case 'x':
18800            case 'X':
18801              base_number = 16;
18802              base_prefix = '0x';
18803              base_neg_zero_regex = /^f+/;
18804              base_neg_zero_digit = 'f';
18805              break;
18806            }
18807            arg = $Kernel.$Integer(GET_ARG());
18808            if (arg >= 0) {
18809              str = arg.toString(base_number);
18810              while (str.length < precision) { str = '0' + str; }
18811              if (flags&FMINUS) {
18812                if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18813                if (flags&FSHARP && arg !== 0) { str = base_prefix + str; }
18814                while (str.length < width) { str = str + ' '; }
18815              } else {
18816                if (flags&FZERO && precision === -1) {
18817                  while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0) - ((flags&FSHARP && arg !== 0) ? base_prefix.length : 0)) { str = '0' + str; }
18818                  if (flags&FSHARP && arg !== 0) { str = base_prefix + str; }
18819                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18820                } else {
18821                  if (flags&FSHARP && arg !== 0) { str = base_prefix + str; }
18822                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18823                  while (str.length < width) { str = ' ' + str; }
18824                }
18825              }
18826            } else {
18827              if (flags&FPLUS || flags&FSPACE) {
18828                str = (-arg).toString(base_number);
18829                while (str.length < precision) { str = '0' + str; }
18830                if (flags&FMINUS) {
18831                  if (flags&FSHARP) { str = base_prefix + str; }
18832                  str = '-' + str;
18833                  while (str.length < width) { str = str + ' '; }
18834                } else {
18835                  if (flags&FZERO && precision === -1) {
18836                    while (str.length < width - 1 - (flags&FSHARP ? 2 : 0)) { str = '0' + str; }
18837                    if (flags&FSHARP) { str = base_prefix + str; }
18838                    str = '-' + str;
18839                  } else {
18840                    if (flags&FSHARP) { str = base_prefix + str; }
18841                    str = '-' + str;
18842                    while (str.length < width) { str = ' ' + str; }
18843                  }
18844                }
18845              } else {
18846                str = (arg >>> 0).toString(base_number).replace(base_neg_zero_regex, base_neg_zero_digit);
18847                while (str.length < precision - 2) { str = base_neg_zero_digit + str; }
18848                if (flags&FMINUS) {
18849                  str = '..' + str;
18850                  if (flags&FSHARP) { str = base_prefix + str; }
18851                  while (str.length < width) { str = str + ' '; }
18852                } else {
18853                  if (flags&FZERO && precision === -1) {
18854                    while (str.length < width - 2 - (flags&FSHARP ? base_prefix.length : 0)) { str = base_neg_zero_digit + str; }
18855                    str = '..' + str;
18856                    if (flags&FSHARP) { str = base_prefix + str; }
18857                  } else {
18858                    str = '..' + str;
18859                    if (flags&FSHARP) { str = base_prefix + str; }
18860                    while (str.length < width) { str = ' ' + str; }
18861                  }
18862                }
18863              }
18864            }
18865            if (format_string.charAt(i) === format_string.charAt(i).toUpperCase()) {
18866              str = str.toUpperCase();
18867            }
18868            break format_sequence;
18869
18870          case 'f':
18871          case 'e':
18872          case 'E':
18873          case 'g':
18874          case 'G':
18875            arg = $Kernel.$Float(GET_ARG());
18876            if (arg >= 0 || isNaN(arg)) {
18877              if (arg === Infinity) {
18878                str = 'Inf';
18879              } else {
18880                switch (format_string.charAt(i)) {
18881                case 'f':
18882                  str = arg.toFixed(precision === -1 ? 6 : precision);
18883                  break;
18884                case 'e':
18885                case 'E':
18886                  str = arg.toExponential(precision === -1 ? 6 : precision);
18887                  break;
18888                case 'g':
18889                case 'G':
18890                  str = arg.toExponential();
18891                  exponent = parseInt(str.split('e')[1], 10);
18892                  if (!(exponent < -4 || exponent >= (precision === -1 ? 6 : precision))) {
18893                    str = arg.toPrecision(precision === -1 ? (flags&FSHARP ? 6 : undefined) : precision);
18894                  }
18895                  break;
18896                }
18897              }
18898              if (flags&FMINUS) {
18899                if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18900                while (str.length < width) { str = str + ' '; }
18901              } else {
18902                if (flags&FZERO && arg !== Infinity && !isNaN(arg)) {
18903                  while (str.length < width - ((flags&FPLUS || flags&FSPACE) ? 1 : 0)) { str = '0' + str; }
18904                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18905                } else {
18906                  if (flags&FPLUS || flags&FSPACE) { str = (flags&FPLUS ? '+' : ' ') + str; }
18907                  while (str.length < width) { str = ' ' + str; }
18908                }
18909              }
18910            } else {
18911              if (arg === -Infinity) {
18912                str = 'Inf';
18913              } else {
18914                switch (format_string.charAt(i)) {
18915                case 'f':
18916                  str = (-arg).toFixed(precision === -1 ? 6 : precision);
18917                  break;
18918                case 'e':
18919                case 'E':
18920                  str = (-arg).toExponential(precision === -1 ? 6 : precision);
18921                  break;
18922                case 'g':
18923                case 'G':
18924                  str = (-arg).toExponential();
18925                  exponent = parseInt(str.split('e')[1], 10);
18926                  if (!(exponent < -4 || exponent >= (precision === -1 ? 6 : precision))) {
18927                    str = (-arg).toPrecision(precision === -1 ? (flags&FSHARP ? 6 : undefined) : precision);
18928                  }
18929                  break;
18930                }
18931              }
18932              if (flags&FMINUS) {
18933                str = '-' + str;
18934                while (str.length < width) { str = str + ' '; }
18935              } else {
18936                if (flags&FZERO && arg !== -Infinity) {
18937                  while (str.length < width - 1) { str = '0' + str; }
18938                  str = '-' + str;
18939                } else {
18940                  str = '-' + str;
18941                  while (str.length < width) { str = ' ' + str; }
18942                }
18943              }
18944            }
18945            if (format_string.charAt(i) === format_string.charAt(i).toUpperCase() && arg !== Infinity && arg !== -Infinity && !isNaN(arg)) {
18946              str = str.toUpperCase();
18947            }
18948            str = str.replace(/([eE][-+]?)([0-9])$/, '$10$2');
18949            break format_sequence;
18950
18951          case 'a':
18952          case 'A':
18953            // Not implemented because there are no specs for this field type.
18954            $Kernel.$raise($$$('NotImplementedError'), "`A` and `a` format field types are not implemented in Opal yet");
18955            // raise
18956
18957          case 'c':
18958            arg = GET_ARG();
18959            if ((arg)['$respond_to?']("to_ary")) { arg = (arg).$to_ary()[0]; }
18960            if ((arg)['$respond_to?']("to_str")) {
18961              str = (arg).$to_str();
18962            } else {
18963              str = String.fromCharCode($coerce_to(arg, $$$('Integer'), 'to_int'));
18964            }
18965            if (str.length !== 1) {
18966              $Kernel.$raise($$$('ArgumentError'), "%c requires a character");
18967            }
18968            if (flags&FMINUS) {
18969              while (str.length < width) { str = str + ' '; }
18970            } else {
18971              while (str.length < width) { str = ' ' + str; }
18972            }
18973            break format_sequence;
18974
18975          case 'p':
18976            str = (GET_ARG()).$inspect();
18977            if (precision !== -1) { str = str.slice(0, precision); }
18978            if (flags&FMINUS) {
18979              while (str.length < width) { str = str + ' '; }
18980            } else {
18981              while (str.length < width) { str = ' ' + str; }
18982            }
18983            break format_sequence;
18984
18985          case 's':
18986            str = (GET_ARG()).$to_s();
18987            if (precision !== -1) { str = str.slice(0, precision); }
18988            if (flags&FMINUS) {
18989              while (str.length < width) { str = str + ' '; }
18990            } else {
18991              while (str.length < width) { str = ' ' + str; }
18992            }
18993            break format_sequence;
18994
18995          default:
18996            $Kernel.$raise($$$('ArgumentError'), "malformed format string - %" + (format_string.charAt(i)));
18997          }
18998        }
18999
19000        if (str === undefined) {
19001          $Kernel.$raise($$$('ArgumentError'), "malformed format string - %");
19002        }
19003
19004        result += format_string.slice(begin_slice, end_slice) + str;
19005        begin_slice = i + 1;
19006      }
19007
19008      if ($gvars.DEBUG && pos_arg_num >= 0 && seq_arg_num < args.length) {
19009        $Kernel.$raise($$$('ArgumentError'), "too many arguments for format string");
19010      }
19011
19012      return result + format_string.slice(begin_slice);
19013    }, -2);
19014    return $alias(self, "sprintf", "format");
19015  })('::')
19016};
19017
19018Opal.modules["corelib/string/encoding"] = function(Opal) {/* Generated by Opal 1.7.3 */
19019  var $klass = Opal.klass, $hash2 = Opal.hash2, $rb_plus = Opal.rb_plus, $truthy = Opal.truthy, $send = Opal.send, $defs = Opal.defs, $eqeq = Opal.eqeq, $def = Opal.def, $return_ivar = Opal.return_ivar, $return_val = Opal.return_val, $slice = Opal.slice, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $rb_lt = Opal.rb_lt, $a, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$;
19020
19021  Opal.add_stubs('require,+,[],clone,initialize,new,instance_eval,to_proc,each,const_set,tr,==,default_external,attr_accessor,singleton_class,attr_reader,raise,register,length,bytes,force_encoding,dup,bytesize,enum_for,each_byte,to_a,each_char,each_codepoint,coerce_to!,find,<,default_external=');
19022
19023  self.$require("corelib/string");
19024  (function($base, $super) {
19025    var self = $klass($base, $super, 'Encoding');
19026
19027    var $proto = self.$$prototype;
19028
19029    $proto.name = $proto.dummy = nil;
19030
19031    $defs(self, '$register', function $$register(name, options) {
19032      var block = $$register.$$p || nil, self = this, names = nil, $ret_or_1 = nil, ascii = nil, dummy = nil, encoding = nil, register = nil;
19033
19034      $$register.$$p = null;
19035      if (options == null) options = $hash2([], {});
19036      names = $rb_plus([name], ($truthy(($ret_or_1 = options['$[]']("aliases"))) ? ($ret_or_1) : ([])));
19037      ascii = ($truthy(($ret_or_1 = options['$[]']("ascii"))) && ($ret_or_1));
19038      dummy = ($truthy(($ret_or_1 = options['$[]']("dummy"))) && ($ret_or_1));
19039      if ($truthy(options['$[]']("inherits"))) {
19040
19041        encoding = options['$[]']("inherits").$clone();
19042        encoding.$initialize(name, names, ascii, dummy);
19043      } else {
19044        encoding = self.$new(name, names, ascii, dummy);
19045      }      if ((block !== nil)) {
19046        $send(encoding, 'instance_eval', [], block.$to_proc());
19047      }      register = Opal.encodings;
19048      return $send(names, 'each', [], function $$1(encoding_name){var self = $$1.$$s == null ? this : $$1.$$s;
19049
19050
19051        if (encoding_name == null) encoding_name = nil;
19052        self.$const_set(encoding_name.$tr("-", "_"), encoding);
19053        return register[encoding_name] = encoding;}, {$$s: self});
19054    }, -2);
19055    $defs(self, '$find', function $$find(name) {
19056      var self = this;
19057
19058
19059      if ($eqeq(name, "default_external")) {
19060        return self.$default_external()
19061      }      return Opal.find_encoding(name);    });
19062    self.$singleton_class().$attr_accessor("default_external");
19063    self.$attr_reader("name", "names");
19064
19065    $def(self, '$initialize', function $$initialize(name, names, ascii, dummy) {
19066      var self = this;
19067
19068
19069      self.name = name;
19070      self.names = names;
19071      self.ascii = ascii;
19072      return (self.dummy = dummy);
19073    });
19074
19075    $def(self, '$ascii_compatible?', $return_ivar("ascii"));
19076
19077    $def(self, '$dummy?', $return_ivar("dummy"));
19078
19079    $def(self, '$binary?', $return_val(false));
19080
19081    $def(self, '$to_s', $return_ivar("name"));
19082
19083    $def(self, '$inspect', function $$inspect() {
19084      var self = this;
19085
19086      return "#<Encoding:" + (self.name) + (($truthy(self.dummy) ? (" (dummy)") : nil)) + ">"
19087    });
19088
19089    $def(self, '$charsize', function $$charsize(string) {
19090
19091
19092      var len = 0;
19093      for (var i = 0, length = string.length; i < length; i++) {
19094        var charcode = string.charCodeAt(i);
19095        if (!(charcode >= 0xD800 && charcode <= 0xDBFF)) {
19096          len++;
19097        }
19098      }
19099      return len;
19100
19101    });
19102
19103    $def(self, '$each_char', function $$each_char(string) {
19104      var block = $$each_char.$$p || nil;
19105
19106      $$each_char.$$p = null;
19107
19108      var low_surrogate = "";
19109      for (var i = 0, length = string.length; i < length; i++) {
19110        var charcode = string.charCodeAt(i);
19111        var chr = string.charAt(i);
19112        if (charcode >= 0xDC00 && charcode <= 0xDFFF) {
19113          low_surrogate = chr;
19114          continue;
19115        }
19116        else if (charcode >= 0xD800 && charcode <= 0xDBFF) {
19117          chr = low_surrogate + chr;
19118        }
19119        if (string.encoding.name != "UTF-8") {
19120          chr = new String(chr);
19121          chr.encoding = string.encoding;
19122        }
19123        Opal.yield1(block, chr);
19124      }
19125    });
19126
19127    $def(self, '$each_byte', function $$each_byte($a) {
19128
19129
19130      $slice(arguments);
19131      return $Kernel.$raise($$$('NotImplementedError'));
19132    }, -1);
19133
19134    $def(self, '$bytesize', function $$bytesize($a) {
19135
19136
19137      $slice(arguments);
19138      return $Kernel.$raise($$$('NotImplementedError'));
19139    }, -1);
19140    $klass('::', $$$('StandardError'), 'EncodingError');
19141    return ($klass('::', $$$('EncodingError'), 'CompatibilityError'), nil);
19142  })('::', null);
19143  $send($$$('Encoding'), 'register', ["UTF-8", $hash2(["aliases", "ascii"], {"aliases": ["CP65001"], "ascii": true})], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s;
19144
19145
19146
19147    $def(self, '$each_byte', function $$each_byte(string) {
19148      var block = $$each_byte.$$p || nil;
19149
19150      $$each_byte.$$p = null;
19151
19152      // Taken from: https://github.com/feross/buffer/blob/f52dffd9df0445b93c0c9065c2f8f0f46b2c729a/index.js#L1954-L2032
19153      var units = Infinity;
19154      var codePoint;
19155      var length = string.length;
19156      var leadSurrogate = null;
19157
19158      for (var i = 0; i < length; ++i) {
19159        codePoint = string.charCodeAt(i);
19160
19161        // is surrogate component
19162        if (codePoint > 0xD7FF && codePoint < 0xE000) {
19163          // last char was a lead
19164          if (!leadSurrogate) {
19165            // no lead yet
19166            if (codePoint > 0xDBFF) {
19167              // unexpected trail
19168              if ((units -= 3) > -1) {
19169                Opal.yield1(block, 0xEF);
19170                Opal.yield1(block, 0xBF);
19171                Opal.yield1(block, 0xBD);
19172              }
19173              continue;
19174            } else if (i + 1 === length) {
19175              // unpaired lead
19176              if ((units -= 3) > -1) {
19177                Opal.yield1(block, 0xEF);
19178                Opal.yield1(block, 0xBF);
19179                Opal.yield1(block, 0xBD);
19180              }
19181              continue;
19182            }
19183
19184            // valid lead
19185            leadSurrogate = codePoint;
19186
19187            continue;
19188          }
19189
19190          // 2 leads in a row
19191          if (codePoint < 0xDC00) {
19192            if ((units -= 3) > -1) {
19193              Opal.yield1(block, 0xEF);
19194              Opal.yield1(block, 0xBF);
19195              Opal.yield1(block, 0xBD);
19196            }
19197            leadSurrogate = codePoint;
19198            continue;
19199          }
19200
19201          // valid surrogate pair
19202          codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
19203        } else if (leadSurrogate) {
19204          // valid bmp char, but last char was a lead
19205          if ((units -= 3) > -1) {
19206            Opal.yield1(block, 0xEF);
19207            Opal.yield1(block, 0xBF);
19208            Opal.yield1(block, 0xBD);
19209          }
19210        }
19211
19212        leadSurrogate = null;
19213
19214        // encode utf8
19215        if (codePoint < 0x80) {
19216          if ((units -= 1) < 0) break;
19217          Opal.yield1(block, codePoint);
19218        } else if (codePoint < 0x800) {
19219          if ((units -= 2) < 0) break;
19220          Opal.yield1(block, codePoint >> 0x6 | 0xC0);
19221          Opal.yield1(block, codePoint & 0x3F | 0x80);
19222        } else if (codePoint < 0x10000) {
19223          if ((units -= 3) < 0) break;
19224          Opal.yield1(block, codePoint >> 0xC | 0xE0);
19225          Opal.yield1(block, codePoint >> 0x6 & 0x3F | 0x80);
19226          Opal.yield1(block, codePoint & 0x3F | 0x80);
19227        } else if (codePoint < 0x110000) {
19228          if ((units -= 4) < 0) break;
19229          Opal.yield1(block, codePoint >> 0x12 | 0xF0);
19230          Opal.yield1(block, codePoint >> 0xC & 0x3F | 0x80);
19231          Opal.yield1(block, codePoint >> 0x6 & 0x3F | 0x80);
19232          Opal.yield1(block, codePoint & 0x3F | 0x80);
19233        } else ;
19234      }
19235    });
19236    return $def(self, '$bytesize', function $$bytesize(string) {
19237
19238      return string.$bytes().$length()
19239    });}, {$$s: self});
19240  $send($$$('Encoding'), 'register', ["UTF-16LE"], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s;
19241
19242
19243
19244    $def(self, '$each_byte', function $$each_byte(string) {
19245      var block = $$each_byte.$$p || nil;
19246
19247      $$each_byte.$$p = null;
19248
19249      for (var i = 0, length = string.length; i < length; i++) {
19250        var code = string.charCodeAt(i);
19251
19252        Opal.yield1(block, code & 0xff);
19253        Opal.yield1(block, code >> 8);
19254      }
19255    });
19256    return $def(self, '$bytesize', function $$bytesize(string) {
19257
19258      return string.length * 2;
19259    });}, {$$s: self});
19260  $send($$$('Encoding'), 'register', ["UTF-16BE", $hash2(["inherits"], {"inherits": $$$($$$('Encoding'), 'UTF_16LE')})], function $$4(){var self = $$4.$$s == null ? this : $$4.$$s;
19261
19262    return $def(self, '$each_byte', function $$each_byte(string) {
19263      var block = $$each_byte.$$p || nil;
19264
19265      $$each_byte.$$p = null;
19266
19267      for (var i = 0, length = string.length; i < length; i++) {
19268        var code = string.charCodeAt(i);
19269
19270        Opal.yield1(block, code >> 8);
19271        Opal.yield1(block, code & 0xff);
19272      }
19273    })}, {$$s: self});
19274  $send($$$('Encoding'), 'register', ["UTF-32LE"], function $$5(){var self = $$5.$$s == null ? this : $$5.$$s;
19275
19276
19277
19278    $def(self, '$each_byte', function $$each_byte(string) {
19279      var block = $$each_byte.$$p || nil;
19280
19281      $$each_byte.$$p = null;
19282
19283      for (var i = 0, length = string.length; i < length; i++) {
19284        var code = string.charCodeAt(i);
19285
19286        Opal.yield1(block, code & 0xff);
19287        Opal.yield1(block, code >> 8);
19288        Opal.yield1(block, 0);
19289        Opal.yield1(block, 0);
19290      }
19291    });
19292    return $def(self, '$bytesize', function $$bytesize(string) {
19293
19294      return string.length * 4;
19295    });}, {$$s: self});
19296  $send($$$('Encoding'), 'register', ["UTF-32BE", $hash2(["inherits"], {"inherits": $$$($$$('Encoding'), 'UTF_32LE')})], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s;
19297
19298    return $def(self, '$each_byte', function $$each_byte(string) {
19299      var block = $$each_byte.$$p || nil;
19300
19301      $$each_byte.$$p = null;
19302
19303      for (var i = 0, length = string.length; i < length; i++) {
19304        var code = string.charCodeAt(i);
19305
19306        Opal.yield1(block, 0);
19307        Opal.yield1(block, 0);
19308        Opal.yield1(block, code >> 8);
19309        Opal.yield1(block, code & 0xff);
19310      }
19311    })}, {$$s: self});
19312  $send($$$('Encoding'), 'register', ["ASCII-8BIT", $hash2(["aliases", "ascii"], {"aliases": ["BINARY"], "ascii": true})], function $$7(){var self = $$7.$$s == null ? this : $$7.$$s;
19313
19314
19315
19316    $def(self, '$each_char', function $$each_char(string) {
19317      var block = $$each_char.$$p || nil;
19318
19319      $$each_char.$$p = null;
19320
19321      for (var i = 0, length = string.length; i < length; i++) {
19322        var chr = new String(string.charAt(i));
19323        chr.encoding = string.encoding;
19324        Opal.yield1(block, chr);
19325      }
19326    });
19327
19328    $def(self, '$charsize', function $$charsize(string) {
19329
19330      return string.length;
19331    });
19332
19333    $def(self, '$each_byte', function $$each_byte(string) {
19334      var block = $$each_byte.$$p || nil;
19335
19336      $$each_byte.$$p = null;
19337
19338      for (var i = 0, length = string.length; i < length; i++) {
19339        var code = string.charCodeAt(i);
19340        Opal.yield1(block, code & 0xff);
19341      }
19342    });
19343
19344    $def(self, '$bytesize', function $$bytesize(string) {
19345
19346      return string.length;
19347    });
19348    return $def(self, '$binary?', $return_val(true));}, {$$s: self});
19349  $$$('Encoding').$register("ISO-8859-1", $hash2(["aliases", "ascii", "inherits"], {"aliases": ["ISO8859-1"], "ascii": true, "inherits": $$$($$$('Encoding'), 'ASCII_8BIT')}));
19350  $$$('Encoding').$register("US-ASCII", $hash2(["aliases", "ascii", "inherits"], {"aliases": ["ASCII"], "ascii": true, "inherits": $$$($$$('Encoding'), 'ASCII_8BIT')}));
19351  (function($base, $super) {
19352    var self = $klass($base, $super, 'String');
19353
19354    var $proto = self.$$prototype;
19355
19356    $proto.internal_encoding = $proto.bytes = $proto.encoding = nil;
19357
19358    self.$attr_reader("encoding");
19359    self.$attr_reader("internal_encoding");
19360    Opal.prop(String.prototype, 'bytes', nil);
19361    Opal.prop(String.prototype, 'encoding', $$$($$$('Encoding'), 'UTF_8'));
19362    Opal.prop(String.prototype, 'internal_encoding', $$$($$$('Encoding'), 'UTF_8'));
19363
19364    $def(self, '$b', function $$b() {
19365      var self = this;
19366
19367      return self.$dup().$force_encoding("binary")
19368    });
19369
19370    $def(self, '$bytesize', function $$bytesize() {
19371      var self = this;
19372
19373      return self.internal_encoding.$bytesize(self)
19374    });
19375
19376    $def(self, '$each_byte', function $$each_byte() {
19377      var block = $$each_byte.$$p || nil, self = this;
19378
19379      $$each_byte.$$p = null;
19380      if (!(block !== nil)) {
19381        return $send(self, 'enum_for', ["each_byte"], function $$8(){var self = $$8.$$s == null ? this : $$8.$$s;
19382
19383          return self.$bytesize()}, {$$s: self})
19384      }      $send(self.internal_encoding, 'each_byte', [self], block.$to_proc());
19385      return self;
19386    });
19387
19388    $def(self, '$bytes', function $$bytes() {
19389      var self = this, $ret_or_1 = nil;
19390
19391
19392
19393      if (typeof self === 'string') {
19394        return (new String(self)).$each_byte().$to_a();
19395      }
19396      self.bytes = ($truthy(($ret_or_1 = self.bytes)) ? ($ret_or_1) : (self.$each_byte().$to_a()));
19397      return self.bytes.$dup();
19398    });
19399
19400    $def(self, '$each_char', function $$each_char() {
19401      var block = $$each_char.$$p || nil, self = this;
19402
19403      $$each_char.$$p = null;
19404      if (!(block !== nil)) {
19405        return $send(self, 'enum_for', ["each_char"], function $$9(){var self = $$9.$$s == null ? this : $$9.$$s;
19406
19407          return self.$length()}, {$$s: self})
19408      }      $send(self.encoding, 'each_char', [self], block.$to_proc());
19409      return self;
19410    });
19411
19412    $def(self, '$chars', function $$chars() {
19413      var block = $$chars.$$p || nil, self = this;
19414
19415      $$chars.$$p = null;
19416      if (!$truthy(block)) {
19417        return self.$each_char().$to_a()
19418      }      return $send(self, 'each_char', [], block.$to_proc());
19419    });
19420
19421    $def(self, '$each_codepoint', function $$each_codepoint() {
19422      var block = $$each_codepoint.$$p || nil, self = this;
19423
19424      $$each_codepoint.$$p = null;
19425      if (!(block !== nil)) {
19426        return self.$enum_for("each_codepoint")
19427      }
19428      for (var i = 0, length = self.length; i < length; i++) {
19429        Opal.yield1(block, self.codePointAt(i));
19430      }
19431      return self;
19432    });
19433
19434    $def(self, '$codepoints', function $$codepoints() {
19435      var block = $$codepoints.$$p || nil, self = this;
19436
19437      $$codepoints.$$p = null;
19438      if ((block !== nil)) {
19439        return $send(self, 'each_codepoint', [], block.$to_proc())
19440      }      return self.$each_codepoint().$to_a();
19441    });
19442
19443    $def(self, '$encode', function $$encode(encoding) {
19444      var self = this;
19445
19446      return Opal.enc(self, encoding);
19447    });
19448
19449    $def(self, '$force_encoding', function $$force_encoding(encoding) {
19450      var self = this;
19451
19452
19453      var str = self;
19454
19455      if (encoding === str.encoding) { return str; }
19456
19457      encoding = $Opal['$coerce_to!'](encoding, $$$('String'), "to_s");
19458      encoding = $$$('Encoding').$find(encoding);
19459
19460      if (encoding === str.encoding) { return str; }
19461
19462      str = Opal.set_encoding(str, encoding);
19463
19464      return str;
19465
19466    });
19467
19468    $def(self, '$getbyte', function $$getbyte(idx) {
19469      var self = this, string_bytes = nil;
19470
19471
19472      string_bytes = self.$bytes();
19473      idx = $Opal['$coerce_to!'](idx, $$$('Integer'), "to_int");
19474      if ($truthy($rb_lt(string_bytes.$length(), idx))) {
19475        return nil
19476      }      return string_bytes['$[]'](idx);
19477    });
19478
19479    $def(self, '$initialize_copy', function $$initialize_copy(other) {
19480
19481      return "\n" + "      self.encoding = other.encoding;\n" + "      self.internal_encoding = other.internal_encoding;\n" + "    "
19482    });
19483    return $def(self, '$valid_encoding?', $return_val(true));
19484  })('::', null);
19485  return ($a = [$$$($$('Encoding'), 'UTF_8')], $send($$$('Encoding'), 'default_external=', $a), $a[$a.length - 1]);
19486};
19487
19488Opal.modules["corelib/math"] = function(Opal) {/* Generated by Opal 1.7.3 */
19489  var $type_error = Opal.type_error, $module = Opal.module, $const_set = Opal.const_set, $Class = Opal.Class, $slice = Opal.slice, $Kernel = Opal.Kernel, $defs = Opal.defs, $truthy = Opal.truthy, $send = Opal.send, $def = Opal.def, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $rb_divide = Opal.rb_divide, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
19490
19491  Opal.add_stubs('new,raise,Float,Integer,module_function,each,define_method,checked,float!,===,gamma,-,integer!,/,infinite?');
19492  return (function($base, $parent_nesting) {
19493    var self = $module($base, 'Math');
19494
19495    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
19496
19497
19498    $const_set(self, 'E', Math.E);
19499    $const_set(self, 'PI', Math.PI);
19500    $const_set(self, 'DomainError', $Class.$new($$$('StandardError')));
19501    $defs(self, '$checked', function $$checked(method, $a) {
19502      var $post_args, args;
19503
19504
19505      $post_args = $slice(arguments, 1);
19506      args = $post_args;
19507
19508      if (isNaN(args[0]) || (args.length == 2 && isNaN(args[1]))) {
19509        return NaN;
19510      }
19511
19512      var result = Math[method].apply(null, args);
19513
19514      if (isNaN(result)) {
19515        $Kernel.$raise($$('DomainError'), "Numerical argument is out of domain - \"" + (method) + "\"");
19516      }
19517
19518      return result;
19519    }, -2);
19520    $defs(self, '$float!', function $Math_float$excl$1(value) {
19521
19522      try {
19523        return $Kernel.$Float(value)
19524      } catch ($err) {
19525        if (Opal.rescue($err, [$$$('ArgumentError')])) {
19526          try {
19527            return $Kernel.$raise($type_error(value, $$$('Float')))
19528          } finally { Opal.pop_exception(); }
19529        } else { throw $err; }
19530      }
19531    });
19532    $defs(self, '$integer!', function $Math_integer$excl$2(value) {
19533
19534      try {
19535        return $Kernel.$Integer(value)
19536      } catch ($err) {
19537        if (Opal.rescue($err, [$$$('ArgumentError')])) {
19538          try {
19539            return $Kernel.$raise($type_error(value, $$$('Integer')))
19540          } finally { Opal.pop_exception(); }
19541        } else { throw $err; }
19542      }
19543    });
19544    self.$module_function();
19545    if (!$truthy((typeof(Math.erf) !== "undefined"))) {
19546
19547      Opal.prop(Math, 'erf', function(x) {
19548        var A1 =  0.254829592,
19549            A2 = -0.284496736,
19550            A3 =  1.421413741,
19551            A4 = -1.453152027,
19552            A5 =  1.061405429,
19553            P  =  0.3275911;
19554
19555        var sign = 1;
19556
19557        if (x < 0) {
19558            sign = -1;
19559        }
19560
19561        x = Math.abs(x);
19562
19563        var t = 1.0 / (1.0 + P * x);
19564        var y = 1.0 - (((((A5 * t + A4) * t) + A3) * t + A2) * t + A1) * t * Math.exp(-x * x);
19565
19566        return sign * y;
19567      });
19568
19569    }    if (!$truthy((typeof(Math.erfc) !== "undefined"))) {
19570
19571      Opal.prop(Math, 'erfc', function(x) {
19572        var z = Math.abs(x),
19573            t = 1.0 / (0.5 * z + 1.0);
19574
19575        var A1 = t * 0.17087277 + -0.82215223,
19576            A2 = t * A1 + 1.48851587,
19577            A3 = t * A2 + -1.13520398,
19578            A4 = t * A3 + 0.27886807,
19579            A5 = t * A4 + -0.18628806,
19580            A6 = t * A5 + 0.09678418,
19581            A7 = t * A6 + 0.37409196,
19582            A8 = t * A7 + 1.00002368,
19583            A9 = t * A8,
19584            A10 = -z * z - 1.26551223 + A9;
19585
19586        var a = t * Math.exp(A10);
19587
19588        if (x < 0.0) {
19589          return 2.0 - a;
19590        }
19591        else {
19592          return a;
19593        }
19594      });
19595
19596    }    $send(["acos", "acosh", "asin", "asinh", "atan", "atanh", "cbrt", "cos", "cosh", "erf", "erfc", "exp", "sin", "sinh", "sqrt", "tanh"], 'each', [], function $Math$3(method){var self = $Math$3.$$s == null ? this : $Math$3.$$s;
19597
19598
19599      if (method == null) method = nil;
19600      return $send(self, 'define_method', [method], function $$4(x){
19601
19602        if (x == null) x = nil;
19603        return $$$('Math').$checked(method, $$$('Math')['$float!'](x));});}, {$$s: self});
19604
19605    $def(self, '$atan2', function $$atan2(y, x) {
19606
19607      return $$$('Math').$checked("atan2", $$$('Math')['$float!'](y), $$$('Math')['$float!'](x))
19608    });
19609
19610    $def(self, '$hypot', function $$hypot(x, y) {
19611
19612      return $$$('Math').$checked("hypot", $$$('Math')['$float!'](x), $$$('Math')['$float!'](y))
19613    });
19614
19615    $def(self, '$frexp', function $$frexp(x) {
19616
19617
19618      x = $$('Math')['$float!'](x);
19619
19620      if (isNaN(x)) {
19621        return [NaN, 0];
19622      }
19623
19624      var ex   = Math.floor(Math.log(Math.abs(x)) / Math.log(2)) + 1,
19625          frac = x / Math.pow(2, ex);
19626
19627      return [frac, ex];
19628    });
19629
19630    $def(self, '$gamma', function $$gamma(n) {
19631
19632
19633      n = $$('Math')['$float!'](n);
19634
19635      var i, t, x, value, result, twoN, threeN, fourN, fiveN;
19636
19637      var G = 4.7421875;
19638
19639      var P = [
19640         0.99999999999999709182,
19641         57.156235665862923517,
19642        -59.597960355475491248,
19643         14.136097974741747174,
19644        -0.49191381609762019978,
19645         0.33994649984811888699e-4,
19646         0.46523628927048575665e-4,
19647        -0.98374475304879564677e-4,
19648         0.15808870322491248884e-3,
19649        -0.21026444172410488319e-3,
19650         0.21743961811521264320e-3,
19651        -0.16431810653676389022e-3,
19652         0.84418223983852743293e-4,
19653        -0.26190838401581408670e-4,
19654         0.36899182659531622704e-5
19655      ];
19656
19657
19658      if (isNaN(n)) {
19659        return NaN;
19660      }
19661
19662      if (n === 0 && 1 / n < 0) {
19663        return -Infinity;
19664      }
19665
19666      if (n === -1 || n === -Infinity) {
19667        $Kernel.$raise($$('DomainError'), "Numerical argument is out of domain - \"gamma\"");
19668      }
19669
19670      if ($$('Integer')['$==='](n)) {
19671        if (n <= 0) {
19672          return isFinite(n) ? Infinity : NaN;
19673        }
19674
19675        if (n > 171) {
19676          return Infinity;
19677        }
19678
19679        value  = n - 2;
19680        result = n - 1;
19681
19682        while (value > 1) {
19683          result *= value;
19684          value--;
19685        }
19686
19687        if (result == 0) {
19688          result = 1;
19689        }
19690
19691        return result;
19692      }
19693
19694      if (n < 0.5) {
19695        return Math.PI / (Math.sin(Math.PI * n) * $$$('Math').$gamma($rb_minus(1, n)));
19696      }
19697
19698      if (n >= 171.35) {
19699        return Infinity;
19700      }
19701
19702      if (n > 85.0) {
19703        twoN   = n * n;
19704        threeN = twoN * n;
19705        fourN  = threeN * n;
19706        fiveN  = fourN * n;
19707
19708        return Math.sqrt(2 * Math.PI / n) * Math.pow((n / Math.E), n) *
19709          (1 + 1 / (12 * n) + 1 / (288 * twoN) - 139 / (51840 * threeN) -
19710          571 / (2488320 * fourN) + 163879 / (209018880 * fiveN) +
19711          5246819 / (75246796800 * fiveN * n));
19712      }
19713
19714      n -= 1;
19715      x  = P[0];
19716
19717      for (i = 1; i < P.length; ++i) {
19718        x += P[i] / (n + i);
19719      }
19720
19721      t = n + G + 0.5;
19722
19723      return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x;
19724    });
19725
19726    $def(self, '$ldexp', function $$ldexp(mantissa, exponent) {
19727
19728
19729      mantissa = $$('Math')['$float!'](mantissa);
19730      exponent = $$('Math')['$integer!'](exponent);
19731
19732      if (isNaN(exponent)) {
19733        $Kernel.$raise($$$('RangeError'), "float NaN out of range of integer");
19734      }
19735
19736      return mantissa * Math.pow(2, exponent);
19737    });
19738
19739    $def(self, '$lgamma', function $$lgamma(n) {
19740
19741
19742      if (n == -1) {
19743        return [Infinity, 1];
19744      }
19745      else {
19746        return [Math.log(Math.abs($$$('Math').$gamma(n))), $$$('Math').$gamma(n) < 0 ? -1 : 1];
19747      }
19748
19749    });
19750
19751    $def(self, '$log', function $$log(x, base) {
19752      if ($eqeqeq($$$('String'), x)) {
19753        $Kernel.$raise($type_error(x, $$$('Float')));
19754      }      if ($truthy(base == null)) {
19755        return $$$('Math').$checked("log", $$$('Math')['$float!'](x))
19756      } else {
19757
19758        if ($eqeqeq($$$('String'), base)) {
19759          $Kernel.$raise($type_error(base, $$$('Float')));
19760        }        return $rb_divide($$$('Math').$checked("log", $$$('Math')['$float!'](x)), $$$('Math').$checked("log", $$$('Math')['$float!'](base)));
19761      }    }, -2);
19762
19763    $def(self, '$log10', function $$log10(x) {
19764
19765
19766      if ($eqeqeq($$$('String'), x)) {
19767        $Kernel.$raise($type_error(x, $$$('Float')));
19768      }      return $$$('Math').$checked("log10", $$$('Math')['$float!'](x));
19769    });
19770
19771    $def(self, '$log2', function $$log2(x) {
19772
19773
19774      if ($eqeqeq($$$('String'), x)) {
19775        $Kernel.$raise($type_error(x, $$$('Float')));
19776      }      return $$$('Math').$checked("log2", $$$('Math')['$float!'](x));
19777    });
19778    return $def(self, '$tan', function $$tan(x) {
19779
19780
19781      x = $$$('Math')['$float!'](x);
19782      if ($truthy(x['$infinite?']())) {
19783        return $$$($$$('Float'), 'NAN')
19784      }      return $$$('Math').$checked("tan", $$$('Math')['$float!'](x));
19785    });
19786  })('::', $nesting)
19787};
19788
19789Opal.modules["corelib/complex/base"] = function(Opal) {/* Generated by Opal 1.7.3 */
19790  var $module = Opal.module, $truthy = Opal.truthy, $def = Opal.def, $klass = Opal.klass, $nesting = [], nil = Opal.nil;
19791
19792  Opal.add_stubs('new,from_string');
19793
19794  (function($base, $parent_nesting) {
19795    var self = $module($base, 'Kernel');
19796
19797    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
19798
19799    return $def(self, '$Complex', function $$Complex(real, imag) {
19800
19801
19802      if (imag == null) imag = nil;
19803      if ($truthy(imag)) {
19804        return $$('Complex').$new(real, imag)
19805      } else {
19806        return $$('Complex').$new(real, 0)
19807      }    }, -2)
19808  })('::', $nesting);
19809  return (function($base, $super, $parent_nesting) {
19810    var self = $klass($base, $super, 'String');
19811
19812    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
19813
19814    return $def(self, '$to_c', function $$to_c() {
19815      var self = this;
19816
19817      return $$('Complex').$from_string(self)
19818    })
19819  })('::', null, $nesting);
19820};
19821
19822Opal.modules["corelib/complex"] = function(Opal) {/* Generated by Opal 1.7.3 */
19823  var $klass = Opal.klass, $truthy = Opal.truthy, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $defs = Opal.defs, $rb_times = Opal.rb_times, $def = Opal.def, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_divide = Opal.rb_divide, $eqeq = Opal.eqeq, $to_ary = Opal.to_ary, $rb_gt = Opal.rb_gt, $neqeq = Opal.neqeq, $return_val = Opal.return_val, $const_set = Opal.const_set, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
19824
19825  Opal.add_stubs('require,real?,===,raise,new,*,cos,sin,attr_reader,freeze,class,==,real,imag,Complex,-@,+,__coerced__,-,nan?,/,conj,abs2,quo,polar,exp,log,>,!=,divmod,**,hypot,atan2,lcm,denominator,finite?,infinite?,numerator,abs,arg,rationalize,to_f,to_i,to_r,inspect,zero?,positive?,Rational,rect,angle');
19826
19827  self.$require("corelib/numeric");
19828  self.$require("corelib/complex/base");
19829  return (function($base, $super, $parent_nesting) {
19830    var self = $klass($base, $super, 'Complex');
19831
19832    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
19833
19834    $proto.real = $proto.imag = nil;
19835
19836    $defs(self, '$rect', function $$rect(real, imag) {
19837      var self = this;
19838
19839
19840      if (imag == null) imag = 0;
19841      if (!((($eqeqeq($$$('Numeric'), real) && ($truthy(real['$real?']()))) && ($eqeqeq($$$('Numeric'), imag))) && ($truthy(imag['$real?']())))) {
19842        $Kernel.$raise($$$('TypeError'), "not a real");
19843      }      return self.$new(real, imag);
19844    }, -2);
19845    $defs(self, '$polar', function $$polar(r, theta) {
19846      var self = this;
19847
19848
19849      if (theta == null) theta = 0;
19850      if (!((($eqeqeq($$$('Numeric'), r) && ($truthy(r['$real?']()))) && ($eqeqeq($$$('Numeric'), theta))) && ($truthy(theta['$real?']())))) {
19851        $Kernel.$raise($$$('TypeError'), "not a real");
19852      }      return self.$new($rb_times(r, $$$('Math').$cos(theta)), $rb_times(r, $$$('Math').$sin(theta)));
19853    }, -2);
19854    self.$attr_reader("real", "imag");
19855
19856    $def(self, '$initialize', function $$initialize(real, imag) {
19857      var self = this;
19858
19859
19860      if (imag == null) imag = 0;
19861      self.real = real;
19862      self.imag = imag;
19863      return self.$freeze();
19864    }, -2);
19865
19866    $def(self, '$coerce', function $$coerce(other) {
19867      var self = this;
19868
19869      if ($eqeqeq($$$('Complex'), other)) {
19870        return [other, self]
19871      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19872        return [$$$('Complex').$new(other, 0), self]
19873      } else {
19874        return $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Complex")
19875      }
19876    });
19877
19878    $def(self, '$==', function $Complex_$eq_eq$1(other) {
19879      var self = this, $ret_or_1 = nil;
19880
19881      if ($eqeqeq($$$('Complex'), other)) {
19882        if ($truthy(($ret_or_1 = self.real['$=='](other.$real())))) {
19883          return self.imag['$=='](other.$imag())
19884        } else {
19885          return $ret_or_1
19886        }
19887      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19888        if ($truthy(($ret_or_1 = self.real['$=='](other)))) {
19889          return self.imag['$=='](0)
19890        } else {
19891          return $ret_or_1
19892        }
19893      } else {
19894        return other['$=='](self)
19895      }
19896    });
19897
19898    $def(self, '$-@', function $Complex_$minus$$2() {
19899      var self = this;
19900
19901      return $Kernel.$Complex(self.real['$-@'](), self.imag['$-@']())
19902    });
19903
19904    $def(self, '$+', function $Complex_$plus$3(other) {
19905      var self = this;
19906
19907      if ($eqeqeq($$$('Complex'), other)) {
19908        return $Kernel.$Complex($rb_plus(self.real, other.$real()), $rb_plus(self.imag, other.$imag()))
19909      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19910        return $Kernel.$Complex($rb_plus(self.real, other), self.imag)
19911      } else {
19912        return self.$__coerced__("+", other)
19913      }
19914    });
19915
19916    $def(self, '$-', function $Complex_$minus$4(other) {
19917      var self = this;
19918
19919      if ($eqeqeq($$$('Complex'), other)) {
19920        return $Kernel.$Complex($rb_minus(self.real, other.$real()), $rb_minus(self.imag, other.$imag()))
19921      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19922        return $Kernel.$Complex($rb_minus(self.real, other), self.imag)
19923      } else {
19924        return self.$__coerced__("-", other)
19925      }
19926    });
19927
19928    $def(self, '$*', function $Complex_$$5(other) {
19929      var self = this;
19930
19931      if ($eqeqeq($$$('Complex'), other)) {
19932        return $Kernel.$Complex($rb_minus($rb_times(self.real, other.$real()), $rb_times(self.imag, other.$imag())), $rb_plus($rb_times(self.real, other.$imag()), $rb_times(self.imag, other.$real())))
19933      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19934        return $Kernel.$Complex($rb_times(self.real, other), $rb_times(self.imag, other))
19935      } else {
19936        return self.$__coerced__("*", other)
19937      }
19938    });
19939
19940    $def(self, '$/', function $Complex_$slash$6(other) {
19941      var self = this;
19942
19943      if ($eqeqeq($$$('Complex'), other)) {
19944        if ((((($eqeqeq($$$('Number'), self.real) && ($truthy(self.real['$nan?']()))) || (($eqeqeq($$$('Number'), self.imag) && ($truthy(self.imag['$nan?']()))))) || (($eqeqeq($$$('Number'), other.$real()) && ($truthy(other.$real()['$nan?']()))))) || (($eqeqeq($$$('Number'), other.$imag()) && ($truthy(other.$imag()['$nan?']())))))) {
19945          return $$$('Complex').$new($$$($$$('Float'), 'NAN'), $$$($$$('Float'), 'NAN'))
19946        } else {
19947          return $rb_divide($rb_times(self, other.$conj()), other.$abs2())
19948        }
19949      } else if (($eqeqeq($$$('Numeric'), other) && ($truthy(other['$real?']())))) {
19950        return $Kernel.$Complex(self.real.$quo(other), self.imag.$quo(other))
19951      } else {
19952        return self.$__coerced__("/", other)
19953      }
19954    });
19955
19956    $def(self, '$**', function $Complex_$$$7(other) {
19957      var $a, $b, self = this, r = nil, theta = nil, ore = nil, oim = nil, nr = nil, ntheta = nil, x = nil, z = nil, n = nil, div = nil, mod = nil;
19958
19959
19960      if ($eqeq(other, 0)) {
19961        return $$$('Complex').$new(1, 0)
19962      }      if ($eqeqeq($$$('Complex'), other)) {
19963
19964        $b = self.$polar(), $a = $to_ary($b), (r = ($a[0] == null ? nil : $a[0])), (theta = ($a[1] == null ? nil : $a[1]));
19965        ore = other.$real();
19966        oim = other.$imag();
19967        nr = $$$('Math').$exp($rb_minus($rb_times(ore, $$$('Math').$log(r)), $rb_times(oim, theta)));
19968        ntheta = $rb_plus($rb_times(theta, ore), $rb_times(oim, $$$('Math').$log(r)));
19969        return $$$('Complex').$polar(nr, ntheta);
19970      } else if ($eqeqeq($$$('Integer'), other)) {
19971        if ($truthy($rb_gt(other, 0))) {
19972
19973          x = self;
19974          z = x;
19975          n = $rb_minus(other, 1);
19976          while ($neqeq(n, 0)) {
19977
19978            $b = n.$divmod(2), $a = $to_ary($b), (div = ($a[0] == null ? nil : $a[0])), (mod = ($a[1] == null ? nil : $a[1]));
19979            while ($eqeq(mod, 0)) {
19980
19981              x = $Kernel.$Complex($rb_minus($rb_times(x.$real(), x.$real()), $rb_times(x.$imag(), x.$imag())), $rb_times($rb_times(2, x.$real()), x.$imag()));
19982              n = div;
19983              $b = n.$divmod(2), $a = $to_ary($b), (div = ($a[0] == null ? nil : $a[0])), (mod = ($a[1] == null ? nil : $a[1]));
19984            }            z = $rb_times(z, x);
19985            n = $rb_minus(n, 1);
19986          }          return z;
19987        } else {
19988          return $rb_divide($$$('Rational').$new(1, 1), self)['$**'](other['$-@']())
19989        }
19990      } else if (($eqeqeq($$$('Float'), other) || ($eqeqeq($$$('Rational'), other)))) {
19991
19992        $b = self.$polar(), $a = $to_ary($b), (r = ($a[0] == null ? nil : $a[0])), (theta = ($a[1] == null ? nil : $a[1]));
19993        return $$$('Complex').$polar(r['$**'](other), $rb_times(theta, other));
19994      } else {
19995        return self.$__coerced__("**", other)
19996      }    });
19997
19998    $def(self, '$abs', function $$abs() {
19999      var self = this;
20000
20001      return $$$('Math').$hypot(self.real, self.imag)
20002    });
20003
20004    $def(self, '$abs2', function $$abs2() {
20005      var self = this;
20006
20007      return $rb_plus($rb_times(self.real, self.real), $rb_times(self.imag, self.imag))
20008    });
20009
20010    $def(self, '$angle', function $$angle() {
20011      var self = this;
20012
20013      return $$$('Math').$atan2(self.imag, self.real)
20014    });
20015
20016    $def(self, '$conj', function $$conj() {
20017      var self = this;
20018
20019      return $Kernel.$Complex(self.real, self.imag['$-@']())
20020    });
20021
20022    $def(self, '$denominator', function $$denominator() {
20023      var self = this;
20024
20025      return self.real.$denominator().$lcm(self.imag.$denominator())
20026    });
20027
20028    $def(self, '$eql?', function $Complex_eql$ques$8(other) {
20029      var self = this, $ret_or_1 = nil, $ret_or_2 = nil;
20030
20031      if ($truthy(($ret_or_1 = ($truthy(($ret_or_2 = $$('Complex')['$==='](other))) ? (self.real.$class()['$=='](self.imag.$class())) : ($ret_or_2))))) {
20032        return self['$=='](other)
20033      } else {
20034        return $ret_or_1
20035      }
20036    });
20037
20038    $def(self, '$fdiv', function $$fdiv(other) {
20039      var self = this;
20040
20041
20042      if (!$eqeqeq($$$('Numeric'), other)) {
20043        $Kernel.$raise($$$('TypeError'), "" + (other.$class()) + " can't be coerced into Complex");
20044      }      return $rb_divide(self, other);
20045    });
20046
20047    $def(self, '$finite?', function $Complex_finite$ques$9() {
20048      var self = this, $ret_or_1 = nil;
20049
20050      if ($truthy(($ret_or_1 = self.real['$finite?']()))) {
20051        return self.imag['$finite?']()
20052      } else {
20053        return $ret_or_1
20054      }
20055    });
20056
20057    $def(self, '$hash', function $$hash() {
20058      var self = this;
20059
20060      return "Complex:" + (self.real) + ":" + (self.imag)
20061    });
20062
20063    $def(self, '$infinite?', function $Complex_infinite$ques$10() {
20064      var self = this, $ret_or_1 = nil;
20065
20066      if ($truthy(($ret_or_1 = self.real['$infinite?']()))) {
20067        return $ret_or_1
20068      } else {
20069        return self.imag['$infinite?']()
20070      }
20071    });
20072
20073    $def(self, '$inspect', function $$inspect() {
20074      var self = this;
20075
20076      return "(" + (self) + ")"
20077    });
20078
20079    $def(self, '$numerator', function $$numerator() {
20080      var self = this, d = nil;
20081
20082
20083      d = self.$denominator();
20084      return $Kernel.$Complex($rb_times(self.real.$numerator(), $rb_divide(d, self.real.$denominator())), $rb_times(self.imag.$numerator(), $rb_divide(d, self.imag.$denominator())));
20085    });
20086
20087    $def(self, '$polar', function $$polar() {
20088      var self = this;
20089
20090      return [self.$abs(), self.$arg()]
20091    });
20092
20093    $def(self, '$rationalize', function $$rationalize(eps) {
20094      var self = this;
20095
20096      if (arguments.length > 1) {
20097        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)");
20098      }
20099      if ($neqeq(self.imag, 0)) {
20100        $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Rational");
20101      }      return self.$real().$rationalize(eps);
20102    }, -1);
20103
20104    $def(self, '$real?', $return_val(false));
20105
20106    $def(self, '$rect', function $$rect() {
20107      var self = this;
20108
20109      return [self.real, self.imag]
20110    });
20111
20112    $def(self, '$to_f', function $$to_f() {
20113      var self = this;
20114
20115
20116      if (!$eqeq(self.imag, 0)) {
20117        $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Float");
20118      }      return self.real.$to_f();
20119    });
20120
20121    $def(self, '$to_i', function $$to_i() {
20122      var self = this;
20123
20124
20125      if (!$eqeq(self.imag, 0)) {
20126        $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Integer");
20127      }      return self.real.$to_i();
20128    });
20129
20130    $def(self, '$to_r', function $$to_r() {
20131      var self = this;
20132
20133
20134      if (!$eqeq(self.imag, 0)) {
20135        $Kernel.$raise($$$('RangeError'), "can't convert " + (self) + " into Rational");
20136      }      return self.real.$to_r();
20137    });
20138
20139    $def(self, '$to_s', function $$to_s() {
20140      var self = this, result = nil;
20141
20142
20143      result = self.real.$inspect();
20144      result = $rb_plus(result, (((($eqeqeq($$$('Number'), self.imag) && ($truthy(self.imag['$nan?']()))) || ($truthy(self.imag['$positive?']()))) || ($truthy(self.imag['$zero?']()))) ? ("+") : ("-")));
20145      result = $rb_plus(result, self.imag.$abs().$inspect());
20146      if (($eqeqeq($$$('Number'), self.imag) && (($truthy(self.imag['$nan?']()) || ($truthy(self.imag['$infinite?']())))))) {
20147        result = $rb_plus(result, "*");
20148      }      return $rb_plus(result, "i");
20149    });
20150    $const_set($nesting[0], 'I', self.$new(0, 1));
20151    $defs(self, '$from_string', function $$from_string(str) {
20152
20153
20154      var re = /[+-]?[\d_]+(\.[\d_]+)?(e\d+)?/;
20155          str.match(re);
20156          var real, imag;
20157
20158      function isFloat() {
20159        return re.test(str);
20160      }
20161
20162      function cutFloat() {
20163        var match = str.match(re);
20164        var number = match[0];
20165        str = str.slice(number.length);
20166        return number.replace(/_/g, '');
20167      }
20168
20169      // handles both floats and rationals
20170      function cutNumber() {
20171        if (isFloat()) {
20172          var numerator = parseFloat(cutFloat());
20173
20174          if (str[0] === '/') {
20175            // rational real part
20176            str = str.slice(1);
20177
20178            if (isFloat()) {
20179              var denominator = parseFloat(cutFloat());
20180              return $Kernel.$Rational(numerator, denominator);
20181            } else {
20182              // reverting '/'
20183              str = '/' + str;
20184              return numerator;
20185            }
20186          } else {
20187            // float real part, no denominator
20188            return numerator;
20189          }
20190        } else {
20191          return null;
20192        }
20193      }
20194
20195      real = cutNumber();
20196
20197      if (!real) {
20198        if (str[0] === 'i') {
20199          // i => Complex(0, 1)
20200          return $Kernel.$Complex(0, 1);
20201        }
20202        if (str[0] === '-' && str[1] === 'i') {
20203          // -i => Complex(0, -1)
20204          return $Kernel.$Complex(0, -1);
20205        }
20206        if (str[0] === '+' && str[1] === 'i') {
20207          // +i => Complex(0, 1)
20208          return $Kernel.$Complex(0, 1);
20209        }
20210        // anything => Complex(0, 0)
20211        return $Kernel.$Complex(0, 0);
20212      }
20213
20214      imag = cutNumber();
20215      if (!imag) {
20216        if (str[0] === 'i') {
20217          // 3i => Complex(0, 3)
20218          return $Kernel.$Complex(0, real);
20219        } else {
20220          // 3 => Complex(3, 0)
20221          return $Kernel.$Complex(real, 0);
20222        }
20223      } else {
20224        // 3+2i => Complex(3, 2)
20225        return $Kernel.$Complex(real, imag);
20226      }
20227
20228    });
20229    (function(self, $parent_nesting) {
20230
20231      return $alias(self, "rectangular", "rect")
20232    })(Opal.get_singleton_class(self));
20233    $alias(self, "arg", "angle");
20234    $alias(self, "conjugate", "conj");
20235    $alias(self, "divide", "/");
20236    $alias(self, "imaginary", "imag");
20237    $alias(self, "magnitude", "abs");
20238    $alias(self, "phase", "arg");
20239    $alias(self, "quo", "/");
20240    $alias(self, "rectangular", "rect");
20241
20242    Opal.udef(self, '$' + "negative?");
20243    Opal.udef(self, '$' + "positive?");
20244
20245    Opal.udef(self, '$' + "step");    return nil;  })('::', $$$('Numeric'), $nesting);
20246};
20247
20248Opal.modules["corelib/rational/base"] = function(Opal) {/* Generated by Opal 1.7.3 */
20249  var $module = Opal.module, $def = Opal.def, $klass = Opal.klass; Opal.nil; var $$$ = Opal.$$$;
20250
20251  Opal.add_stubs('convert,from_string');
20252
20253  (function($base) {
20254    var self = $module($base, 'Kernel');
20255
20256
20257    return $def(self, '$Rational', function $$Rational(numerator, denominator) {
20258
20259
20260      if (denominator == null) denominator = 1;
20261      return $$$('Rational').$convert(numerator, denominator);
20262    }, -2)
20263  })('::');
20264  return (function($base, $super) {
20265    var self = $klass($base, $super, 'String');
20266
20267
20268    return $def(self, '$to_r', function $$to_r() {
20269      var self = this;
20270
20271      return $$$('Rational').$from_string(self)
20272    })
20273  })('::', null);
20274};
20275
20276Opal.modules["corelib/rational"] = function(Opal) {/* Generated by Opal 1.7.3 */
20277  var $klass = Opal.klass, $eqeq = Opal.eqeq, $Kernel = Opal.Kernel, $truthy = Opal.truthy, $rb_lt = Opal.rb_lt, $rb_divide = Opal.rb_divide, $defs = Opal.defs, $eqeqeq = Opal.eqeqeq, $not = Opal.not, $Opal = Opal.Opal, $def = Opal.def, $return_ivar = Opal.return_ivar, $rb_minus = Opal.rb_minus, $rb_times = Opal.rb_times, $rb_plus = Opal.rb_plus, $rb_gt = Opal.rb_gt, $rb_le = Opal.rb_le, $return_self = Opal.return_self, $alias = Opal.alias, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$;
20278
20279  Opal.add_stubs('require,to_i,==,raise,<,-@,new,gcd,/,nil?,===,reduce,to_r,!,equal?,coerce_to!,freeze,to_f,numerator,denominator,<=>,-,*,__coerced__,+,Rational,>,**,abs,ceil,with_precision,floor,<=,truncate,send');
20280
20281  self.$require("corelib/numeric");
20282  self.$require("corelib/rational/base");
20283  return (function($base, $super) {
20284    var self = $klass($base, $super, 'Rational');
20285
20286    var $proto = self.$$prototype;
20287
20288    $proto.num = $proto.den = nil;
20289
20290    $defs(self, '$reduce', function $$reduce(num, den) {
20291      var self = this, gcd = nil;
20292
20293
20294      num = num.$to_i();
20295      den = den.$to_i();
20296      if ($eqeq(den, 0)) {
20297        $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0");
20298      } else if ($truthy($rb_lt(den, 0))) {
20299
20300        num = num['$-@']();
20301        den = den['$-@']();
20302      } else if ($eqeq(den, 1)) {
20303        return self.$new(num, den)
20304      }      gcd = num.$gcd(den);
20305      return self.$new($rb_divide(num, gcd), $rb_divide(den, gcd));
20306    });
20307    $defs(self, '$convert', function $$convert(num, den) {
20308      var self = this;
20309
20310
20311      if (($truthy(num['$nil?']()) || ($truthy(den['$nil?']())))) {
20312        $Kernel.$raise($$$('TypeError'), "cannot convert nil into Rational");
20313      }      if (($eqeqeq($$$('Integer'), num) && ($eqeqeq($$$('Integer'), den)))) {
20314        return self.$reduce(num, den)
20315      }      if ((($eqeqeq($$$('Float'), num) || ($eqeqeq($$$('String'), num))) || ($eqeqeq($$$('Complex'), num)))) {
20316        num = num.$to_r();
20317      }      if ((($eqeqeq($$$('Float'), den) || ($eqeqeq($$$('String'), den))) || ($eqeqeq($$$('Complex'), den)))) {
20318        den = den.$to_r();
20319      }      if (($truthy(den['$equal?'](1)) && ($not($$$('Integer')['$==='](num))))) {
20320        return $Opal['$coerce_to!'](num, $$$('Rational'), "to_r")
20321      } else if (($eqeqeq($$$('Numeric'), num) && ($eqeqeq($$$('Numeric'), den)))) {
20322        return $rb_divide(num, den)
20323      } else {
20324        return self.$reduce(num, den)
20325      }    });
20326
20327    $def(self, '$initialize', function $$initialize(num, den) {
20328      var self = this;
20329
20330
20331      self.num = num;
20332      self.den = den;
20333      return self.$freeze();
20334    });
20335
20336    $def(self, '$numerator', $return_ivar("num"));
20337
20338    $def(self, '$denominator', $return_ivar("den"));
20339
20340    $def(self, '$coerce', function $$coerce(other) {
20341      var self = this, $ret_or_1 = nil;
20342
20343      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20344        return [other, self]
20345      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20346        return [other.$to_r(), self]
20347      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20348        return [other, self.$to_f()]
20349      } else {
20350        return nil
20351      }
20352    });
20353
20354    $def(self, '$==', function $Rational_$eq_eq$1(other) {
20355      var self = this, $ret_or_1 = nil, $ret_or_2 = nil;
20356
20357      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20358        if ($truthy(($ret_or_2 = self.num['$=='](other.$numerator())))) {
20359          return self.den['$=='](other.$denominator())
20360        } else {
20361          return $ret_or_2
20362        }
20363      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20364        if ($truthy(($ret_or_2 = self.num['$=='](other)))) {
20365          return self.den['$=='](1)
20366        } else {
20367          return $ret_or_2
20368        }
20369      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20370        return self.$to_f()['$=='](other)
20371      } else {
20372        return other['$=='](self)
20373      }
20374    });
20375
20376    $def(self, '$<=>', function $Rational_$lt_eq_gt$2(other) {
20377      var self = this, $ret_or_1 = nil;
20378
20379      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20380        return $rb_minus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator()))['$<=>'](0)
20381      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20382        return $rb_minus(self.num, $rb_times(self.den, other))['$<=>'](0)
20383      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20384        return self.$to_f()['$<=>'](other)
20385      } else {
20386        return self.$__coerced__("<=>", other)
20387      }
20388    });
20389
20390    $def(self, '$+', function $Rational_$plus$3(other) {
20391      var self = this, $ret_or_1 = nil, num = nil, den = nil;
20392
20393      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20394
20395        num = $rb_plus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator()));
20396        den = $rb_times(self.den, other.$denominator());
20397        return $Kernel.$Rational(num, den);
20398      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20399        return $Kernel.$Rational($rb_plus(self.num, $rb_times(other, self.den)), self.den)
20400      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20401        return $rb_plus(self.$to_f(), other)
20402      } else {
20403        return self.$__coerced__("+", other)
20404      }
20405    });
20406
20407    $def(self, '$-', function $Rational_$minus$4(other) {
20408      var self = this, $ret_or_1 = nil, num = nil, den = nil;
20409
20410      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20411
20412        num = $rb_minus($rb_times(self.num, other.$denominator()), $rb_times(self.den, other.$numerator()));
20413        den = $rb_times(self.den, other.$denominator());
20414        return $Kernel.$Rational(num, den);
20415      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20416        return $Kernel.$Rational($rb_minus(self.num, $rb_times(other, self.den)), self.den)
20417      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20418        return $rb_minus(self.$to_f(), other)
20419      } else {
20420        return self.$__coerced__("-", other)
20421      }
20422    });
20423
20424    $def(self, '$*', function $Rational_$$5(other) {
20425      var self = this, $ret_or_1 = nil, num = nil, den = nil;
20426
20427      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20428
20429        num = $rb_times(self.num, other.$numerator());
20430        den = $rb_times(self.den, other.$denominator());
20431        return $Kernel.$Rational(num, den);
20432      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20433        return $Kernel.$Rational($rb_times(self.num, other), self.den)
20434      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20435        return $rb_times(self.$to_f(), other)
20436      } else {
20437        return self.$__coerced__("*", other)
20438      }
20439    });
20440
20441    $def(self, '$/', function $Rational_$slash$6(other) {
20442      var self = this, $ret_or_1 = nil, num = nil, den = nil;
20443
20444      if ($eqeqeq($$$('Rational'), ($ret_or_1 = other))) {
20445
20446        num = $rb_times(self.num, other.$denominator());
20447        den = $rb_times(self.den, other.$numerator());
20448        return $Kernel.$Rational(num, den);
20449      } else if ($eqeqeq($$$('Integer'), $ret_or_1)) {
20450        if ($eqeq(other, 0)) {
20451          return $rb_divide(self.$to_f(), 0.0)
20452        } else {
20453          return $Kernel.$Rational(self.num, $rb_times(self.den, other))
20454        }
20455      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20456        return $rb_divide(self.$to_f(), other)
20457      } else {
20458        return self.$__coerced__("/", other)
20459      }
20460    });
20461
20462    $def(self, '$**', function $Rational_$$$7(other) {
20463      var self = this, $ret_or_1 = nil;
20464
20465      if ($eqeqeq($$$('Integer'), ($ret_or_1 = other))) {
20466        if (($eqeq(self, 0) && ($truthy($rb_lt(other, 0))))) {
20467          return $$$($$$('Float'), 'INFINITY')
20468        } else if ($truthy($rb_gt(other, 0))) {
20469          return $Kernel.$Rational(self.num['$**'](other), self.den['$**'](other))
20470        } else if ($truthy($rb_lt(other, 0))) {
20471          return $Kernel.$Rational(self.den['$**'](other['$-@']()), self.num['$**'](other['$-@']()))
20472        } else {
20473          return $Kernel.$Rational(1, 1)
20474        }
20475      } else if ($eqeqeq($$$('Float'), $ret_or_1)) {
20476        return self.$to_f()['$**'](other)
20477      } else if ($eqeqeq($$$('Rational'), $ret_or_1)) {
20478        if ($eqeq(other, 0)) {
20479          return $Kernel.$Rational(1, 1)
20480        } else if ($eqeq(other.$denominator(), 1)) {
20481          if ($truthy($rb_lt(other, 0))) {
20482            return $Kernel.$Rational(self.den['$**'](other.$numerator().$abs()), self.num['$**'](other.$numerator().$abs()))
20483          } else {
20484            return $Kernel.$Rational(self.num['$**'](other.$numerator()), self.den['$**'](other.$numerator()))
20485          }
20486        } else if (($eqeq(self, 0) && ($truthy($rb_lt(other, 0))))) {
20487          return $Kernel.$raise($$$('ZeroDivisionError'), "divided by 0")
20488        } else {
20489          return self.$to_f()['$**'](other)
20490        }
20491      } else {
20492        return self.$__coerced__("**", other)
20493      }
20494    });
20495
20496    $def(self, '$abs', function $$abs() {
20497      var self = this;
20498
20499      return $Kernel.$Rational(self.num.$abs(), self.den.$abs())
20500    });
20501
20502    $def(self, '$ceil', function $$ceil(precision) {
20503      var self = this;
20504
20505
20506      if (precision == null) precision = 0;
20507      if ($eqeq(precision, 0)) {
20508        return $rb_divide(self.num['$-@'](), self.den)['$-@']().$ceil()
20509      } else {
20510        return self.$with_precision("ceil", precision)
20511      }    }, -1);
20512
20513    $def(self, '$floor', function $$floor(precision) {
20514      var self = this;
20515
20516
20517      if (precision == null) precision = 0;
20518      if ($eqeq(precision, 0)) {
20519        return $rb_divide(self.num['$-@'](), self.den)['$-@']().$floor()
20520      } else {
20521        return self.$with_precision("floor", precision)
20522      }    }, -1);
20523
20524    $def(self, '$hash', function $$hash() {
20525      var self = this;
20526
20527      return "Rational:" + (self.num) + ":" + (self.den)
20528    });
20529
20530    $def(self, '$inspect', function $$inspect() {
20531      var self = this;
20532
20533      return "(" + (self) + ")"
20534    });
20535
20536    $def(self, '$rationalize', function $$rationalize(eps) {
20537      var self = this;
20538
20539      if (arguments.length > 1) {
20540        $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (" + (arguments.length) + " for 0..1)");
20541      }
20542
20543      if (eps == null) {
20544        return self;
20545      }
20546
20547      var e = eps.$abs(),
20548          a = $rb_minus(self, e),
20549          b = $rb_plus(self, e);
20550
20551      var p0 = 0,
20552          p1 = 1,
20553          q0 = 1,
20554          q1 = 0,
20555          p2, q2;
20556
20557      var c, k, t;
20558
20559      while (true) {
20560        c = (a).$ceil();
20561
20562        if ($rb_le(c, b)) {
20563          break;
20564        }
20565
20566        k  = c - 1;
20567        p2 = k * p1 + p0;
20568        q2 = k * q1 + q0;
20569        t  = $rb_divide(1, $rb_minus(b, k));
20570        b  = $rb_divide(1, $rb_minus(a, k));
20571        a  = t;
20572
20573        p0 = p1;
20574        q0 = q1;
20575        p1 = p2;
20576        q1 = q2;
20577      }
20578
20579      return $Kernel.$Rational(c * p1 + p0, c * q1 + q0);
20580    }, -1);
20581
20582    $def(self, '$round', function $$round(precision) {
20583      var self = this, num = nil, den = nil, approx = nil;
20584
20585
20586      if (precision == null) precision = 0;
20587      if (!$eqeq(precision, 0)) {
20588        return self.$with_precision("round", precision)
20589      }      if ($eqeq(self.num, 0)) {
20590        return 0
20591      }      if ($eqeq(self.den, 1)) {
20592        return self.num
20593      }      num = $rb_plus($rb_times(self.num.$abs(), 2), self.den);
20594      den = $rb_times(self.den, 2);
20595      approx = $rb_divide(num, den).$truncate();
20596      if ($truthy($rb_lt(self.num, 0))) {
20597        return approx['$-@']()
20598      } else {
20599        return approx
20600      }    }, -1);
20601
20602    $def(self, '$to_f', function $$to_f() {
20603      var self = this;
20604
20605      return $rb_divide(self.num, self.den)
20606    });
20607
20608    $def(self, '$to_i', function $$to_i() {
20609      var self = this;
20610
20611      return self.$truncate()
20612    });
20613
20614    $def(self, '$to_r', $return_self);
20615
20616    $def(self, '$to_s', function $$to_s() {
20617      var self = this;
20618
20619      return "" + (self.num) + "/" + (self.den)
20620    });
20621
20622    $def(self, '$truncate', function $$truncate(precision) {
20623      var self = this;
20624
20625
20626      if (precision == null) precision = 0;
20627      if ($eqeq(precision, 0)) {
20628        if ($truthy($rb_lt(self.num, 0))) {
20629          return self.$ceil()
20630        } else {
20631          return self.$floor()
20632        }
20633      } else {
20634        return self.$with_precision("truncate", precision)
20635      }    }, -1);
20636
20637    $def(self, '$with_precision', function $$with_precision(method, precision) {
20638      var self = this, p = nil, s = nil;
20639
20640
20641      if (!$eqeqeq($$$('Integer'), precision)) {
20642        $Kernel.$raise($$$('TypeError'), "not an Integer");
20643      }      p = (10)['$**'](precision);
20644      s = $rb_times(self, p);
20645      if ($truthy($rb_lt(precision, 1))) {
20646        return $rb_divide(s.$send(method), p).$to_i()
20647      } else {
20648        return $Kernel.$Rational(s.$send(method), p)
20649      }    });
20650    $defs(self, '$from_string', function $$from_string(string) {
20651
20652
20653      var str = string.trimLeft(),
20654          re = /^[+-]?[\d_]+(\.[\d_]+)?/;
20655          str.match(re);
20656          var numerator, denominator;
20657
20658      function isFloat() {
20659        return re.test(str);
20660      }
20661
20662      function cutFloat() {
20663        var match = str.match(re);
20664        var number = match[0];
20665        str = str.slice(number.length);
20666        return number.replace(/_/g, '');
20667      }
20668
20669      if (isFloat()) {
20670        numerator = parseFloat(cutFloat());
20671
20672        if (str[0] === '/') {
20673          // rational real part
20674          str = str.slice(1);
20675
20676          if (isFloat()) {
20677            denominator = parseFloat(cutFloat());
20678            return $Kernel.$Rational(numerator, denominator);
20679          } else {
20680            return $Kernel.$Rational(numerator, 1);
20681          }
20682        } else {
20683          return $Kernel.$Rational(numerator, 1);
20684        }
20685      } else {
20686        return $Kernel.$Rational(0, 1);
20687      }
20688
20689    });
20690    $alias(self, "divide", "/");
20691    return $alias(self, "quo", "/");
20692  })('::', $$$('Numeric'));
20693};
20694
20695Opal.modules["corelib/time"] = function(Opal) {/* Generated by Opal 1.7.3 */
20696  var $slice = Opal.slice, $deny_frozen_access = Opal.deny_frozen_access, $klass = Opal.klass, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $defs = Opal.defs, $eqeqeq = Opal.eqeqeq, $def = Opal.def, $truthy = Opal.truthy, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $send = Opal.send, $rb_plus = Opal.rb_plus, $rb_divide = Opal.rb_divide, $rb_minus = Opal.rb_minus, $range = Opal.range, $neqeq = Opal.neqeq, $rb_le = Opal.rb_le, $eqeq = Opal.eqeq, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
20697
20698  Opal.add_stubs('require,include,===,raise,coerce_to!,respond_to?,to_str,to_i,_parse_offset,new,<=>,to_f,nil?,>,<,strftime,each,define_method,year,month,day,+,round,/,-,copy_instance_variables,initialize_dup,is_a?,zero?,wday,utc?,mon,yday,hour,min,sec,rjust,ljust,zone,to_s,[],cweek_cyear,jd,to_date,format,isdst,!=,<=,==,ceil,local,gm,asctime,getgm,gmt_offset,inspect,usec,gmtime,gmt?');
20699
20700  self.$require("corelib/comparable");
20701  return (function($base, $super, $parent_nesting) {
20702    var self = $klass($base, $super, 'Time');
20703
20704    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
20705
20706
20707    self.$include($$$('Comparable'));
20708
20709    var days_of_week = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
20710        short_days   = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
20711        short_months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
20712        long_months  = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
20713    $defs(self, '$at', function $$at(seconds, frac) {
20714
20715      var result;
20716
20717      if ($$$('Time')['$==='](seconds)) {
20718        if (frac !== undefined) {
20719          $Kernel.$raise($$$('TypeError'), "can't convert Time into an exact number");
20720        }
20721        result = new Date(seconds.getTime());
20722        result.timezone = seconds.timezone;
20723        return result;
20724      }
20725
20726      if (!seconds.$$is_number) {
20727        seconds = $Opal['$coerce_to!'](seconds, $$$('Integer'), "to_int");
20728      }
20729
20730      if (frac === undefined) {
20731        return new Date(seconds * 1000);
20732      }
20733
20734      if (!frac.$$is_number) {
20735        frac = $Opal['$coerce_to!'](frac, $$$('Integer'), "to_int");
20736      }
20737
20738      return new Date(seconds * 1000 + (frac / 1000));
20739    }, -2);
20740
20741    function time_params(year, month, day, hour, min, sec) {
20742      if (year.$$is_string) {
20743        year = parseInt(year, 10);
20744      } else {
20745        year = $Opal['$coerce_to!'](year, $$$('Integer'), "to_int");
20746      }
20747
20748      if (month === nil) {
20749        month = 1;
20750      } else if (!month.$$is_number) {
20751        if ((month)['$respond_to?']("to_str")) {
20752          month = (month).$to_str();
20753          switch (month.toLowerCase()) {
20754          case 'jan': month =  1; break;
20755          case 'feb': month =  2; break;
20756          case 'mar': month =  3; break;
20757          case 'apr': month =  4; break;
20758          case 'may': month =  5; break;
20759          case 'jun': month =  6; break;
20760          case 'jul': month =  7; break;
20761          case 'aug': month =  8; break;
20762          case 'sep': month =  9; break;
20763          case 'oct': month = 10; break;
20764          case 'nov': month = 11; break;
20765          case 'dec': month = 12; break;
20766          default: month = (month).$to_i();
20767          }
20768        } else {
20769          month = $Opal['$coerce_to!'](month, $$$('Integer'), "to_int");
20770        }
20771      }
20772
20773      if (month < 1 || month > 12) {
20774        $Kernel.$raise($$$('ArgumentError'), "month out of range: " + (month));
20775      }
20776      month = month - 1;
20777
20778      if (day === nil) {
20779        day = 1;
20780      } else if (day.$$is_string) {
20781        day = parseInt(day, 10);
20782      } else {
20783        day = $Opal['$coerce_to!'](day, $$$('Integer'), "to_int");
20784      }
20785
20786      if (day < 1 || day > 31) {
20787        $Kernel.$raise($$$('ArgumentError'), "day out of range: " + (day));
20788      }
20789
20790      if (hour === nil) {
20791        hour = 0;
20792      } else if (hour.$$is_string) {
20793        hour = parseInt(hour, 10);
20794      } else {
20795        hour = $Opal['$coerce_to!'](hour, $$$('Integer'), "to_int");
20796      }
20797
20798      if (hour < 0 || hour > 24) {
20799        $Kernel.$raise($$$('ArgumentError'), "hour out of range: " + (hour));
20800      }
20801
20802      if (min === nil) {
20803        min = 0;
20804      } else if (min.$$is_string) {
20805        min = parseInt(min, 10);
20806      } else {
20807        min = $Opal['$coerce_to!'](min, $$$('Integer'), "to_int");
20808      }
20809
20810      if (min < 0 || min > 59) {
20811        $Kernel.$raise($$$('ArgumentError'), "min out of range: " + (min));
20812      }
20813
20814      if (sec === nil) {
20815        sec = 0;
20816      } else if (!sec.$$is_number) {
20817        if (sec.$$is_string) {
20818          sec = parseInt(sec, 10);
20819        } else {
20820          sec = $Opal['$coerce_to!'](sec, $$$('Integer'), "to_int");
20821        }
20822      }
20823
20824      if (sec < 0 || sec > 60) {
20825        $Kernel.$raise($$$('ArgumentError'), "sec out of range: " + (sec));
20826      }
20827
20828      return [year, month, day, hour, min, sec];
20829    }
20830    $defs(self, '$new', function $Time_new$1(year, month, day, hour, min, sec, utc_offset) {
20831      var self = this;
20832      if (month == null) month = nil;
20833      if (day == null) day = nil;
20834      if (hour == null) hour = nil;
20835      if (min == null) min = nil;
20836      if (sec == null) sec = nil;
20837      if (utc_offset == null) utc_offset = nil;
20838
20839      var args, result, timezone, utc_date;
20840
20841      if (year === undefined) {
20842        return new Date();
20843      }
20844
20845      args  = time_params(year, month, day, hour, min, sec);
20846      year  = args[0];
20847      month = args[1];
20848      day   = args[2];
20849      hour  = args[3];
20850      min   = args[4];
20851      sec   = args[5];
20852
20853      if (utc_offset === nil) {
20854        result = new Date(year, month, day, hour, min, 0, sec * 1000);
20855        if (year < 100) {
20856          result.setFullYear(year);
20857        }
20858        return result;
20859      }
20860
20861      timezone = self.$_parse_offset(utc_offset);
20862      utc_date = new Date(Date.UTC(year, month, day, hour, min, 0, sec * 1000));
20863      if (year < 100) {
20864        utc_date.setUTCFullYear(year);
20865      }
20866
20867      result = new Date(utc_date.getTime() - timezone * 3600000);
20868      result.timezone = timezone;
20869
20870      return result;
20871    }, -1);
20872    $defs(self, '$_parse_offset', function $$_parse_offset(utc_offset) {
20873
20874
20875      var timezone;
20876      if (utc_offset.$$is_string) {
20877        if (utc_offset == 'UTC') {
20878          timezone = 0;
20879        }
20880        else if(/^[+-]\d\d:[0-5]\d$/.test(utc_offset)) {
20881          var sign, hours, minutes;
20882          sign = utc_offset[0];
20883          hours = +(utc_offset[1] + utc_offset[2]);
20884          minutes = +(utc_offset[4] + utc_offset[5]);
20885
20886          timezone = (sign == '-' ? -1 : 1) * (hours + minutes / 60);
20887        }
20888        else {
20889          // Unsupported: "A".."I","K".."Z"
20890          $Kernel.$raise($$$('ArgumentError'), "\"+HH:MM\", \"-HH:MM\", \"UTC\" expected for utc_offset: " + (utc_offset));
20891        }
20892      }
20893      else if (utc_offset.$$is_number) {
20894        timezone = utc_offset / 3600;
20895      }
20896      else {
20897        $Kernel.$raise($$$('ArgumentError'), "Opal doesn't support other types for a timezone argument than Integer and String");
20898      }
20899      return timezone;
20900
20901    });
20902    $defs(self, '$local', function $$local(year, month, day, hour, min, sec, millisecond, _dummy1, _dummy2, _dummy3) {
20903
20904
20905      if (month == null) month = nil;
20906      if (day == null) day = nil;
20907      if (hour == null) hour = nil;
20908      if (min == null) min = nil;
20909      if (sec == null) sec = nil;
20910      if (millisecond == null) millisecond = nil;
20911      if (_dummy1 == null) _dummy1 = nil;
20912      if (_dummy2 == null) _dummy2 = nil;
20913      if (_dummy3 == null) _dummy3 = nil;
20914
20915      var args, result;
20916
20917      if (arguments.length === 10) {
20918        args  = $slice(arguments);
20919        year  = args[5];
20920        month = args[4];
20921        day   = args[3];
20922        hour  = args[2];
20923        min   = args[1];
20924        sec   = args[0];
20925      }
20926
20927      args  = time_params(year, month, day, hour, min, sec);
20928      year  = args[0];
20929      month = args[1];
20930      day   = args[2];
20931      hour  = args[3];
20932      min   = args[4];
20933      sec   = args[5];
20934
20935      result = new Date(year, month, day, hour, min, 0, sec * 1000);
20936      if (year < 100) {
20937        result.setFullYear(year);
20938      }
20939      return result;
20940    }, -2);
20941    $defs(self, '$gm', function $$gm(year, month, day, hour, min, sec, millisecond, _dummy1, _dummy2, _dummy3) {
20942
20943
20944      if (month == null) month = nil;
20945      if (day == null) day = nil;
20946      if (hour == null) hour = nil;
20947      if (min == null) min = nil;
20948      if (sec == null) sec = nil;
20949      if (millisecond == null) millisecond = nil;
20950      if (_dummy1 == null) _dummy1 = nil;
20951      if (_dummy2 == null) _dummy2 = nil;
20952      if (_dummy3 == null) _dummy3 = nil;
20953
20954      var args, result;
20955
20956      if (arguments.length === 10) {
20957        args  = $slice(arguments);
20958        year  = args[5];
20959        month = args[4];
20960        day   = args[3];
20961        hour  = args[2];
20962        min   = args[1];
20963        sec   = args[0];
20964      }
20965
20966      args  = time_params(year, month, day, hour, min, sec);
20967      year  = args[0];
20968      month = args[1];
20969      day   = args[2];
20970      hour  = args[3];
20971      min   = args[4];
20972      sec   = args[5];
20973
20974      result = new Date(Date.UTC(year, month, day, hour, min, 0, sec * 1000));
20975      if (year < 100) {
20976        result.setUTCFullYear(year);
20977      }
20978      result.timezone = 0;
20979      return result;
20980    }, -2);
20981    $defs(self, '$now', function $$now() {
20982      var self = this;
20983
20984      return self.$new()
20985    });
20986
20987    $def(self, '$+', function $Time_$plus$2(other) {
20988      var self = this;
20989
20990
20991      if ($eqeqeq($$$('Time'), other)) {
20992        $Kernel.$raise($$$('TypeError'), "time + time?");
20993      }
20994      if (!other.$$is_number) {
20995        other = $Opal['$coerce_to!'](other, $$$('Integer'), "to_int");
20996      }
20997      var result = new Date(self.getTime() + (other * 1000));
20998      result.timezone = self.timezone;
20999      return result;
21000    });
21001
21002    $def(self, '$-', function $Time_$minus$3(other) {
21003      var self = this;
21004
21005
21006      if ($eqeqeq($$$('Time'), other)) {
21007        return (self.getTime() - other.getTime()) / 1000
21008      }
21009      if (!other.$$is_number) {
21010        other = $Opal['$coerce_to!'](other, $$$('Integer'), "to_int");
21011      }
21012      var result = new Date(self.getTime() - (other * 1000));
21013      result.timezone = self.timezone;
21014      return result;
21015    });
21016
21017    $def(self, '$<=>', function $Time_$lt_eq_gt$4(other) {
21018      var self = this, r = nil;
21019
21020      if ($eqeqeq($$$('Time'), other)) {
21021        return self.$to_f()['$<=>'](other.$to_f())
21022      } else {
21023
21024        r = other['$<=>'](self);
21025        if ($truthy(r['$nil?']())) {
21026          return nil
21027        } else if ($truthy($rb_gt(r, 0))) {
21028          return -1
21029        } else if ($truthy($rb_lt(r, 0))) {
21030          return 1
21031        } else {
21032          return 0
21033        }      }
21034    });
21035
21036    $def(self, '$==', function $Time_$eq_eq$5(other) {
21037      var self = this, $ret_or_1 = nil;
21038
21039      if ($truthy(($ret_or_1 = $$$('Time')['$==='](other)))) {
21040        return self.$to_f() === other.$to_f()
21041      } else {
21042        return $ret_or_1
21043      }
21044    });
21045
21046    $def(self, '$asctime', function $$asctime() {
21047      var self = this;
21048
21049      return self.$strftime("%a %b %e %H:%M:%S %Y")
21050    });
21051    $send([["year", "getFullYear", "getUTCFullYear"], ["mon", "getMonth", "getUTCMonth", 1], ["wday", "getDay", "getUTCDay"], ["day", "getDate", "getUTCDate"], ["hour", "getHours", "getUTCHours"], ["min", "getMinutes", "getUTCMinutes"], ["sec", "getSeconds", "getUTCSeconds"]], 'each', [], function $Time$6(method, getter, utcgetter, difference){var self = $Time$6.$$s == null ? this : $Time$6.$$s;
21052
21053
21054      if (method == null) method = nil;
21055      if (getter == null) getter = nil;
21056      if (utcgetter == null) utcgetter = nil;
21057      if (difference == null) difference = 0;
21058      return $send(self, 'define_method', [method], function $$7(){var self = $$7.$$s == null ? this : $$7.$$s;
21059
21060
21061        return difference + ((self.timezone != null) ?
21062          (new Date(self.getTime() + self.timezone * 3600000))[utcgetter]() :
21063          self[getter]())
21064      }, {$$s: self});}, {$$arity: -4, $$s: self});
21065
21066    $def(self, '$yday', function $$yday() {
21067      var self = this, start_of_year = nil, start_of_day = nil, one_day = nil;
21068
21069
21070      start_of_year = $$('Time').$new(self.$year()).$to_i();
21071      start_of_day = $$('Time').$new(self.$year(), self.$month(), self.$day()).$to_i();
21072      one_day = 86400;
21073      return $rb_plus($rb_divide($rb_minus(start_of_day, start_of_year), one_day).$round(), 1);
21074    });
21075
21076    $def(self, '$isdst', function $$isdst() {
21077      var self = this;
21078
21079
21080      var jan = new Date(self.getFullYear(), 0, 1),
21081          jul = new Date(self.getFullYear(), 6, 1);
21082      return self.getTimezoneOffset() < Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
21083
21084    });
21085
21086    $def(self, '$dup', function $$dup() {
21087      var self = this, copy = nil;
21088
21089
21090      copy = new Date(self.getTime());
21091      copy.$copy_instance_variables(self);
21092      copy.$initialize_dup(self);
21093      return copy;
21094    });
21095
21096    $def(self, '$eql?', function $Time_eql$ques$8(other) {
21097      var self = this, $ret_or_1 = nil;
21098
21099      if ($truthy(($ret_or_1 = other['$is_a?']($$$('Time'))))) {
21100        return self['$<=>'](other)['$zero?']()
21101      } else {
21102        return $ret_or_1
21103      }
21104    });
21105    $send([["sunday?", 0], ["monday?", 1], ["tuesday?", 2], ["wednesday?", 3], ["thursday?", 4], ["friday?", 5], ["saturday?", 6]], 'each', [], function $Time$9(method, weekday){var self = $Time$9.$$s == null ? this : $Time$9.$$s;
21106
21107
21108      if (method == null) method = nil;
21109      if (weekday == null) weekday = nil;
21110      return $send(self, 'define_method', [method], function $$10(){var self = $$10.$$s == null ? this : $$10.$$s;
21111
21112        return self.$wday() === weekday}, {$$s: self});}, {$$s: self});
21113
21114    $def(self, '$hash', function $$hash() {
21115      var self = this;
21116
21117      return 'Time:' + self.getTime();
21118    });
21119
21120    $def(self, '$inspect', function $$inspect() {
21121      var self = this;
21122
21123      if ($truthy(self['$utc?']())) {
21124        return self.$strftime("%Y-%m-%d %H:%M:%S UTC")
21125      } else {
21126        return self.$strftime("%Y-%m-%d %H:%M:%S %z")
21127      }
21128    });
21129
21130    $def(self, '$succ', function $$succ() {
21131      var self = this;
21132
21133
21134      var result = new Date(self.getTime() + 1000);
21135      result.timezone = self.timezone;
21136      return result;
21137
21138    });
21139
21140    $def(self, '$usec', function $$usec() {
21141      var self = this;
21142
21143      return self.getMilliseconds() * 1000;
21144    });
21145
21146    $def(self, '$zone', function $$zone() {
21147      var self = this;
21148
21149
21150      if (self.timezone === 0) return "UTC";
21151      else if (self.timezone != null) return nil;
21152
21153      var string = self.toString(),
21154          result;
21155
21156      if (string.indexOf('(') == -1) {
21157        result = string.match(/[A-Z]{3,4}/)[0];
21158      }
21159      else {
21160        result = string.match(/\((.+)\)(?:\s|$)/)[1];
21161      }
21162
21163      if (result == "GMT" && /(GMT\W*\d{4})/.test(string)) {
21164        return RegExp.$1;
21165      }
21166      else {
21167        return result;
21168      }
21169
21170    });
21171
21172    $def(self, '$getgm', function $$getgm() {
21173      var self = this;
21174
21175
21176      var result = new Date(self.getTime());
21177      result.timezone = 0;
21178      return result;
21179
21180    });
21181
21182    $def(self, '$gmtime', function $$gmtime() {
21183      var self = this;
21184
21185
21186      if (self.timezone !== 0) {
21187        $deny_frozen_access(self);
21188        self.timezone = 0;
21189      }
21190      return self;
21191
21192    });
21193
21194    $def(self, '$gmt?', function $Time_gmt$ques$11() {
21195      var self = this;
21196
21197      return self.timezone === 0;
21198    });
21199
21200    $def(self, '$gmt_offset', function $$gmt_offset() {
21201      var self = this;
21202
21203      return (self.timezone != null) ? self.timezone * 60 : -self.getTimezoneOffset() * 60;
21204    });
21205
21206    $def(self, '$strftime', function $$strftime(format) {
21207      var self = this;
21208
21209
21210      return format.replace(/%([\-_#^0]*:{0,2})(\d+)?([EO]*)(.)/g, function(full, flags, width, _, conv) {
21211        var result = "", jd, c, s,
21212            zero   = flags.indexOf('0') !== -1,
21213            pad    = flags.indexOf('-') === -1,
21214            blank  = flags.indexOf('_') !== -1,
21215            upcase = flags.indexOf('^') !== -1,
21216            invert = flags.indexOf('#') !== -1,
21217            colons = (flags.match(':') || []).length;
21218
21219        width = parseInt(width, 10);
21220
21221        if (zero && blank) {
21222          if (flags.indexOf('0') < flags.indexOf('_')) {
21223            zero = false;
21224          }
21225          else {
21226            blank = false;
21227          }
21228        }
21229
21230        switch (conv) {
21231          case 'Y':
21232            result += self.$year();
21233            break;
21234
21235          case 'C':
21236            zero    = !blank;
21237            result += Math.round(self.$year() / 100);
21238            break;
21239
21240          case 'y':
21241            zero    = !blank;
21242            result += (self.$year() % 100);
21243            break;
21244
21245          case 'm':
21246            zero    = !blank;
21247            result += self.$mon();
21248            break;
21249
21250          case 'B':
21251            result += long_months[self.$mon() - 1];
21252            break;
21253
21254          case 'b':
21255          case 'h':
21256            blank   = !zero;
21257            result += short_months[self.$mon() - 1];
21258            break;
21259
21260          case 'd':
21261            zero    = !blank;
21262            result += self.$day();
21263            break;
21264
21265          case 'e':
21266            blank   = !zero;
21267            result += self.$day();
21268            break;
21269
21270          case 'j':
21271            zero    = !blank;
21272            width   = isNaN(width) ? 3 : width;
21273            result += self.$yday();
21274            break;
21275
21276          case 'H':
21277            zero    = !blank;
21278            result += self.$hour();
21279            break;
21280
21281          case 'k':
21282            blank   = !zero;
21283            result += self.$hour();
21284            break;
21285
21286          case 'I':
21287            zero    = !blank;
21288            result += (self.$hour() % 12 || 12);
21289            break;
21290
21291          case 'l':
21292            blank   = !zero;
21293            result += (self.$hour() % 12 || 12);
21294            break;
21295
21296          case 'P':
21297            result += (self.$hour() >= 12 ? "pm" : "am");
21298            break;
21299
21300          case 'p':
21301            result += (self.$hour() >= 12 ? "PM" : "AM");
21302            break;
21303
21304          case 'M':
21305            zero    = !blank;
21306            result += self.$min();
21307            break;
21308
21309          case 'S':
21310            zero    = !blank;
21311            result += self.$sec();
21312            break;
21313
21314          case 'L':
21315            zero    = !blank;
21316            width   = isNaN(width) ? 3 : width;
21317            result += self.getMilliseconds();
21318            break;
21319
21320          case 'N':
21321            width   = isNaN(width) ? 9 : width;
21322            result += (self.getMilliseconds().toString()).$rjust(3, "0");
21323            result  = (result).$ljust(width, "0");
21324            break;
21325
21326          case 'z':
21327            var offset  = (self.timezone == null) ? self.getTimezoneOffset() : (-self.timezone * 60),
21328                hours   = Math.floor(Math.abs(offset) / 60),
21329                minutes = Math.abs(offset) % 60;
21330
21331            result += offset < 0 ? "+" : "-";
21332            result += hours < 10 ? "0" : "";
21333            result += hours;
21334
21335            if (colons > 0) {
21336              result += ":";
21337            }
21338
21339            result += minutes < 10 ? "0" : "";
21340            result += minutes;
21341
21342            if (colons > 1) {
21343              result += ":00";
21344            }
21345
21346            break;
21347
21348          case 'Z':
21349            result += self.$zone();
21350            break;
21351
21352          case 'A':
21353            result += days_of_week[self.$wday()];
21354            break;
21355
21356          case 'a':
21357            result += short_days[self.$wday()];
21358            break;
21359
21360          case 'u':
21361            result += (self.$wday() + 1);
21362            break;
21363
21364          case 'w':
21365            result += self.$wday();
21366            break;
21367
21368          case 'V':
21369            result += self.$cweek_cyear()['$[]'](0).$to_s().$rjust(2, "0");
21370            break;
21371
21372          case 'G':
21373            result += self.$cweek_cyear()['$[]'](1);
21374            break;
21375
21376          case 'g':
21377            result += self.$cweek_cyear()['$[]'](1)['$[]']($range(-2, -1, false));
21378            break;
21379
21380          case 's':
21381            result += self.$to_i();
21382            break;
21383
21384          case 'n':
21385            result += "\n";
21386            break;
21387
21388          case 't':
21389            result += "\t";
21390            break;
21391
21392          case '%':
21393            result += "%";
21394            break;
21395
21396          case 'c':
21397            result += self.$strftime("%a %b %e %T %Y");
21398            break;
21399
21400          case 'D':
21401          case 'x':
21402            result += self.$strftime("%m/%d/%y");
21403            break;
21404
21405          case 'F':
21406            result += self.$strftime("%Y-%m-%d");
21407            break;
21408
21409          case 'v':
21410            result += self.$strftime("%e-%^b-%4Y");
21411            break;
21412
21413          case 'r':
21414            result += self.$strftime("%I:%M:%S %p");
21415            break;
21416
21417          case 'R':
21418            result += self.$strftime("%H:%M");
21419            break;
21420
21421          case 'T':
21422          case 'X':
21423            result += self.$strftime("%H:%M:%S");
21424            break;
21425
21426          // Non-standard: JIS X 0301 date format
21427          case 'J':
21428            jd = self.$to_date().$jd();
21429            if (jd < 2405160) {
21430              result += self.$strftime("%Y-%m-%d");
21431              break;
21432            }
21433            else if (jd < 2419614)
21434              c = 'M', s = 1867;
21435            else if (jd < 2424875)
21436              c = 'T', s = 1911;
21437            else if (jd < 2447535)
21438              c = 'S', s = 1925;
21439            else if (jd < 2458605)
21440              c = 'H', s = 1988;
21441            else
21442              c = 'R', s = 2018;
21443
21444            result += self.$format("%c%02d", c, $rb_minus(self.$year(), s));
21445            result += self.$strftime("-%m-%d");
21446            break;
21447
21448          default:
21449            return full;
21450        }
21451
21452        if (upcase) {
21453          result = result.toUpperCase();
21454        }
21455
21456        if (invert) {
21457          result = result.replace(/[A-Z]/, function(c) { c.toLowerCase(); }).
21458                          replace(/[a-z]/, function(c) { c.toUpperCase(); });
21459        }
21460
21461        if (pad && (zero || blank)) {
21462          result = (result).$rjust(isNaN(width) ? 2 : width, blank ? " " : "0");
21463        }
21464
21465        return result;
21466      });
21467
21468    });
21469
21470    $def(self, '$to_a', function $$to_a() {
21471      var self = this;
21472
21473      return [self.$sec(), self.$min(), self.$hour(), self.$day(), self.$month(), self.$year(), self.$wday(), self.$yday(), self.$isdst(), self.$zone()]
21474    });
21475
21476    $def(self, '$to_f', function $$to_f() {
21477      var self = this;
21478
21479      return self.getTime() / 1000;
21480    });
21481
21482    $def(self, '$to_i', function $$to_i() {
21483      var self = this;
21484
21485      return parseInt(self.getTime() / 1000, 10);
21486    });
21487
21488    $def(self, '$cweek_cyear', function $$cweek_cyear() {
21489      var self = this, jan01 = nil, jan01_wday = nil, year = nil, offset = nil, week = nil, dec31 = nil, dec31_wday = nil;
21490
21491
21492      jan01 = $$$('Time').$new(self.$year(), 1, 1);
21493      jan01_wday = jan01.$wday();
21494      year = self.$year();
21495      if (($truthy($rb_le(jan01_wday, 4)) && ($neqeq(jan01_wday, 0)))) {
21496        offset = $rb_minus(jan01_wday, 1);
21497      } else {
21498
21499        offset = $rb_minus($rb_minus(jan01_wday, 7), 1);
21500        if ($eqeq(offset, -8)) {
21501          offset = -1;
21502        }      }      week = $rb_divide($rb_plus(self.$yday(), offset), 7.0).$ceil();
21503      if ($truthy($rb_le(week, 0))) {
21504        return $$$('Time').$new($rb_minus(self.$year(), 1), 12, 31).$cweek_cyear()
21505      } else if ($eqeq(week, 53)) {
21506
21507        dec31 = $$$('Time').$new(self.$year(), 12, 31);
21508        dec31_wday = dec31.$wday();
21509        if (($truthy($rb_le(dec31_wday, 3)) && ($neqeq(dec31_wday, 0)))) {
21510
21511          week = 1;
21512          year = $rb_plus(year, 1);
21513        }      }      return [week, year];
21514    });
21515    (function(self, $parent_nesting) {
21516
21517
21518      $alias(self, "mktime", "local");
21519      return $alias(self, "utc", "gm");
21520    })(Opal.get_singleton_class(self));
21521    $alias(self, "ctime", "asctime");
21522    $alias(self, "dst?", "isdst");
21523    $alias(self, "getutc", "getgm");
21524    $alias(self, "gmtoff", "gmt_offset");
21525    $alias(self, "mday", "day");
21526    $alias(self, "month", "mon");
21527    $alias(self, "to_s", "inspect");
21528    $alias(self, "tv_sec", "to_i");
21529    $alias(self, "tv_usec", "usec");
21530    $alias(self, "utc", "gmtime");
21531    $alias(self, "utc?", "gmt?");
21532    return $alias(self, "utc_offset", "gmt_offset");
21533  })('::', Date, $nesting);
21534};
21535
21536Opal.modules["corelib/struct"] = function(Opal) {/* Generated by Opal 1.7.3 */
21537  var $klass = Opal.klass, $slice = Opal.slice, $extract_kwargs = Opal.extract_kwargs, $ensure_kwargs = Opal.ensure_kwargs, $truthy = Opal.truthy, $neqeq = Opal.neqeq, $eqeq = Opal.eqeq, $Opal = Opal.Opal, $send = Opal.send, $Class = Opal.Class, $to_a = Opal.to_a, $def = Opal.def, $defs = Opal.defs, $Kernel = Opal.Kernel, $hash2 = Opal.hash2, $rb_gt = Opal.rb_gt, $rb_minus = Opal.rb_minus, $eqeqeq = Opal.eqeqeq, $rb_lt = Opal.rb_lt, $rb_ge = Opal.rb_ge, $rb_plus = Opal.rb_plus, $alias = Opal.alias, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
21538
21539  Opal.add_stubs('require,include,!=,upcase,[],==,class,unshift,const_name!,map,coerce_to!,new,each,define_struct_attribute,allocate,initialize,alias_method,module_eval,to_proc,const_set,raise,<<,members,define_method,instance_eval,last,>,length,-,keys,any?,join,[]=,each_with_index,hash,===,<,-@,size,>=,include?,to_sym,instance_of?,__id__,eql?,enum_for,+,name,each_pair,inspect,to_h,args,each_with_object,flatten,to_a,respond_to?,dig');
21540
21541  self.$require("corelib/enumerable");
21542  return (function($base, $super, $parent_nesting) {
21543    var self = $klass($base, $super, 'Struct');
21544
21545    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
21546
21547
21548    self.$include($$$('Enumerable'));
21549    $defs(self, '$new', function $Struct_new$1(const_name, $a, $b) {
21550      var block = $Struct_new$1.$$p || nil, $post_args, $kwargs, args, keyword_init, self = this, klass = nil;
21551
21552      $Struct_new$1.$$p = null;
21553      $post_args = $slice(arguments, 1);
21554      $kwargs = $extract_kwargs($post_args);
21555      $kwargs = $ensure_kwargs($kwargs);
21556      args = $post_args;
21557
21558      keyword_init = $kwargs.$$smap["keyword_init"];if (keyword_init == null) keyword_init = false;
21559      if ($truthy(const_name)) {
21560        if (($eqeq(const_name.$class(), $$$('String')) && ($neqeq(const_name['$[]'](0).$upcase(), const_name['$[]'](0))))) {
21561
21562          args.$unshift(const_name);
21563          const_name = nil;
21564        } else {
21565
21566          try {
21567            const_name = $Opal['$const_name!'](const_name);
21568          } catch ($err) {
21569            if (Opal.rescue($err, [$$$('TypeError'), $$$('NameError')])) {
21570              try {
21571
21572                args.$unshift(const_name);
21573                const_name = nil;
21574              } finally { Opal.pop_exception(); }
21575            } else { throw $err; }
21576          }        }
21577      }      $send(args, 'map', [], function $$2(arg){
21578
21579        if (arg == null) arg = nil;
21580        return $Opal['$coerce_to!'](arg, $$$('String'), "to_str");});
21581      klass = $send($Class, 'new', [self], function $$3(){var self = $$3.$$s == null ? this : $$3.$$s;
21582
21583
21584        $send(args, 'each', [], function $$4(arg){var self = $$4.$$s == null ? this : $$4.$$s;
21585
21586
21587          if (arg == null) arg = nil;
21588          return self.$define_struct_attribute(arg);}, {$$s: self});
21589        return (function(self, $parent_nesting) {
21590
21591
21592
21593          $def(self, '$new', function $new$5($a) {
21594            var $post_args, args, self = this, instance = nil;
21595
21596
21597            $post_args = $slice(arguments);
21598            args = $post_args;
21599            instance = self.$allocate();
21600            instance.$$data = {};
21601            $send(instance, 'initialize', $to_a(args));
21602            return instance;
21603          }, -1);
21604          return self.$alias_method("[]", "new");
21605        })(Opal.get_singleton_class(self));}, {$$s: self});
21606      if ($truthy(block)) {
21607        $send(klass, 'module_eval', [], block.$to_proc());
21608      }      klass.$$keyword_init = keyword_init;
21609      if ($truthy(const_name)) {
21610        $$$('Struct').$const_set(const_name, klass);
21611      }      return klass;
21612    }, -2);
21613    $defs(self, '$define_struct_attribute', function $$define_struct_attribute(name) {
21614      var self = this;
21615
21616
21617      if ($eqeq(self, $$$('Struct'))) {
21618        $Kernel.$raise($$$('ArgumentError'), "you cannot define attributes to the Struct class");
21619      }      self.$members()['$<<'](name);
21620      $send(self, 'define_method', [name], function $$6(){var self = $$6.$$s == null ? this : $$6.$$s;
21621
21622        return self.$$data[name];}, {$$s: self});
21623      return $send(self, 'define_method', ["" + (name) + "="], function $$7(value){var self = $$7.$$s == null ? this : $$7.$$s;
21624
21625
21626        if (value == null) value = nil;
21627        return self.$$data[name] = value;}, {$$s: self});
21628    });
21629    $defs(self, '$members', function $$members() {
21630      var self = this, $ret_or_1 = nil;
21631      if (self.members == null) self.members = nil;
21632
21633
21634      if ($eqeq(self, $$$('Struct'))) {
21635        $Kernel.$raise($$$('ArgumentError'), "the Struct class has no members");
21636      }      return (self.members = ($truthy(($ret_or_1 = self.members)) ? ($ret_or_1) : ([])));
21637    });
21638    $defs(self, '$inherited', function $$inherited(klass) {
21639      var self = this, members = nil;
21640      if (self.members == null) self.members = nil;
21641
21642
21643      members = self.members;
21644      return $send(klass, 'instance_eval', [], function $$8(){var self = $$8.$$s == null ? this : $$8.$$s;
21645
21646        return (self.members = members)}, {$$s: self});
21647    });
21648
21649    $def(self, '$initialize', function $$initialize($a) {
21650      var $post_args, args, self = this, kwargs = nil, $ret_or_1 = nil, extra = nil;
21651
21652
21653      $post_args = $slice(arguments);
21654      args = $post_args;
21655      if ($truthy(self.$class().$$keyword_init)) {
21656
21657        kwargs = ($truthy(($ret_or_1 = args.$last())) ? ($ret_or_1) : ($hash2([], {})));
21658        if (($truthy($rb_gt(args.$length(), 1)) || ($truthy((args.length === 1 && !kwargs.$$is_hash))))) {
21659          $Kernel.$raise($$$('ArgumentError'), "wrong number of arguments (given " + (args.$length()) + ", expected 0)");
21660        }        extra = $rb_minus(kwargs.$keys(), self.$class().$members());
21661        if ($truthy(extra['$any?']())) {
21662          $Kernel.$raise($$$('ArgumentError'), "unknown keywords: " + (extra.$join(", ")));
21663        }        return $send(self.$class().$members(), 'each', [], function $$9(name){var $b, self = $$9.$$s == null ? this : $$9.$$s;
21664
21665
21666          if (name == null) name = nil;
21667          return ($b = [name, kwargs['$[]'](name)], $send(self, '[]=', $b), $b[$b.length - 1]);}, {$$s: self});
21668      } else {
21669
21670        if ($truthy($rb_gt(args.$length(), self.$class().$members().$length()))) {
21671          $Kernel.$raise($$$('ArgumentError'), "struct size differs");
21672        }        return $send(self.$class().$members(), 'each_with_index', [], function $$10(name, index){var $b, self = $$10.$$s == null ? this : $$10.$$s;
21673
21674
21675          if (name == null) name = nil;
21676          if (index == null) index = nil;
21677          return ($b = [name, args['$[]'](index)], $send(self, '[]=', $b), $b[$b.length - 1]);}, {$$s: self});
21678      }    }, -1);
21679
21680    $def(self, '$initialize_copy', function $$initialize_copy(from) {
21681      var self = this;
21682
21683
21684      self.$$data = {};
21685      var keys = Object.keys(from.$$data), i, max, name;
21686      for (i = 0, max = keys.length; i < max; i++) {
21687        name = keys[i];
21688        self.$$data[name] = from.$$data[name];
21689      }
21690
21691    });
21692    $defs(self, '$keyword_init?', function $Struct_keyword_init$ques$11() {
21693      var self = this;
21694
21695      return self.$$keyword_init;
21696    });
21697
21698    $def(self, '$members', function $$members() {
21699      var self = this;
21700
21701      return self.$class().$members()
21702    });
21703
21704    $def(self, '$hash', function $$hash() {
21705      var self = this;
21706
21707      return $$('Hash').$new(self.$$data).$hash()
21708    });
21709
21710    $def(self, '$[]', function $Struct_$$$12(name) {
21711      var self = this;
21712
21713
21714      if ($eqeqeq($$$('Integer'), name)) {
21715
21716        if ($truthy($rb_lt(name, self.$class().$members().$size()['$-@']()))) {
21717          $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too small for struct(size:" + (self.$class().$members().$size()) + ")");
21718        }        if ($truthy($rb_ge(name, self.$class().$members().$size()))) {
21719          $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too large for struct(size:" + (self.$class().$members().$size()) + ")");
21720        }        name = self.$class().$members()['$[]'](name);
21721      } else if ($eqeqeq($$$('String'), name)) {
21722
21723        if(!self.$$data.hasOwnProperty(name)) {
21724          $Kernel.$raise($$$('NameError').$new("no member '" + (name) + "' in struct", name));
21725        }
21726
21727      } else {
21728        $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + (name.$class()) + " into Integer");
21729      }      name = $Opal['$coerce_to!'](name, $$$('String'), "to_str");
21730      return self.$$data[name];    });
21731
21732    $def(self, '$[]=', function $Struct_$$$eq$13(name, value) {
21733      var self = this;
21734
21735
21736      if ($eqeqeq($$$('Integer'), name)) {
21737
21738        if ($truthy($rb_lt(name, self.$class().$members().$size()['$-@']()))) {
21739          $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too small for struct(size:" + (self.$class().$members().$size()) + ")");
21740        }        if ($truthy($rb_ge(name, self.$class().$members().$size()))) {
21741          $Kernel.$raise($$$('IndexError'), "offset " + (name) + " too large for struct(size:" + (self.$class().$members().$size()) + ")");
21742        }        name = self.$class().$members()['$[]'](name);
21743      } else if ($eqeqeq($$$('String'), name)) {
21744        if (!$truthy(self.$class().$members()['$include?'](name.$to_sym()))) {
21745          $Kernel.$raise($$$('NameError').$new("no member '" + (name) + "' in struct", name));
21746        }
21747      } else {
21748        $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + (name.$class()) + " into Integer");
21749      }      name = $Opal['$coerce_to!'](name, $$$('String'), "to_str");
21750      return self.$$data[name] = value;    });
21751
21752    $def(self, '$==', function $Struct_$eq_eq$14(other) {
21753      var self = this;
21754
21755
21756      if (!$truthy(other['$instance_of?'](self.$class()))) {
21757        return false
21758      }
21759      var recursed1 = {}, recursed2 = {};
21760
21761      function _eqeq(struct, other) {
21762        var key, a, b;
21763
21764        recursed1[(struct).$__id__()] = true;
21765        recursed2[(other).$__id__()] = true;
21766
21767        for (key in struct.$$data) {
21768          a = struct.$$data[key];
21769          b = other.$$data[key];
21770
21771          if ($$$('Struct')['$==='](a)) {
21772            if (!recursed1.hasOwnProperty((a).$__id__()) || !recursed2.hasOwnProperty((b).$__id__())) {
21773              if (!_eqeq(a, b)) {
21774                return false;
21775              }
21776            }
21777          } else {
21778            if (!(a)['$=='](b)) {
21779              return false;
21780            }
21781          }
21782        }
21783
21784        return true;
21785      }
21786
21787      return _eqeq(self, other);
21788    });
21789
21790    $def(self, '$eql?', function $Struct_eql$ques$15(other) {
21791      var self = this;
21792
21793
21794      if (!$truthy(other['$instance_of?'](self.$class()))) {
21795        return false
21796      }
21797      var recursed1 = {}, recursed2 = {};
21798
21799      function _eqeq(struct, other) {
21800        var key, a, b;
21801
21802        recursed1[(struct).$__id__()] = true;
21803        recursed2[(other).$__id__()] = true;
21804
21805        for (key in struct.$$data) {
21806          a = struct.$$data[key];
21807          b = other.$$data[key];
21808
21809          if ($$$('Struct')['$==='](a)) {
21810            if (!recursed1.hasOwnProperty((a).$__id__()) || !recursed2.hasOwnProperty((b).$__id__())) {
21811              if (!_eqeq(a, b)) {
21812                return false;
21813              }
21814            }
21815          } else {
21816            if (!(a)['$eql?'](b)) {
21817              return false;
21818            }
21819          }
21820        }
21821
21822        return true;
21823      }
21824
21825      return _eqeq(self, other);
21826    });
21827
21828    $def(self, '$each', function $$each() {
21829      var $yield = $$each.$$p || nil, self = this;
21830
21831      $$each.$$p = null;
21832
21833      if (!($yield !== nil)) {
21834        return $send(self, 'enum_for', ["each"], function $$16(){var self = $$16.$$s == null ? this : $$16.$$s;
21835
21836          return self.$size()}, {$$s: self})
21837      }      $send(self.$class().$members(), 'each', [], function $$17(name){var self = $$17.$$s == null ? this : $$17.$$s;
21838
21839
21840        if (name == null) name = nil;
21841        return Opal.yield1($yield, self['$[]'](name));}, {$$s: self});
21842      return self;
21843    });
21844
21845    $def(self, '$each_pair', function $$each_pair() {
21846      var $yield = $$each_pair.$$p || nil, self = this;
21847
21848      $$each_pair.$$p = null;
21849
21850      if (!($yield !== nil)) {
21851        return $send(self, 'enum_for', ["each_pair"], function $$18(){var self = $$18.$$s == null ? this : $$18.$$s;
21852
21853          return self.$size()}, {$$s: self})
21854      }      $send(self.$class().$members(), 'each', [], function $$19(name){var self = $$19.$$s == null ? this : $$19.$$s;
21855
21856
21857        if (name == null) name = nil;
21858        return Opal.yield1($yield, [name, self['$[]'](name)]);}, {$$s: self});
21859      return self;
21860    });
21861
21862    $def(self, '$length', function $$length() {
21863      var self = this;
21864
21865      return self.$class().$members().$length()
21866    });
21867
21868    $def(self, '$to_a', function $$to_a() {
21869      var self = this;
21870
21871      return $send(self.$class().$members(), 'map', [], function $$20(name){var self = $$20.$$s == null ? this : $$20.$$s;
21872
21873
21874        if (name == null) name = nil;
21875        return self['$[]'](name);}, {$$s: self})
21876    });
21877    var inspect_stack = [];
21878
21879    $def(self, '$inspect', function $$inspect() {
21880      var self = this, result = nil, pushed = nil;
21881
21882      return (function() { try {
21883
21884      result = "#<struct ";
21885      if ($truthy((inspect_stack)['$include?'](self.$__id__()))) {
21886        return $rb_plus(result, ":...>")
21887      } else {
21888
21889        (inspect_stack)['$<<'](self.$__id__());
21890        pushed = true;
21891        if (($eqeqeq($$$('Struct'), self) && ($truthy(self.$class().$name())))) {
21892          result = $rb_plus(result, "" + (self.$class()) + " ");
21893        };
21894        result = $rb_plus(result, $send(self.$each_pair(), 'map', [], function $$21(name, value){
21895
21896          if (name == null) name = nil;
21897          if (value == null) value = nil;
21898          return "" + (name) + "=" + ($$('Opal').$inspect(value));}).$join(", "));
21899        result = $rb_plus(result, ">");
21900        return result;
21901      };
21902      } finally {
21903        ($truthy(pushed) ? (inspect_stack.pop()) : nil);
21904      } })()
21905    });
21906
21907    $def(self, '$to_h', function $$to_h() {
21908      var block = $$to_h.$$p || nil, self = this;
21909
21910      $$to_h.$$p = null;
21911      if ((block !== nil)) {
21912        return $send($send(self, 'map', [], block.$to_proc()), 'to_h', $to_a(self.$args()))
21913      }      return $send(self.$class().$members(), 'each_with_object', [$hash2([], {})], function $$22(name, h){var $a, self = $$22.$$s == null ? this : $$22.$$s;
21914
21915
21916        if (name == null) name = nil;
21917        if (h == null) h = nil;
21918        return ($a = [name, self['$[]'](name)], $send(h, '[]=', $a), $a[$a.length - 1]);}, {$$s: self});
21919    });
21920
21921    $def(self, '$values_at', function $$values_at($a) {
21922      var $post_args, args, self = this;
21923
21924
21925      $post_args = $slice(arguments);
21926      args = $post_args;
21927      args = $send(args, 'map', [], function $$23(arg){
21928
21929        if (arg == null) arg = nil;
21930        return arg.$$is_range ? arg.$to_a() : arg;}).$flatten();
21931
21932      var result = [];
21933      for (var i = 0, len = args.length; i < len; i++) {
21934        if (!args[i].$$is_number) {
21935          $Kernel.$raise($$$('TypeError'), "no implicit conversion of " + ((args[i]).$class()) + " into Integer");
21936        }
21937        result.push(self['$[]'](args[i]));
21938      }
21939      return result;
21940    }, -1);
21941
21942    $def(self, '$dig', function $$dig(key, $a) {
21943      var $post_args, keys, self = this, item = nil;
21944
21945
21946      $post_args = $slice(arguments, 1);
21947      keys = $post_args;
21948      item = ($truthy(key.$$is_string && self.$$data.hasOwnProperty(key)) ? (self.$$data[key] || nil) : nil);
21949
21950      if (item === nil || keys.length === 0) {
21951        return item;
21952      }
21953      if (!$truthy(item['$respond_to?']("dig"))) {
21954        $Kernel.$raise($$$('TypeError'), "" + (item.$class()) + " does not have #dig method");
21955      }      return $send(item, 'dig', $to_a(keys));
21956    }, -2);
21957    $alias(self, "size", "length");
21958    $alias(self, "to_s", "inspect");
21959    return $alias(self, "values", "to_a");
21960  })('::', null, $nesting);
21961};
21962
21963Opal.modules["corelib/set"] = function(Opal) {/* Generated by Opal 1.7.3 */
21964  var $freeze = Opal.freeze, $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $hash2 = Opal.hash2, $truthy = Opal.truthy, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $send = Opal.send, $def = Opal.def, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_le = Opal.rb_le, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
21965
21966  Opal.add_stubs('include,new,nil?,===,raise,each,add,merge,class,respond_to?,subtract,dup,join,to_a,equal?,instance_of?,==,instance_variable_get,size,is_a?,all?,include?,[]=,enum_for,[],<<,replace,compare_by_identity,name,compare_by_identity?,delete,select,frozen?,freeze,reject,delete_if,to_proc,keep_if,each_key,empty?,eql?,instance_eval,clear,<,<=,any?,!,intersect?,keys,|,proper_subset?,subset?,proper_superset?,superset?,-,select!,collect!');
21967  return (function($base, $super, $parent_nesting) {
21968    var self = $klass($base, $super, 'Set');
21969
21970    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $ret_or_1 = nil, $proto = self.$$prototype;
21971
21972    $proto.hash = nil;
21973
21974    self.$include($$$('Enumerable'));
21975    $defs(self, '$[]', function $Set_$$$1($a) {
21976      var $post_args, ary, self = this;
21977
21978
21979      $post_args = $slice(arguments);
21980      ary = $post_args;
21981      return self.$new(ary);
21982    }, -1);
21983
21984    $def(self, '$initialize', function $$initialize(enum$) {
21985      var block = $$initialize.$$p || nil, self = this;
21986
21987      $$initialize.$$p = null;
21988      if (enum$ == null) enum$ = nil;
21989      self.hash = $hash2([], {});
21990      if ($truthy(enum$['$nil?']())) {
21991        return nil
21992      }      if (!$eqeqeq($$$('Enumerable'), enum$)) {
21993        $Kernel.$raise($$$('ArgumentError'), "value must be enumerable");
21994      }      if ($truthy(block)) {
21995        return $send(enum$, 'each', [], function $$2(item){var self = $$2.$$s == null ? this : $$2.$$s;
21996
21997
21998          if (item == null) item = nil;
21999          return self.$add(Opal.yield1(block, item));}, {$$s: self})
22000      } else {
22001        return self.$merge(enum$)
22002      }    }, -1);
22003
22004    $def(self, '$dup', function $$dup() {
22005      var self = this, result = nil;
22006
22007
22008      result = self.$class().$new();
22009      return result.$merge(self);
22010    });
22011
22012    $def(self, '$-', function $Set_$minus$3(enum$) {
22013      var self = this;
22014
22015
22016      if (!$truthy(enum$['$respond_to?']("each"))) {
22017        $Kernel.$raise($$$('ArgumentError'), "value must be enumerable");
22018      }      return self.$dup().$subtract(enum$);
22019    });
22020
22021    $def(self, '$inspect', function $$inspect() {
22022      var self = this;
22023
22024      return "#<Set: {" + (self.$to_a().$join(",")) + "}>"
22025    });
22026
22027    $def(self, '$==', function $Set_$eq_eq$4(other) {
22028      var self = this;
22029
22030      if ($truthy(self['$equal?'](other))) {
22031        return true
22032      } else if ($truthy(other['$instance_of?'](self.$class()))) {
22033        return self.hash['$=='](other.$instance_variable_get("@hash"))
22034      } else if (($truthy(other['$is_a?']($$$('Set'))) && ($eqeq(self.$size(), other.$size())))) {
22035        return $send(other, 'all?', [], function $$5(o){var self = $$5.$$s == null ? this : $$5.$$s;
22036          if (self.hash == null) self.hash = nil;
22037
22038
22039          if (o == null) o = nil;
22040          return self.hash['$include?'](o);}, {$$s: self})
22041      } else {
22042        return false
22043      }
22044    });
22045
22046    $def(self, '$add', function $$add(o) {
22047      var self = this;
22048
22049
22050      self.hash['$[]='](o, true);
22051      return self;
22052    });
22053
22054    $def(self, '$classify', function $$classify() {
22055      var block = $$classify.$$p || nil, self = this, result = nil;
22056
22057      $$classify.$$p = null;
22058      if (!(block !== nil)) {
22059        return self.$enum_for("classify")
22060      }      result = $send($$$('Hash'), 'new', [], function $$6(h, k){var $a, self = $$6.$$s == null ? this : $$6.$$s;
22061
22062
22063        if (h == null) h = nil;
22064        if (k == null) k = nil;
22065        return ($a = [k, self.$class().$new()], $send(h, '[]=', $a), $a[$a.length - 1]);}, {$$s: self});
22066      $send(self, 'each', [], function $$7(item){
22067
22068        if (item == null) item = nil;
22069        return result['$[]'](Opal.yield1(block, item)).$add(item);});
22070      return result;
22071    });
22072
22073    $def(self, '$collect!', function $Set_collect$excl$8() {
22074      var block = $Set_collect$excl$8.$$p || nil, self = this, result = nil;
22075
22076      $Set_collect$excl$8.$$p = null;
22077      if (!(block !== nil)) {
22078        return self.$enum_for("collect!")
22079      }      result = self.$class().$new();
22080      $send(self, 'each', [], function $$9(item){
22081
22082        if (item == null) item = nil;
22083        return result['$<<'](Opal.yield1(block, item));});
22084      return self.$replace(result);
22085    });
22086
22087    $def(self, '$compare_by_identity', function $$compare_by_identity() {
22088      var self = this;
22089
22090      if ($truthy(self.hash['$respond_to?']("compare_by_identity"))) {
22091
22092        self.hash.$compare_by_identity();
22093        return self;
22094      } else {
22095        return self.$raise($$('NotImplementedError'), "" + (self.$class().$name()) + "#" + ("compare_by_identity") + " is not implemented")
22096      }
22097    });
22098
22099    $def(self, '$compare_by_identity?', function $Set_compare_by_identity$ques$10() {
22100      var self = this, $ret_or_1 = nil;
22101
22102      if ($truthy(($ret_or_1 = self.hash['$respond_to?']("compare_by_identity?")))) {
22103        return self.hash['$compare_by_identity?']()
22104      } else {
22105        return $ret_or_1
22106      }
22107    });
22108
22109    $def(self, '$delete', function $Set_delete$11(o) {
22110      var self = this;
22111
22112
22113      self.hash.$delete(o);
22114      return self;
22115    });
22116
22117    $def(self, '$delete?', function $Set_delete$ques$12(o) {
22118      var self = this;
22119
22120      if ($truthy(self['$include?'](o))) {
22121
22122        self.$delete(o);
22123        return self;
22124      } else {
22125        return nil
22126      }
22127    });
22128
22129    $def(self, '$delete_if', function $$delete_if() {
22130      var $yield = $$delete_if.$$p || nil, self = this;
22131
22132      $$delete_if.$$p = null;
22133
22134      if (!($yield !== nil)) {
22135        return self.$enum_for("delete_if")
22136      }      $send($send(self, 'select', [], function $$13(o){
22137
22138        if (o == null) o = nil;
22139        return Opal.yield1($yield, o);}), 'each', [], function $$14(o){var self = $$14.$$s == null ? this : $$14.$$s;
22140        if (self.hash == null) self.hash = nil;
22141
22142
22143        if (o == null) o = nil;
22144        return self.hash.$delete(o);}, {$$s: self});
22145      return self;
22146    });
22147
22148    $def(self, '$freeze', function $$freeze() {
22149      var self = this;
22150
22151
22152      if ($truthy(self['$frozen?']())) {
22153        return self
22154      }      self.hash.$freeze();
22155      return $freeze(self);    });
22156
22157    $def(self, '$keep_if', function $$keep_if() {
22158      var $yield = $$keep_if.$$p || nil, self = this;
22159
22160      $$keep_if.$$p = null;
22161
22162      if (!($yield !== nil)) {
22163        return self.$enum_for("keep_if")
22164      }      $send($send(self, 'reject', [], function $$15(o){
22165
22166        if (o == null) o = nil;
22167        return Opal.yield1($yield, o);}), 'each', [], function $$16(o){var self = $$16.$$s == null ? this : $$16.$$s;
22168        if (self.hash == null) self.hash = nil;
22169
22170
22171        if (o == null) o = nil;
22172        return self.hash.$delete(o);}, {$$s: self});
22173      return self;
22174    });
22175
22176    $def(self, '$reject!', function $Set_reject$excl$17() {
22177      var block = $Set_reject$excl$17.$$p || nil, self = this, before = nil;
22178
22179      $Set_reject$excl$17.$$p = null;
22180      if (!(block !== nil)) {
22181        return self.$enum_for("reject!")
22182      }      before = self.$size();
22183      $send(self, 'delete_if', [], block.$to_proc());
22184      if ($eqeq(self.$size(), before)) {
22185        return nil
22186      } else {
22187        return self
22188      }    });
22189
22190    $def(self, '$select!', function $Set_select$excl$18() {
22191      var block = $Set_select$excl$18.$$p || nil, self = this, before = nil;
22192
22193      $Set_select$excl$18.$$p = null;
22194      if (!(block !== nil)) {
22195        return self.$enum_for("select!")
22196      }      before = self.$size();
22197      $send(self, 'keep_if', [], block.$to_proc());
22198      if ($eqeq(self.$size(), before)) {
22199        return nil
22200      } else {
22201        return self
22202      }    });
22203
22204    $def(self, '$add?', function $Set_add$ques$19(o) {
22205      var self = this;
22206
22207      if ($truthy(self['$include?'](o))) {
22208        return nil
22209      } else {
22210        return self.$add(o)
22211      }
22212    });
22213
22214    $def(self, '$each', function $$each() {
22215      var block = $$each.$$p || nil, self = this;
22216
22217      $$each.$$p = null;
22218      if (!(block !== nil)) {
22219        return self.$enum_for("each")
22220      }      $send(self.hash, 'each_key', [], block.$to_proc());
22221      return self;
22222    });
22223
22224    $def(self, '$empty?', function $Set_empty$ques$20() {
22225      var self = this;
22226
22227      return self.hash['$empty?']()
22228    });
22229
22230    $def(self, '$eql?', function $Set_eql$ques$21(other) {
22231      var self = this;
22232
22233      return self.hash['$eql?']($send(other, 'instance_eval', [], function $$22(){var self = $$22.$$s == null ? this : $$22.$$s;
22234        if (self.hash == null) self.hash = nil;
22235
22236        return self.hash}, {$$s: self}))
22237    });
22238
22239    $def(self, '$clear', function $$clear() {
22240      var self = this;
22241
22242
22243      self.hash.$clear();
22244      return self;
22245    });
22246
22247    $def(self, '$include?', function $Set_include$ques$23(o) {
22248      var self = this;
22249
22250      return self.hash['$include?'](o)
22251    });
22252
22253    $def(self, '$merge', function $$merge(enum$) {
22254      var self = this;
22255
22256
22257      $send(enum$, 'each', [], function $$24(item){var self = $$24.$$s == null ? this : $$24.$$s;
22258
22259
22260        if (item == null) item = nil;
22261        return self.$add(item);}, {$$s: self});
22262      return self;
22263    });
22264
22265    $def(self, '$replace', function $$replace(enum$) {
22266      var self = this;
22267
22268
22269      self.$clear();
22270      self.$merge(enum$);
22271      return self;
22272    });
22273
22274    $def(self, '$size', function $$size() {
22275      var self = this;
22276
22277      return self.hash.$size()
22278    });
22279
22280    $def(self, '$subtract', function $$subtract(enum$) {
22281      var self = this;
22282
22283
22284      $send(enum$, 'each', [], function $$25(item){var self = $$25.$$s == null ? this : $$25.$$s;
22285
22286
22287        if (item == null) item = nil;
22288        return self.$delete(item);}, {$$s: self});
22289      return self;
22290    });
22291
22292    $def(self, '$|', function $Set_$$26(enum$) {
22293      var self = this;
22294
22295
22296      if (!$truthy(enum$['$respond_to?']("each"))) {
22297        $Kernel.$raise($$$('ArgumentError'), "value must be enumerable");
22298      }      return self.$dup().$merge(enum$);
22299    });
22300
22301    function is_set(set) {
22302      ($truthy(($ret_or_1 = (set)['$is_a?']($$$('Set')))) ? ($ret_or_1) : ($Kernel.$raise($$$('ArgumentError'), "value must be a set")));
22303    }
22304
22305    $def(self, '$superset?', function $Set_superset$ques$27(set) {
22306      var self = this;
22307
22308
22309      is_set(set);
22310      if ($truthy($rb_lt(self.$size(), set.$size()))) {
22311        return false
22312      }      return $send(set, 'all?', [], function $$28(o){var self = $$28.$$s == null ? this : $$28.$$s;
22313
22314
22315        if (o == null) o = nil;
22316        return self['$include?'](o);}, {$$s: self});
22317    });
22318
22319    $def(self, '$proper_superset?', function $Set_proper_superset$ques$29(set) {
22320      var self = this;
22321
22322
22323      is_set(set);
22324      if ($truthy($rb_le(self.$size(), set.$size()))) {
22325        return false
22326      }      return $send(set, 'all?', [], function $$30(o){var self = $$30.$$s == null ? this : $$30.$$s;
22327
22328
22329        if (o == null) o = nil;
22330        return self['$include?'](o);}, {$$s: self});
22331    });
22332
22333    $def(self, '$subset?', function $Set_subset$ques$31(set) {
22334      var self = this;
22335
22336
22337      is_set(set);
22338      if ($truthy($rb_lt(set.$size(), self.$size()))) {
22339        return false
22340      }      return $send(self, 'all?', [], function $$32(o){
22341
22342        if (o == null) o = nil;
22343        return set['$include?'](o);});
22344    });
22345
22346    $def(self, '$proper_subset?', function $Set_proper_subset$ques$33(set) {
22347      var self = this;
22348
22349
22350      is_set(set);
22351      if ($truthy($rb_le(set.$size(), self.$size()))) {
22352        return false
22353      }      return $send(self, 'all?', [], function $$34(o){
22354
22355        if (o == null) o = nil;
22356        return set['$include?'](o);});
22357    });
22358
22359    $def(self, '$intersect?', function $Set_intersect$ques$35(set) {
22360      var self = this;
22361
22362
22363      is_set(set);
22364      if ($truthy($rb_lt(self.$size(), set.$size()))) {
22365        return $send(self, 'any?', [], function $$36(o){
22366
22367          if (o == null) o = nil;
22368          return set['$include?'](o);})
22369      } else {
22370        return $send(set, 'any?', [], function $$37(o){var self = $$37.$$s == null ? this : $$37.$$s;
22371
22372
22373          if (o == null) o = nil;
22374          return self['$include?'](o);}, {$$s: self})
22375      }    });
22376
22377    $def(self, '$disjoint?', function $Set_disjoint$ques$38(set) {
22378      var self = this;
22379
22380      return self['$intersect?'](set)['$!']()
22381    });
22382
22383    $def(self, '$to_a', function $$to_a() {
22384      var self = this;
22385
22386      return self.hash.$keys()
22387    });
22388    $alias(self, "+", "|");
22389    $alias(self, "<", "proper_subset?");
22390    $alias(self, "<<", "add");
22391    $alias(self, "<=", "subset?");
22392    $alias(self, ">", "proper_superset?");
22393    $alias(self, ">=", "superset?");
22394    $alias(self, "difference", "-");
22395    $alias(self, "filter!", "select!");
22396    $alias(self, "length", "size");
22397    $alias(self, "map!", "collect!");
22398    $alias(self, "member?", "include?");
22399    return $alias(self, "union", "|");
22400  })('::', null, $nesting)
22401};
22402
22403Opal.modules["corelib/dir"] = function(Opal) {/* Generated by Opal 1.7.3 */
22404  var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $alias = Opal.alias, nil = Opal.nil, $$$ = Opal.$$$;
22405
22406  Opal.add_stubs('[],pwd');
22407  return (function($base, $super, $parent_nesting) {
22408    var self = $klass($base, $super, 'Dir');
22409
22410    return (function(self, $parent_nesting) {
22411
22412
22413
22414      $def(self, '$chdir', function $$chdir(dir) {
22415        var $yield = $$chdir.$$p || nil, prev_cwd = nil;
22416
22417        $$chdir.$$p = null;
22418        return (function() { try {
22419
22420        prev_cwd = Opal.current_dir;
22421        Opal.current_dir = dir;
22422        return Opal.yieldX($yield, []);;
22423        } finally {
22424          Opal.current_dir = prev_cwd;
22425        } })()
22426      });
22427
22428      $def(self, '$pwd', function $$pwd() {
22429
22430        return Opal.current_dir || '.';
22431      });
22432
22433      $def(self, '$home', function $$home() {
22434        var $ret_or_1 = nil;
22435
22436        if ($truthy(($ret_or_1 = $$$('ENV')['$[]']("HOME")))) {
22437          return $ret_or_1
22438        } else {
22439          return "."
22440        }
22441      });
22442      return $alias(self, "getwd", "pwd");
22443    })(Opal.get_singleton_class(self))
22444  })('::', null)
22445};
22446
22447Opal.modules["corelib/file"] = function(Opal) {/* Generated by Opal 1.7.3 */
22448  var $truthy = Opal.truthy, $klass = Opal.klass, $const_set = Opal.const_set, $Opal = Opal.Opal, $regexp = Opal.regexp, $rb_plus = Opal.rb_plus, $def = Opal.def, $Kernel = Opal.Kernel, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_minus = Opal.rb_minus, $range = Opal.range, $send = Opal.send, $slice = Opal.slice, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
22449
22450  Opal.add_stubs('respond_to?,to_path,coerce_to!,pwd,split,sub,+,unshift,join,home,raise,start_with?,absolute_path,==,<,dirname,-,basename,empty?,rindex,[],length,nil?,gsub,find,=~,map,each_with_index,flatten,reject,to_proc,end_with?,expand_path,exist?');
22451  return (function($base, $super, $parent_nesting) {
22452    var self = $klass($base, $super, 'File');
22453
22454    var $nesting = [self].concat($parent_nesting), windows_root_rx = nil;
22455
22456
22457    $const_set($nesting[0], 'Separator', $const_set($nesting[0], 'SEPARATOR', "/"));
22458    $const_set($nesting[0], 'ALT_SEPARATOR', nil);
22459    $const_set($nesting[0], 'PATH_SEPARATOR', ":");
22460    $const_set($nesting[0], 'FNM_SYSCASE', 0);
22461    windows_root_rx = /^[a-zA-Z]:(?:\\|\/)/;
22462    return (function(self, $parent_nesting) {
22463      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
22464
22465
22466
22467      $def(self, '$absolute_path', function $$absolute_path(path, basedir) {
22468        var sep = nil, sep_chars = nil, new_parts = nil, $ret_or_1 = nil, path_abs = nil, basedir_abs = nil, parts = nil, leading_sep = nil, abs = nil, new_path = nil;
22469
22470
22471        if (basedir == null) basedir = nil;
22472        sep = $$('SEPARATOR');
22473        sep_chars = $sep_chars();
22474        new_parts = [];
22475        path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path));
22476        path = $Opal['$coerce_to!'](path, $$$('String'), "to_str");
22477        basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$$('Dir').$pwd()));
22478        path_abs = path.substr(0, sep.length) === sep || windows_root_rx.test(path);
22479        basedir_abs = basedir.substr(0, sep.length) === sep || windows_root_rx.test(basedir);
22480        if ($truthy(path_abs)) {
22481
22482          parts = path.$split($regexp(["[", sep_chars, "]"]));
22483          leading_sep = windows_root_rx.test(path) ? '' : path.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
22484          abs = true;
22485        } else {
22486
22487          parts = $rb_plus(basedir.$split($regexp(["[", sep_chars, "]"])), path.$split($regexp(["[", sep_chars, "]"])));
22488          leading_sep = windows_root_rx.test(basedir) ? '' : basedir.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
22489          abs = basedir_abs;
22490        }
22491        var part;
22492        for (var i = 0, ii = parts.length; i < ii; i++) {
22493          part = parts[i];
22494
22495          if (
22496            (part === nil) ||
22497            (part === ''  && ((new_parts.length === 0) || abs)) ||
22498            (part === '.' && ((new_parts.length === 0) || abs))
22499          ) {
22500            continue;
22501          }
22502          if (part === '..') {
22503            new_parts.pop();
22504          } else {
22505            new_parts.push(part);
22506          }
22507        }
22508
22509        if (!abs && parts[0] !== '.') {
22510          new_parts.$unshift(".");
22511        }
22512        new_path = new_parts.$join(sep);
22513        if ($truthy(abs)) {
22514          new_path = $rb_plus(leading_sep, new_path);
22515        }        return new_path;
22516      }, -2);
22517
22518      $def(self, '$expand_path', function $$expand_path(path, basedir) {
22519        var self = this, sep = nil, sep_chars = nil, home = nil, leading_sep = nil, home_path_regexp = nil;
22520
22521
22522        if (basedir == null) basedir = nil;
22523        sep = $$('SEPARATOR');
22524        sep_chars = $sep_chars();
22525        if ($truthy(path[0] === '~' || (basedir && basedir[0] === '~'))) {
22526
22527          home = $$('Dir').$home();
22528          if (!$truthy(home)) {
22529            $Kernel.$raise($$$('ArgumentError'), "couldn't find HOME environment -- expanding `~'");
22530          }          leading_sep = windows_root_rx.test(home) ? '' : home.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
22531          if (!$truthy(home['$start_with?'](leading_sep))) {
22532            $Kernel.$raise($$$('ArgumentError'), "non-absolute home");
22533          }          home = $rb_plus(home, sep);
22534          home_path_regexp = $regexp(["^\\~(?:", sep, "|$)"]);
22535          path = path.$sub(home_path_regexp, home);
22536          if ($truthy(basedir)) {
22537            basedir = basedir.$sub(home_path_regexp, home);
22538          }        }        return self.$absolute_path(path, basedir);
22539      }, -2);
22540
22541      // Coerce a given path to a path string using #to_path and #to_str
22542      function $coerce_to_path(path) {
22543        if ($truthy((path)['$respond_to?']("to_path"))) {
22544          path = path.$to_path();
22545        }
22546
22547        path = $Opal['$coerce_to!'](path, $$$('String'), "to_str");
22548
22549        return path;
22550      }
22551
22552      // Return a RegExp compatible char class
22553      function $sep_chars() {
22554        if ($$('ALT_SEPARATOR') === nil) {
22555          return Opal.escape_regexp($$('SEPARATOR'));
22556        } else {
22557          return Opal.escape_regexp($rb_plus($$('SEPARATOR'), $$('ALT_SEPARATOR')));
22558        }
22559      }
22560
22561      $def(self, '$dirname', function $$dirname(path, level) {
22562        var self = this, sep_chars = nil;
22563
22564
22565        if (level == null) level = 1;
22566        if ($eqeq(level, 0)) {
22567          return path
22568        }        if ($truthy($rb_lt(level, 0))) {
22569          $Kernel.$raise($$$('ArgumentError'), "level can't be negative");
22570        }        sep_chars = $sep_chars();
22571        path = $coerce_to_path(path);
22572
22573        var absolute = path.match(new RegExp("^[" + (sep_chars) + "]")), out;
22574
22575        path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove trailing separators
22576        path = path.replace(new RegExp("[^" + (sep_chars) + "]+$"), ''); // remove trailing basename
22577        path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove final trailing separators
22578
22579        if (path === '') {
22580          out = absolute ? '/' : '.';
22581        }
22582        else {
22583          out = path;
22584        }
22585
22586        if (level == 1) {
22587          return out;
22588        }
22589        else {
22590          return self.$dirname(out, $rb_minus(level, 1))
22591        }
22592      }, -2);
22593
22594      $def(self, '$basename', function $$basename(name, suffix) {
22595        var sep_chars = nil;
22596
22597
22598        if (suffix == null) suffix = nil;
22599        sep_chars = $sep_chars();
22600        name = $coerce_to_path(name);
22601
22602        if (name.length == 0) {
22603          return name;
22604        }
22605
22606        if (suffix !== nil) {
22607          suffix = $Opal['$coerce_to!'](suffix, $$$('String'), "to_str");
22608        } else {
22609          suffix = null;
22610        }
22611
22612        name = name.replace(new RegExp("(.)[" + (sep_chars) + "]*$"), '$1');
22613        name = name.replace(new RegExp("^(?:.*[" + (sep_chars) + "])?([^" + (sep_chars) + "]+)$"), '$1');
22614
22615        if (suffix === ".*") {
22616          name = name.replace(/\.[^\.]+$/, '');
22617        } else if(suffix !== null) {
22618          suffix = Opal.escape_regexp(suffix);
22619          name = name.replace(new RegExp("" + (suffix) + "$"), '');
22620        }
22621
22622        return name;
22623      }, -2);
22624
22625      $def(self, '$extname', function $$extname(path) {
22626        var self = this, filename = nil, last_dot_idx = nil;
22627
22628
22629        path = $coerce_to_path(path);
22630        filename = self.$basename(path);
22631        if ($truthy(filename['$empty?']())) {
22632          return ""
22633        }        last_dot_idx = filename['$[]']($range(1, -1, false)).$rindex(".");
22634        if (($truthy(last_dot_idx['$nil?']()) || ($eqeq($rb_plus(last_dot_idx, 1), $rb_minus(filename.$length(), 1))))) {
22635          return ""
22636        } else {
22637          return filename['$[]'](Opal.Range.$new($rb_plus(last_dot_idx, 1), -1, false))
22638        }      });
22639
22640      $def(self, '$exist?', function $exist$ques$1(path) {
22641
22642        return Opal.modules[path] != null
22643      });
22644
22645      $def(self, '$directory?', function $directory$ques$2(path) {
22646        var files = nil;
22647
22648
22649        files = [];
22650
22651        for (var key in Opal.modules) {
22652          files.push(key);
22653        }
22654        path = path.$gsub($regexp(["(^.", $$('SEPARATOR'), "+|", $$('SEPARATOR'), "+$)"]));
22655        return $send(files, 'find', [], function $$3(f){
22656
22657          if (f == null) f = nil;
22658          return f['$=~']($regexp(["^", path]));});
22659      });
22660
22661      $def(self, '$join', function $$join($a) {
22662        var $post_args, paths, result = nil;
22663
22664
22665        $post_args = $slice(arguments);
22666        paths = $post_args;
22667        if ($truthy(paths['$empty?']())) {
22668          return ""
22669        }        result = "";
22670        paths = $send(paths.$flatten().$each_with_index(), 'map', [], function $$4(item, index){
22671
22672          if (item == null) item = nil;
22673          if (index == null) index = nil;
22674          if (($eqeq(index, 0) && ($truthy(item['$empty?']())))) {
22675            return $$('SEPARATOR')
22676          } else if (($eqeq(paths.$length(), $rb_plus(index, 1)) && ($truthy(item['$empty?']())))) {
22677            return $$('SEPARATOR')
22678          } else {
22679            return item
22680          }});
22681        paths = $send(paths, 'reject', [], "empty?".$to_proc());
22682        $send(paths, 'each_with_index', [], function $$5(item, index){var next_item = nil;
22683
22684
22685          if (item == null) item = nil;
22686          if (index == null) index = nil;
22687          next_item = paths['$[]']($rb_plus(index, 1));
22688          if ($truthy(next_item['$nil?']())) {
22689            return (result = "" + (result) + (item))
22690          } else {
22691
22692            if (($truthy(item['$end_with?']($$('SEPARATOR'))) && ($truthy(next_item['$start_with?']($$('SEPARATOR')))))) {
22693              item = item.$sub($regexp([$$('SEPARATOR'), "+$"]), "");
22694            }            return (result = (($truthy(item['$end_with?']($$('SEPARATOR'))) || ($truthy(next_item['$start_with?']($$('SEPARATOR'))))) ? ("" + (result) + (item)) : ("" + (result) + (item) + ($$('SEPARATOR')))));
22695          }});
22696        return result;
22697      }, -1);
22698
22699      $def(self, '$split', function $$split(path) {
22700
22701        return path.$split($$('SEPARATOR'))
22702      });
22703      $alias(self, "realpath", "expand_path");
22704      return $alias(self, "exists?", "exist?");
22705    })(Opal.get_singleton_class(self), $nesting);
22706  })('::', $$$('IO'), $nesting)
22707};
22708
22709Opal.modules["corelib/process/base"] = function(Opal) {/* Generated by Opal 1.7.3 */
22710  var $klass = Opal.klass, $slice = Opal.slice, $defs = Opal.defs, $return_val = Opal.return_val, nil = Opal.nil;
22711
22712
22713  (function($base, $super) {
22714    var self = $klass($base, $super, 'Signal');
22715
22716
22717    return $defs(self, '$trap', function $$trap($a) {
22718
22719
22720      $slice(arguments);
22721      return nil;
22722    }, -1)
22723  })('::', null);
22724  return (function($base, $super) {
22725    var self = $klass($base, $super, 'GC');
22726
22727
22728    return $defs(self, '$start', $return_val(nil))
22729  })('::', null);
22730};
22731
22732Opal.modules["corelib/process"] = function(Opal) {/* Generated by Opal 1.7.3 */
22733  var $module = Opal.module, $defs = Opal.defs, $truthy = Opal.truthy, $return_val = Opal.return_val, $Kernel = Opal.Kernel, nil = Opal.nil, $$$ = Opal.$$$;
22734
22735  Opal.add_stubs('const_set,size,<<,__register_clock__,to_f,now,new,[],raise');
22736  return (function($base) {
22737    var self = $module($base, 'Process');
22738
22739    var monotonic = nil;
22740
22741
22742    self.__clocks__ = [];
22743    $defs(self, '$__register_clock__', function $$__register_clock__(name, func) {
22744      var self = this;
22745      if (self.__clocks__ == null) self.__clocks__ = nil;
22746
22747
22748      self.$const_set(name, self.__clocks__.$size());
22749      return self.__clocks__['$<<'](func);
22750    });
22751    self.$__register_clock__("CLOCK_REALTIME", function() { return Date.now() });
22752    monotonic = false;
22753
22754    if (Opal.global.performance) {
22755      monotonic = function() {
22756        return performance.now()
22757      };
22758    }
22759    else if (Opal.global.process && process.hrtime) {
22760      // let now be the base to get smaller numbers
22761      var hrtime_base = process.hrtime();
22762
22763      monotonic = function() {
22764        var hrtime = process.hrtime(hrtime_base);
22765        var us = (hrtime[1] / 1000) | 0; // cut below microsecs;
22766        return ((hrtime[0] * 1000) + (us / 1000));
22767      };
22768    }
22769    if ($truthy(monotonic)) {
22770      self.$__register_clock__("CLOCK_MONOTONIC", monotonic);
22771    }    $defs(self, '$pid', $return_val(0));
22772    $defs(self, '$times', function $$times() {
22773      var t = nil;
22774
22775
22776      t = $$$('Time').$now().$to_f();
22777      return $$$($$$('Benchmark'), 'Tms').$new(t, t, t, t, t);
22778    });
22779    return $defs(self, '$clock_gettime', function $$clock_gettime(clock_id, unit) {
22780      var self = this, clock = nil;
22781      if (self.__clocks__ == null) self.__clocks__ = nil;
22782
22783
22784      if (unit == null) unit = "float_second";
22785      if ($truthy(((clock = self.__clocks__['$[]'](clock_id))))) ; else {
22786        $Kernel.$raise($$$($$$('Errno'), 'EINVAL'), "clock_gettime(" + (clock_id) + ") " + (self.__clocks__['$[]'](clock_id)));
22787      }
22788      var ms = clock();
22789      switch (unit) {
22790        case 'float_second':      return  (ms / 1000);         // number of seconds as a float (default)
22791        case 'float_millisecond': return  (ms / 1);            // number of milliseconds as a float
22792        case 'float_microsecond': return  (ms * 1000);         // number of microseconds as a float
22793        case 'second':            return ((ms / 1000)    | 0); // number of seconds as an integer
22794        case 'millisecond':       return ((ms / 1)       | 0); // number of milliseconds as an integer
22795        case 'microsecond':       return ((ms * 1000)    | 0); // number of microseconds as an integer
22796        case 'nanosecond':        return ((ms * 1000000) | 0); // number of nanoseconds as an integer
22797        default: $Kernel.$raise($$$('ArgumentError'), "unexpected unit: " + (unit));
22798      }
22799    }, -2);
22800  })('::')
22801};
22802
22803Opal.modules["corelib/random/formatter"] = function(Opal) {/* Generated by Opal 1.7.3 */
22804  var $klass = Opal.klass, $module = Opal.module, $def = Opal.def, $range = Opal.range, $send = Opal.send, $rb_divide = Opal.rb_divide, $Kernel = Opal.Kernel, $Opal = Opal.Opal, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
22805
22806  Opal.add_stubs('_verify_count,bytes,encode,strict_encode64,random_bytes,urlsafe_encode64,split,hex,[]=,[],map,to_proc,join,times,<<,|,ord,/,abs,random_float,raise,coerce_to!,flatten,new,random_number,length,include,extend');
22807  return (function($base, $super, $parent_nesting) {
22808    var self = $klass($base, $super, 'Random');
22809
22810    var $nesting = [self].concat($parent_nesting);
22811
22812
22813    (function($base, $parent_nesting) {
22814      var self = $module($base, 'Formatter');
22815
22816      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
22817
22818
22819
22820      $def(self, '$hex', function $$hex(count) {
22821        var self = this;
22822
22823
22824        if (count == null) count = nil;
22825        count = $$$('Random').$_verify_count(count);
22826
22827        var bytes = self.$bytes(count);
22828        var out = "";
22829        for (var i = 0; i < count; i++) {
22830          out += bytes.charCodeAt(i).toString(16).padStart(2, '0');
22831        }
22832        return (out).$encode("US-ASCII");
22833      }, -1);
22834
22835      $def(self, '$random_bytes', function $$random_bytes(count) {
22836        var self = this;
22837
22838
22839        if (count == null) count = nil;
22840        return self.$bytes(count);
22841      }, -1);
22842
22843      $def(self, '$base64', function $$base64(count) {
22844        var self = this;
22845
22846
22847        if (count == null) count = nil;
22848        return $$$('Base64').$strict_encode64(self.$random_bytes(count)).$encode("US-ASCII");
22849      }, -1);
22850
22851      $def(self, '$urlsafe_base64', function $$urlsafe_base64(count, padding) {
22852        var self = this;
22853
22854
22855        if (count == null) count = nil;
22856        if (padding == null) padding = false;
22857        return $$$('Base64').$urlsafe_encode64(self.$random_bytes(count), padding).$encode("US-ASCII");
22858      }, -1);
22859
22860      $def(self, '$uuid', function $$uuid() {
22861        var self = this, str = nil;
22862
22863
22864        str = self.$hex(16).$split("");
22865        str['$[]='](12, "4");
22866        str['$[]='](16, (parseInt(str['$[]'](16), 16) & 3 | 8).toString(16));
22867        str = [str['$[]']($range(0, 8, true)), str['$[]']($range(8, 12, true)), str['$[]']($range(12, 16, true)), str['$[]']($range(16, 20, true)), str['$[]']($range(20, 32, true))];
22868        str = $send(str, 'map', [], "join".$to_proc());
22869        return str.$join("-");
22870      });
22871
22872      $def(self, '$random_float', function $$random_float() {
22873        var self = this, bs = nil, num = nil;
22874
22875
22876        bs = self.$bytes(4);
22877        num = 0;
22878        $send((4), 'times', [], function $$1(i){
22879
22880          if (i == null) i = nil;
22881          num = num['$<<'](8);
22882          return (num = num['$|'](bs['$[]'](i).$ord()));});
22883        return $rb_divide(num.$abs(), 2147483647);
22884      });
22885
22886      $def(self, '$random_number', function $$random_number(limit) {
22887        var self = this;
22888
22889        function randomFloat() {
22890          return self.$random_float();
22891        }
22892
22893        function randomInt(max) {
22894          return Math.floor(randomFloat() * max);
22895        }
22896
22897        function randomRange() {
22898          var min = limit.begin,
22899              max = limit.end;
22900
22901          if (min === nil || max === nil) {
22902            return nil;
22903          }
22904
22905          var length = max - min;
22906
22907          if (length < 0) {
22908            return nil;
22909          }
22910
22911          if (length === 0) {
22912            return min;
22913          }
22914
22915          if (max % 1 === 0 && min % 1 === 0 && !limit.excl) {
22916            length++;
22917          }
22918
22919          return randomInt(length) + min;
22920        }
22921
22922        if (limit == null) {
22923          return randomFloat();
22924        } else if (limit.$$is_range) {
22925          return randomRange();
22926        } else if (limit.$$is_number) {
22927          if (limit <= 0) {
22928            $Kernel.$raise($$$('ArgumentError'), "invalid argument - " + (limit));
22929          }
22930
22931          if (limit % 1 === 0) {
22932            // integer
22933            return randomInt(limit);
22934          } else {
22935            return randomFloat() * limit;
22936          }
22937        } else {
22938          limit = $Opal['$coerce_to!'](limit, $$$('Integer'), "to_int");
22939
22940          if (limit <= 0) {
22941            $Kernel.$raise($$$('ArgumentError'), "invalid argument - " + (limit));
22942          }
22943
22944          return randomInt(limit);
22945        }
22946      }, -1);
22947      return $def(self, '$alphanumeric', function $$alphanumeric(count) {
22948        var self = this, map = nil;
22949
22950
22951        if (count == null) count = nil;
22952        count = $$('Random').$_verify_count(count);
22953        map = $send([$range("0", "9", false), $range("a", "z", false), $range("A", "Z", false)], 'map', [], "to_a".$to_proc()).$flatten();
22954        return $send($$$('Array'), 'new', [count], function $$2(i){var self = $$2.$$s == null ? this : $$2.$$s;
22955          return map['$[]'](self.$random_number(map.$length()));}, {$$s: self}).$join();
22956      }, -1);
22957    })(self, $nesting);
22958    self.$include($$$($$$('Random'), 'Formatter'));
22959    return self.$extend($$$($$$('Random'), 'Formatter'));
22960  })('::', null, $nesting)
22961};
22962
22963Opal.modules["corelib/random/mersenne_twister"] = function(Opal) {/* Generated by Opal 1.7.3 */
22964  var $klass = Opal.klass, $const_set = Opal.const_set, $send = Opal.send, nil = Opal.nil, $$$ = Opal.$$$, mersenne_twister = nil;
22965
22966  Opal.add_stubs('generator=');
22967
22968  mersenne_twister = (function() {
22969  /* Period parameters */
22970  var N = 624;
22971  var M = 397;
22972  var MATRIX_A = 0x9908b0df;      /* constant vector a */
22973  var UMASK = 0x80000000;         /* most significant w-r bits */
22974  var LMASK = 0x7fffffff;         /* least significant r bits */
22975  var MIXBITS = function(u,v) { return ( ((u) & UMASK) | ((v) & LMASK) ); };
22976  var TWIST = function(u,v) { return (MIXBITS((u),(v)) >>> 1) ^ ((v & 0x1) ? MATRIX_A : 0x0); };
22977
22978  function init(s) {
22979    var mt = {left: 0, next: N, state: new Array(N)};
22980    init_genrand(mt, s);
22981    return mt;
22982  }
22983
22984  /* initializes mt[N] with a seed */
22985  function init_genrand(mt, s) {
22986    var j;
22987    mt.state[0] = s >>> 0;
22988    for (j=1; j<N; j++) {
22989      mt.state[j] = (1812433253 * ((mt.state[j-1] ^ (mt.state[j-1] >> 30) >>> 0)) + j);
22990      /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
22991      /* In the previous versions, MSBs of the seed affect   */
22992      /* only MSBs of the array state[].                     */
22993      /* 2002/01/09 modified by Makoto Matsumoto             */
22994      mt.state[j] &= 0xffffffff;  /* for >32 bit machines */
22995    }
22996    mt.left = 1;
22997    mt.next = N;
22998  }
22999
23000  /* generate N words at one time */
23001  function next_state(mt) {
23002    var p = 0, _p = mt.state;
23003    var j;
23004
23005    mt.left = N;
23006    mt.next = 0;
23007
23008    for (j=N-M+1; --j; p++)
23009      _p[p] = _p[p+(M)] ^ TWIST(_p[p+(0)], _p[p+(1)]);
23010
23011    for (j=M; --j; p++)
23012      _p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[p+(1)]);
23013
23014    _p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[0]);
23015  }
23016
23017  /* generates a random number on [0,0xffffffff]-interval */
23018  function genrand_int32(mt) {
23019    /* mt must be initialized */
23020    var y;
23021
23022    if (--mt.left <= 0) next_state(mt);
23023    y = mt.state[mt.next++];
23024
23025    /* Tempering */
23026    y ^= (y >>> 11);
23027    y ^= (y << 7) & 0x9d2c5680;
23028    y ^= (y << 15) & 0xefc60000;
23029    y ^= (y >>> 18);
23030
23031    return y >>> 0;
23032  }
23033
23034  function int_pair_to_real_exclusive(a, b) {
23035    a >>>= 5;
23036    b >>>= 6;
23037    return (a*67108864.0+b)*(1.0/9007199254740992.0);
23038  }
23039
23040  // generates a random number on [0,1) with 53-bit resolution
23041  function genrand_real(mt) {
23042    /* mt must be initialized */
23043    var a = genrand_int32(mt), b = genrand_int32(mt);
23044    return int_pair_to_real_exclusive(a, b);
23045  }
23046
23047  return { genrand_real: genrand_real, init: init };
23048})();
23049  return (function($base, $super) {
23050    var self = $klass($base, $super, 'Random');
23051
23052    var $a;
23053
23054
23055    var MAX_INT = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
23056    $const_set(self, 'MERSENNE_TWISTER_GENERATOR', {
23057    new_seed: function() { return Math.round(Math.random() * MAX_INT); },
23058    reseed: function(seed) { return mersenne_twister.init(seed); },
23059    rand: function(mt) { return mersenne_twister.genrand_real(mt); }
23060  });
23061    return ($a = [$$$(self, 'MERSENNE_TWISTER_GENERATOR')], $send(self, 'generator=', $a), $a[$a.length - 1]);
23062  })('::', null);
23063};
23064
23065Opal.modules["corelib/random"] = function(Opal) {/* Generated by Opal 1.7.3 */
23066  var $truthy = Opal.truthy, $klass = Opal.klass, $Kernel = Opal.Kernel, $defs = Opal.defs, $Opal = Opal.Opal, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $send = Opal.send, self = Opal.top, nil = Opal.nil, $$$ = Opal.$$$;
23067
23068  Opal.add_stubs('require,attr_reader,to_int,raise,new_seed,coerce_to!,reseed,rand,seed,bytes,===,==,state,_verify_count,encode,join,new,chr,random_number,random_float,const_defined?,const_set');
23069
23070  self.$require("corelib/random/formatter");
23071  (function($base, $super) {
23072    var self = $klass($base, $super, 'Random');
23073
23074
23075
23076    self.$attr_reader("seed", "state");
23077    $defs(self, '$_verify_count', function $$_verify_count(count) {
23078
23079
23080      if (!$truthy(count)) count = 16;
23081      if (typeof count !== "number") count = (count).$to_int();
23082      if (count < 0) $Kernel.$raise($$$('ArgumentError'), "negative string size (or size too big)");
23083      count = Math.floor(count);
23084      return count;
23085
23086    });
23087
23088    $def(self, '$initialize', function $$initialize(seed) {
23089      var self = this;
23090
23091
23092      if (seed == null) seed = $$$('Random').$new_seed();
23093      seed = $Opal['$coerce_to!'](seed, $$$('Integer'), "to_int");
23094      self.state = seed;
23095      return self.$reseed(seed);
23096    }, -1);
23097
23098    $def(self, '$reseed', function $$reseed(seed) {
23099      var self = this;
23100
23101
23102      self.seed = seed;
23103      return self.$rng = Opal.$$rand.reseed(seed);    });
23104    $defs(self, '$new_seed', function $$new_seed() {
23105
23106      return Opal.$$rand.new_seed();
23107    });
23108    $defs(self, '$rand', function $$rand(limit) {
23109      var self = this;
23110      return $$$(self, 'DEFAULT').$rand(limit);
23111    }, -1);
23112    $defs(self, '$srand', function $$srand(n) {
23113      var self = this, previous_seed = nil;
23114
23115
23116      if (n == null) n = $$$('Random').$new_seed();
23117      n = $Opal['$coerce_to!'](n, $$$('Integer'), "to_int");
23118      previous_seed = $$$(self, 'DEFAULT').$seed();
23119      $$$(self, 'DEFAULT').$reseed(n);
23120      return previous_seed;
23121    }, -1);
23122    $defs(self, '$urandom', function $$urandom(size) {
23123
23124      return $$$('SecureRandom').$bytes(size)
23125    });
23126
23127    $def(self, '$==', function $Random_$eq_eq$1(other) {
23128      var self = this, $ret_or_1 = nil;
23129
23130
23131      if (!$eqeqeq($$$('Random'), other)) {
23132        return false
23133      }      if ($truthy(($ret_or_1 = self.$seed()['$=='](other.$seed())))) {
23134        return self.$state()['$=='](other.$state())
23135      } else {
23136        return $ret_or_1
23137      }    });
23138
23139    $def(self, '$bytes', function $$bytes(length) {
23140      var self = this;
23141
23142
23143      length = $$$('Random').$_verify_count(length);
23144      return $send($$$('Array'), 'new', [length], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s;
23145
23146        return self.$rand(255).$chr()}, {$$s: self}).$join().$encode("ASCII-8BIT");
23147    });
23148    $defs(self, '$bytes', function $$bytes(length) {
23149      var self = this;
23150
23151      return $$$(self, 'DEFAULT').$bytes(length)
23152    });
23153
23154    $def(self, '$rand', function $$rand(limit) {
23155      var self = this;
23156      return self.$random_number(limit);
23157    }, -1);
23158
23159    $def(self, '$random_float', function $$random_float() {
23160      var self = this;
23161
23162
23163      self.state++;
23164      return Opal.$$rand.rand(self.$rng);
23165
23166    });
23167    $defs(self, '$random_float', function $$random_float() {
23168      var self = this;
23169
23170      return $$$(self, 'DEFAULT').$random_float()
23171    });
23172    return $defs(self, '$generator=', function $Random_generator$eq$3(generator) {
23173      var self = this;
23174
23175
23176      Opal.$$rand = generator;
23177      if ($truthy(self['$const_defined?']("DEFAULT"))) {
23178        return $$$(self, 'DEFAULT').$reseed()
23179      } else {
23180        return self.$const_set("DEFAULT", self.$new(self.$new_seed()))
23181      }    });
23182  })('::', null);
23183  return self.$require("corelib/random/mersenne_twister");
23184};
23185
23186Opal.modules["corelib/unsupported"] = function(Opal) {/* Generated by Opal 1.7.3 */
23187  var $Kernel = Opal.Kernel, $klass = Opal.klass, $send = Opal.send, $slice = Opal.slice, $module = Opal.module, $def = Opal.def, $return_val = Opal.return_val, $alias = Opal.alias, $defs = Opal.defs, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
23188
23189  Opal.add_stubs('raise,warn,each,define_method,%,public,private_method_defined?,private_class_method,instance_method,instance_methods,method_defined?,private_methods');
23190
23191
23192  var warnings = {};
23193
23194  function handle_unsupported_feature(message) {
23195    switch (Opal.config.unsupported_features_severity) {
23196    case 'error':
23197      $Kernel.$raise($$$('NotImplementedError'), message);
23198      break;
23199    case 'warning':
23200      warn(message);
23201      break;
23202      // noop
23203    }
23204  }
23205
23206  function warn(string) {
23207    if (warnings[string]) {
23208      return;
23209    }
23210
23211    warnings[string] = true;
23212    self.$warn(string);
23213  }
23214  (function($base, $super) {
23215    var self = $klass($base, $super, 'String');
23216
23217
23218
23219    var ERROR = "String#%s not supported. Mutable String methods are not supported in Opal.";
23220    return $send(["<<", "capitalize!", "chomp!", "chop!", "downcase!", "gsub!", "lstrip!", "next!", "reverse!", "slice!", "squeeze!", "strip!", "sub!", "succ!", "swapcase!", "tr!", "tr_s!", "upcase!", "prepend", "[]=", "clear", "encode!", "unicode_normalize!"], 'each', [], function $String$1(method_name){var self = $String$1.$$s == null ? this : $String$1.$$s;
23221
23222
23223      if (method_name == null) method_name = nil;
23224      return $send(self, 'define_method', [method_name], function $$2($a){
23225
23226        $slice(arguments);
23227        return $Kernel.$raise($$$('NotImplementedError'), (ERROR)['$%'](method_name));}, -1);}, {$$s: self});
23228  })('::', null);
23229  (function($base) {
23230    var self = $module($base, 'Kernel');
23231
23232
23233
23234    var ERROR = "Object tainting is not supported by Opal";
23235
23236    $def(self, '$taint', function $$taint() {
23237      var self = this;
23238
23239
23240      handle_unsupported_feature(ERROR);
23241      return self;
23242    });
23243
23244    $def(self, '$untaint', function $$untaint() {
23245      var self = this;
23246
23247
23248      handle_unsupported_feature(ERROR);
23249      return self;
23250    });
23251    return $def(self, '$tainted?', function $Kernel_tainted$ques$3() {
23252
23253
23254      handle_unsupported_feature(ERROR);
23255      return false;
23256    });
23257  })('::');
23258  (function($base, $super) {
23259    var self = $klass($base, $super, 'Module');
23260
23261
23262
23263
23264    $def(self, '$public', function $Module_public$4($a) {
23265      var $post_args, methods, self = this;
23266
23267
23268      $post_args = $slice(arguments);
23269      methods = $post_args;
23270
23271      if (methods.length === 0) {
23272        self.$$module_function = false;
23273        return nil;
23274      }
23275      return (methods.length === 1) ? methods[0] : methods;
23276    }, -1);
23277
23278    $def(self, '$private_class_method', function $$private_class_method($a) {
23279      var $post_args, methods;
23280
23281
23282      $post_args = $slice(arguments);
23283      methods = $post_args;
23284      return (methods.length === 1) ? methods[0] : methods;    }, -1);
23285
23286    $def(self, '$private_method_defined?', $return_val(false));
23287
23288    $def(self, '$private_constant', function $$private_constant($a) {
23289
23290
23291      $slice(arguments);
23292      return nil;
23293    }, -1);
23294    $alias(self, "nesting", "public");
23295    $alias(self, "private", "public");
23296    $alias(self, "protected", "public");
23297    $alias(self, "protected_method_defined?", "private_method_defined?");
23298    $alias(self, "public_class_method", "private_class_method");
23299    $alias(self, "public_instance_method", "instance_method");
23300    $alias(self, "public_instance_methods", "instance_methods");
23301    return $alias(self, "public_method_defined?", "method_defined?");
23302  })('::', null);
23303  (function($base) {
23304    var self = $module($base, 'Kernel');
23305
23306
23307
23308
23309    $def(self, '$private_methods', function $$private_methods($a) {
23310
23311
23312      $slice(arguments);
23313      return [];
23314    }, -1);
23315    $alias(self, "protected_methods", "private_methods");
23316    $alias(self, "private_instance_methods", "private_methods");
23317    return $alias(self, "protected_instance_methods", "private_methods");
23318  })('::');
23319  (function($base, $parent_nesting) {
23320    var self = $module($base, 'Kernel');
23321
23322    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
23323
23324    return $def(self, '$eval', function $Kernel_eval$5($a) {
23325
23326
23327      $slice(arguments);
23328      return $Kernel.$raise($$$('NotImplementedError'), "To use Kernel#eval, you must first require 'opal-parser'. " + ("See https://github.com/opal/opal/blob/" + ($$('RUBY_ENGINE_VERSION')) + "/docs/opal_parser.md for details."));
23329    }, -1)
23330  })('::', $nesting);
23331  $defs(self, '$public', function $public$6($a) {
23332    var $post_args, methods;
23333
23334
23335    $post_args = $slice(arguments);
23336    methods = $post_args;
23337    return (methods.length === 1) ? methods[0] : methods;  }, -1);
23338  return $defs(self, '$private', function $private$7($a) {
23339    var $post_args, methods;
23340
23341
23342    $post_args = $slice(arguments);
23343    methods = $post_args;
23344    return (methods.length === 1) ? methods[0] : methods;  }, -1);
23345};
23346
23347Opal.queue(function(Opal) {/* Generated by Opal 1.7.3 */
23348  var $Object = Opal.Object; Opal.nil;
23349
23350  Opal.add_stubs('require,autoload');
23351
23352  $Object.$require("opal/base");
23353  $Object.$require("opal/mini");
23354  $Object.$require("corelib/kernel/format");
23355  $Object.$require("corelib/string/encoding");
23356  $Object.$autoload("Math", "corelib/math");
23357  $Object.$require("corelib/complex/base");
23358  $Object.$autoload("Complex", "corelib/complex");
23359  $Object.$require("corelib/rational/base");
23360  $Object.$autoload("Rational", "corelib/rational");
23361  $Object.$require("corelib/time");
23362  $Object.$autoload("Struct", "corelib/struct");
23363  $Object.$autoload("Set", "corelib/set");
23364  $Object.$autoload("Dir", "corelib/dir");
23365  $Object.$autoload("File", "corelib/file");
23366  $Object.$require("corelib/process/base");
23367  $Object.$autoload("Process", "corelib/process");
23368  $Object.$autoload("Random", "corelib/random");
23369  return $Object.$require("corelib/unsupported");
23370});
23371
23372
23373var Opal$1 = Opal;
23374
23375Opal.modules["nodejs/base"] = function(Opal) {/* Generated by Opal 1.7.3 */
23376  var $module = Opal.module, $const_set = Opal.const_set, $eqeq = Opal.eqeq, $lambda = Opal.lambda, $send = Opal.send, $a, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil;
23377
23378  Opal.add_stubs('==,first,shift,write_proc=,read_proc=,tty=');
23379
23380  (function($base, $parent_nesting) {
23381    var self = $module($base, 'NodeJS');
23382
23383    var $nesting = [self].concat($parent_nesting);
23384
23385    return $const_set($nesting[0], 'VERSION', process.version)
23386  })($nesting[0], $nesting);
23387  Opal.exit = process.exit;
23388  $const_set($nesting[0], 'ARGV', process.argv.slice(2));
23389  if ($eqeq($$('ARGV').$first(), "--")) {
23390    $$('ARGV').$shift();
23391  }  $$('STDOUT')['$write_proc=']($lambda(function $$1(string){
23392
23393    if (string == null) string = nil;
23394    return process.stdout.write(string);}));
23395  $$('STDERR')['$write_proc=']($lambda(function $$2(string){
23396
23397    if (string == null) string = nil;
23398    return process.stderr.write(string);}));
23399  $$('STDIN')['$read_proc='](function(_count) {
23400  // Ignore count, return as much as we can get
23401  var buf = Buffer.alloc(65536), count;
23402  try {
23403    count = __fs__.readSync(this.fd, buf, 0, 65536, null);
23404  }
23405  catch (e) { // Windows systems may raise EOF
23406    return nil;
23407  }
23408  if (count == 0) return nil;
23409  return buf.toString('utf8', 0, count);
23410});
23411  $$('STDIN')['$tty='](true);
23412  $$('STDOUT')['$tty='](true);
23413  return ($a = [true], $send($$('STDERR'), 'tty=', $a), $a[$a.length - 1]);
23414};
23415
23416Opal.modules["corelib/file"] = function(Opal) {/* Generated by Opal 1.7.3 */
23417  var $truthy = Opal.truthy, $klass = Opal.klass, $const_set = Opal.const_set, $Opal = Opal.Opal, $regexp = Opal.regexp, $rb_plus = Opal.rb_plus, $def = Opal.def, $Kernel = Opal.Kernel, $eqeq = Opal.eqeq, $rb_lt = Opal.rb_lt, $rb_minus = Opal.rb_minus, $range = Opal.range, $send = Opal.send, $slice = Opal.slice, $alias = Opal.alias, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
23418
23419  Opal.add_stubs('respond_to?,to_path,coerce_to!,pwd,split,sub,+,unshift,join,home,raise,start_with?,absolute_path,==,<,dirname,-,basename,empty?,rindex,[],length,nil?,gsub,find,=~,map,each_with_index,flatten,reject,to_proc,end_with?,expand_path,exist?');
23420  return (function($base, $super, $parent_nesting) {
23421    var self = $klass($base, $super, 'File');
23422
23423    var $nesting = [self].concat($parent_nesting), windows_root_rx = nil;
23424
23425
23426    $const_set($nesting[0], 'Separator', $const_set($nesting[0], 'SEPARATOR', "/"));
23427    $const_set($nesting[0], 'ALT_SEPARATOR', nil);
23428    $const_set($nesting[0], 'PATH_SEPARATOR', ":");
23429    $const_set($nesting[0], 'FNM_SYSCASE', 0);
23430    windows_root_rx = /^[a-zA-Z]:(?:\\|\/)/;
23431    return (function(self, $parent_nesting) {
23432      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
23433
23434
23435
23436      $def(self, '$absolute_path', function $$absolute_path(path, basedir) {
23437        var sep = nil, sep_chars = nil, new_parts = nil, $ret_or_1 = nil, path_abs = nil, basedir_abs = nil, parts = nil, leading_sep = nil, abs = nil, new_path = nil;
23438
23439
23440        if (basedir == null) basedir = nil;
23441        sep = $$('SEPARATOR');
23442        sep_chars = $sep_chars();
23443        new_parts = [];
23444        path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path));
23445        path = $Opal['$coerce_to!'](path, $$$('String'), "to_str");
23446        basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$$('Dir').$pwd()));
23447        path_abs = path.substr(0, sep.length) === sep || windows_root_rx.test(path);
23448        basedir_abs = basedir.substr(0, sep.length) === sep || windows_root_rx.test(basedir);
23449        if ($truthy(path_abs)) {
23450
23451          parts = path.$split($regexp(["[", sep_chars, "]"]));
23452          leading_sep = windows_root_rx.test(path) ? '' : path.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
23453          abs = true;
23454        } else {
23455
23456          parts = $rb_plus(basedir.$split($regexp(["[", sep_chars, "]"])), path.$split($regexp(["[", sep_chars, "]"])));
23457          leading_sep = windows_root_rx.test(basedir) ? '' : basedir.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
23458          abs = basedir_abs;
23459        }
23460        var part;
23461        for (var i = 0, ii = parts.length; i < ii; i++) {
23462          part = parts[i];
23463
23464          if (
23465            (part === nil) ||
23466            (part === ''  && ((new_parts.length === 0) || abs)) ||
23467            (part === '.' && ((new_parts.length === 0) || abs))
23468          ) {
23469            continue;
23470          }
23471          if (part === '..') {
23472            new_parts.pop();
23473          } else {
23474            new_parts.push(part);
23475          }
23476        }
23477
23478        if (!abs && parts[0] !== '.') {
23479          new_parts.$unshift(".");
23480        }
23481        new_path = new_parts.$join(sep);
23482        if ($truthy(abs)) {
23483          new_path = $rb_plus(leading_sep, new_path);
23484        }        return new_path;
23485      }, -2);
23486
23487      $def(self, '$expand_path', function $$expand_path(path, basedir) {
23488        var self = this, sep = nil, sep_chars = nil, home = nil, leading_sep = nil, home_path_regexp = nil;
23489
23490
23491        if (basedir == null) basedir = nil;
23492        sep = $$('SEPARATOR');
23493        sep_chars = $sep_chars();
23494        if ($truthy(path[0] === '~' || (basedir && basedir[0] === '~'))) {
23495
23496          home = $$('Dir').$home();
23497          if (!$truthy(home)) {
23498            $Kernel.$raise($$$('ArgumentError'), "couldn't find HOME environment -- expanding `~'");
23499          }          leading_sep = windows_root_rx.test(home) ? '' : home.$sub($regexp(["^([", sep_chars, "]+).*$"]), "\\1");
23500          if (!$truthy(home['$start_with?'](leading_sep))) {
23501            $Kernel.$raise($$$('ArgumentError'), "non-absolute home");
23502          }          home = $rb_plus(home, sep);
23503          home_path_regexp = $regexp(["^\\~(?:", sep, "|$)"]);
23504          path = path.$sub(home_path_regexp, home);
23505          if ($truthy(basedir)) {
23506            basedir = basedir.$sub(home_path_regexp, home);
23507          }        }        return self.$absolute_path(path, basedir);
23508      }, -2);
23509
23510      // Coerce a given path to a path string using #to_path and #to_str
23511      function $coerce_to_path(path) {
23512        if ($truthy((path)['$respond_to?']("to_path"))) {
23513          path = path.$to_path();
23514        }
23515
23516        path = $Opal['$coerce_to!'](path, $$$('String'), "to_str");
23517
23518        return path;
23519      }
23520
23521      // Return a RegExp compatible char class
23522      function $sep_chars() {
23523        if ($$('ALT_SEPARATOR') === nil) {
23524          return Opal.escape_regexp($$('SEPARATOR'));
23525        } else {
23526          return Opal.escape_regexp($rb_plus($$('SEPARATOR'), $$('ALT_SEPARATOR')));
23527        }
23528      }
23529
23530      $def(self, '$dirname', function $$dirname(path, level) {
23531        var self = this, sep_chars = nil;
23532
23533
23534        if (level == null) level = 1;
23535        if ($eqeq(level, 0)) {
23536          return path
23537        }        if ($truthy($rb_lt(level, 0))) {
23538          $Kernel.$raise($$$('ArgumentError'), "level can't be negative");
23539        }        sep_chars = $sep_chars();
23540        path = $coerce_to_path(path);
23541
23542        var absolute = path.match(new RegExp("^[" + (sep_chars) + "]")), out;
23543
23544        path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove trailing separators
23545        path = path.replace(new RegExp("[^" + (sep_chars) + "]+$"), ''); // remove trailing basename
23546        path = path.replace(new RegExp("[" + (sep_chars) + "]+$"), ''); // remove final trailing separators
23547
23548        if (path === '') {
23549          out = absolute ? '/' : '.';
23550        }
23551        else {
23552          out = path;
23553        }
23554
23555        if (level == 1) {
23556          return out;
23557        }
23558        else {
23559          return self.$dirname(out, $rb_minus(level, 1))
23560        }
23561      }, -2);
23562
23563      $def(self, '$basename', function $$basename(name, suffix) {
23564        var sep_chars = nil;
23565
23566
23567        if (suffix == null) suffix = nil;
23568        sep_chars = $sep_chars();
23569        name = $coerce_to_path(name);
23570
23571        if (name.length == 0) {
23572          return name;
23573        }
23574
23575        if (suffix !== nil) {
23576          suffix = $Opal['$coerce_to!'](suffix, $$$('String'), "to_str");
23577        } else {
23578          suffix = null;
23579        }
23580
23581        name = name.replace(new RegExp("(.)[" + (sep_chars) + "]*$"), '$1');
23582        name = name.replace(new RegExp("^(?:.*[" + (sep_chars) + "])?([^" + (sep_chars) + "]+)$"), '$1');
23583
23584        if (suffix === ".*") {
23585          name = name.replace(/\.[^\.]+$/, '');
23586        } else if(suffix !== null) {
23587          suffix = Opal.escape_regexp(suffix);
23588          name = name.replace(new RegExp("" + (suffix) + "$"), '');
23589        }
23590
23591        return name;
23592      }, -2);
23593
23594      $def(self, '$extname', function $$extname(path) {
23595        var self = this, filename = nil, last_dot_idx = nil;
23596
23597
23598        path = $coerce_to_path(path);
23599        filename = self.$basename(path);
23600        if ($truthy(filename['$empty?']())) {
23601          return ""
23602        }        last_dot_idx = filename['$[]']($range(1, -1, false)).$rindex(".");
23603        if (($truthy(last_dot_idx['$nil?']()) || ($eqeq($rb_plus(last_dot_idx, 1), $rb_minus(filename.$length(), 1))))) {
23604          return ""
23605        } else {
23606          return filename['$[]'](Opal.Range.$new($rb_plus(last_dot_idx, 1), -1, false))
23607        }      });
23608
23609      $def(self, '$exist?', function $exist$ques$1(path) {
23610
23611        return Opal.modules[path] != null
23612      });
23613
23614      $def(self, '$directory?', function $directory$ques$2(path) {
23615        var files = nil;
23616
23617
23618        files = [];
23619
23620        for (var key in Opal.modules) {
23621          files.push(key);
23622        }
23623        path = path.$gsub($regexp(["(^.", $$('SEPARATOR'), "+|", $$('SEPARATOR'), "+$)"]));
23624        return $send(files, 'find', [], function $$3(f){
23625
23626          if (f == null) f = nil;
23627          return f['$=~']($regexp(["^", path]));});
23628      });
23629
23630      $def(self, '$join', function $$join($a) {
23631        var $post_args, paths, result = nil;
23632
23633
23634        $post_args = $slice(arguments);
23635        paths = $post_args;
23636        if ($truthy(paths['$empty?']())) {
23637          return ""
23638        }        result = "";
23639        paths = $send(paths.$flatten().$each_with_index(), 'map', [], function $$4(item, index){
23640
23641          if (item == null) item = nil;
23642          if (index == null) index = nil;
23643          if (($eqeq(index, 0) && ($truthy(item['$empty?']())))) {
23644            return $$('SEPARATOR')
23645          } else if (($eqeq(paths.$length(), $rb_plus(index, 1)) && ($truthy(item['$empty?']())))) {
23646            return $$('SEPARATOR')
23647          } else {
23648            return item
23649          }});
23650        paths = $send(paths, 'reject', [], "empty?".$to_proc());
23651        $send(paths, 'each_with_index', [], function $$5(item, index){var next_item = nil;
23652
23653
23654          if (item == null) item = nil;
23655          if (index == null) index = nil;
23656          next_item = paths['$[]']($rb_plus(index, 1));
23657          if ($truthy(next_item['$nil?']())) {
23658            return (result = "" + (result) + (item))
23659          } else {
23660
23661            if (($truthy(item['$end_with?']($$('SEPARATOR'))) && ($truthy(next_item['$start_with?']($$('SEPARATOR')))))) {
23662              item = item.$sub($regexp([$$('SEPARATOR'), "+$"]), "");
23663            }            return (result = (($truthy(item['$end_with?']($$('SEPARATOR'))) || ($truthy(next_item['$start_with?']($$('SEPARATOR'))))) ? ("" + (result) + (item)) : ("" + (result) + (item) + ($$('SEPARATOR')))));
23664          }});
23665        return result;
23666      }, -1);
23667
23668      $def(self, '$split', function $$split(path) {
23669
23670        return path.$split($$('SEPARATOR'))
23671      });
23672      $alias(self, "realpath", "expand_path");
23673      return $alias(self, "exists?", "exist?");
23674    })(Opal.get_singleton_class(self), $nesting);
23675  })('::', $$$('IO'), $nesting)
23676};
23677
23678Opal.modules["nodejs/file"] = function(Opal) {/* Generated by Opal 1.7.3 */
23679  var $klass = Opal.klass, $truthy = Opal.truthy, $const_set = Opal.const_set, $defs = Opal.defs, $alias = Opal.alias, $slice = Opal.slice, $send = Opal.send, $neqeq = Opal.neqeq, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $assign_ivar = Opal.assign_ivar, self = Opal.top, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$;
23680
23681  Opal.add_stubs('require,constants,raise,warn,const_get,new,size,delete,respond_to?,path,join,call,map,to_proc,start_with?,first,exist?,realpath,!=,close,to_path,pwd,to_str,include?,match?,sub,attr_reader');
23682
23683  self.$require("corelib/file");
23684
23685  var warnings = {}, errno_codes = $$('Errno').$constants();
23686
23687  function handle_unsupported_feature(message) {
23688    switch (Opal.config.unsupported_features_severity) {
23689    case 'error':
23690      $$('Kernel').$raise($$('NotImplementedError'), message);
23691      break;
23692    case 'warning':
23693      warn(message);
23694      break;
23695      // noop
23696    }
23697  }
23698  function warn(string) {
23699    if (warnings[string]) {
23700      return;
23701    }
23702    warnings[string] = true;
23703    self.$warn(string);
23704  }
23705  function is_utf8(bytes) {
23706    var i = 0;
23707    while (i < bytes.length) {
23708      if ((// ASCII
23709        bytes[i] === 0x09 ||
23710        bytes[i] === 0x0A ||
23711        bytes[i] === 0x0D ||
23712        (0x20 <= bytes[i] && bytes[i] <= 0x7E)
23713      )
23714      ) {
23715        i += 1;
23716        continue;
23717      }
23718
23719      if ((// non-overlong 2-byte
23720        (0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
23721        (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF)
23722      )
23723      ) {
23724        i += 2;
23725        continue;
23726      }
23727
23728      if ((// excluding overlongs
23729          bytes[i] === 0xE0 &&
23730          (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
23731          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
23732        ) ||
23733        (// straight 3-byte
23734          ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
23735            bytes[i] === 0xEE ||
23736            bytes[i] === 0xEF) &&
23737          (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
23738          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
23739        ) ||
23740        (// excluding surrogates
23741          bytes[i] === 0xED &&
23742          (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x9F) &&
23743          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
23744        )
23745      ) {
23746        i += 3;
23747        continue;
23748      }
23749
23750      if ((// planes 1-3
23751          bytes[i] === 0xF0 &&
23752          (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
23753          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
23754          (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
23755        ) ||
23756        (// planes 4-15
23757          (0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
23758          (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
23759          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
23760          (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
23761        ) ||
23762        (// plane 16
23763          bytes[i] === 0xF4 &&
23764          (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
23765          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
23766          (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
23767        )
23768      ) {
23769        i += 4;
23770        continue;
23771      }
23772
23773      return false;
23774    }
23775
23776    return true;
23777  }
23778  function executeIOAction(action) {
23779    try {
23780      return action();
23781    } catch (error) {
23782      if (errno_codes.indexOf(error.code) >= 0) {
23783        var error_class = $$('Errno').$const_get(error.code);
23784        $$('Kernel').$raise((error_class).$new(error.message));
23785      }
23786      $$('Kernel').$raise(error);
23787    }
23788  }
23789  (function($base, $super, $parent_nesting) {
23790    var self = $klass($base, $super, 'File');
23791
23792    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
23793    if (self.__fs__ == null) self.__fs__ = nil;
23794    if (self.__path__ == null) self.__path__ = nil;
23795    if (self.__util__ == null) self.__util__ = nil;
23796
23797    $proto.eof = $proto.binary_flag = $proto.path = $proto.fd = nil;
23798
23799    self.__fs__ = __fs__;
23800    self.__path__ = __path__;
23801    self.__util__ = __util__;
23802    var __TextEncoder__ = typeof TextEncoder !== 'undefined' ? TextEncoder : __util__.TextEncoder;
23803    var __TextDecoder__ = typeof TextDecoder !== 'undefined' ? TextDecoder : __util__.TextDecoder;
23804    var __utf8TextDecoder__ = new __TextDecoder__('utf8');
23805    var __textEncoder__ = new __TextEncoder__();
23806    if ($truthy(__path__.sep !== $$('Separator'))) {
23807      $const_set($nesting[0], 'ALT_SEPARATOR', __path__.sep);
23808    }    $defs(self, '$read', function $$read(path) {
23809
23810      return executeIOAction(function(){return __fs__.readFileSync(path).toString()})
23811    });
23812    $defs(self, '$write', function $$write(path, data) {
23813
23814
23815      executeIOAction(function(){return __fs__.writeFileSync(path, data)});
23816      return data.$size();
23817    });
23818    $defs(self, '$symlink', function $$symlink(path, new_path) {
23819
23820
23821      executeIOAction(function(){return __fs__.symlinkSync(path, new_path)});
23822      return 0;
23823    });
23824    $defs(self, '$delete', function $File_delete$1(path) {
23825
23826      return executeIOAction(function(){return __fs__.unlinkSync(path)})
23827    });
23828    (function(self, $parent_nesting) {
23829
23830      return $alias(self, "unlink", "delete")
23831    })(Opal.get_singleton_class(self));
23832    $defs(self, '$exist?', function $File_exist$ques$2(path) {
23833
23834
23835      if ($truthy(path['$respond_to?']("path"))) {
23836        path = path.$path();
23837      }      return executeIOAction(function(){return __fs__.existsSync(path)});
23838    });
23839    $defs(self, '$realpath', function $$realpath(pathname, dir_string, cache) {
23840      var block = $$realpath.$$p || nil, self = this;
23841
23842      $$realpath.$$p = null;
23843      if (dir_string == null) dir_string = nil;
23844      if (cache == null) cache = nil;
23845      if ($truthy(dir_string)) {
23846        pathname = self.$join(dir_string, pathname);
23847      }      if ((block !== nil)) {
23848
23849        __fs__.realpath(pathname, cache, function(error, realpath){
23850          if (error) Opal.IOError.$new(error.message);
23851          else block.$call(realpath);
23852        });
23853
23854      } else {
23855        return executeIOAction(function(){return __fs__.realpathSync(pathname, cache)})
23856      }    }, -2);
23857    $defs(self, '$join', function $$join($a) {
23858      var $post_args, paths, $b, prefix = nil;
23859
23860
23861      $post_args = $slice(arguments);
23862      paths = $post_args;
23863      paths = $send(paths, 'map', [], "to_s".$to_proc());
23864      prefix = ($truthy(($b = paths.$first(), ($b === nil || $b == null) ? nil : $b['$start_with?']("//"))) ? ("/") : (""));
23865      return prefix + __path__.posix.join.apply(__path__, paths);
23866    }, -1);
23867    $defs(self, '$directory?', function $File_directory$ques$3(path) {
23868      var self = this, result = nil, realpath = nil;
23869
23870
23871      if (!$truthy(self['$exist?'](path))) {
23872        return false
23873      }      result = executeIOAction(function(){return !!__fs__.lstatSync(path).isDirectory()});
23874      if (!$truthy(result)) {
23875
23876        realpath = self.$realpath(path);
23877        if ($neqeq(realpath, path)) {
23878          result = executeIOAction(function(){return !!__fs__.lstatSync(realpath).isDirectory()});
23879        }      }      return result;
23880    });
23881    $defs(self, '$file?', function $File_file$ques$4(path) {
23882      var self = this, result = nil, realpath = nil;
23883
23884
23885      if (!$truthy(self['$exist?'](path))) {
23886        return false
23887      }      result = executeIOAction(function(){return !!__fs__.lstatSync(path).isFile()});
23888      if (!$truthy(result)) {
23889
23890        realpath = self.$realpath(path);
23891        if ($neqeq(realpath, path)) {
23892          result = executeIOAction(function(){return !!__fs__.lstatSync(realpath).isFile()});
23893        }      }      return result;
23894    });
23895    $defs(self, '$readable?', function $File_readable$ques$5(path) {
23896      var self = this;
23897
23898
23899      if (!$truthy(self['$exist?'](path))) {
23900        return false
23901      }      return "\n" + "        try {\n" + "          __fs__.accessSync(path, __fs__.R_OK);\n" + "          return true;\n" + "        } catch (error) {\n" + "          return false;\n" + "        }\n" + "      ";
23902    });
23903    $defs(self, '$size', function $$size(path) {
23904
23905      return executeIOAction(function(){return __fs__.lstatSync(path).size});
23906    });
23907    $defs(self, '$open', function $$open(path, mode) {
23908      var $yield = $$open.$$p || nil, self = this, file = nil;
23909
23910      $$open.$$p = null;
23911
23912      if (mode == null) mode = "r";
23913      file = self.$new(path, mode);
23914      if (($yield !== nil)) {
23915
23916        return (function() { try {
23917        return Opal.yield1($yield, file);
23918        } finally {
23919          file.$close();
23920        } })();
23921      } else {
23922        return file
23923      }    }, -2);
23924    $defs(self, '$stat', function $$stat(path) {
23925
23926
23927      if ($truthy(path['$respond_to?']("path"))) {
23928        path = path.$path();
23929      }      return $$$($$('File'), 'Stat').$new(path);
23930    });
23931    $defs(self, '$mtime', function $$mtime(path) {
23932
23933      return executeIOAction(function(){return __fs__.statSync(path).mtime})
23934    });
23935    $defs(self, '$symlink?', function $File_symlink$ques$6(path) {
23936
23937      return executeIOAction(function(){return __fs__.lstatSync(path).isSymbolicLink()})
23938    });
23939    $defs(self, '$absolute_path', function $$absolute_path(path, basedir) {
23940      var $ret_or_1 = nil;
23941
23942
23943      if (basedir == null) basedir = nil;
23944      path = ($truthy(path['$respond_to?']("to_path")) ? (path.$to_path()) : (path));
23945      basedir = ($truthy(($ret_or_1 = basedir)) ? ($ret_or_1) : ($$('Dir').$pwd()));
23946      return __path__.normalize(__path__.resolve(basedir.$to_str(), path.$to_str())).split(__path__.sep).join(__path__.posix.sep);
23947    }, -2);
23948
23949    $def(self, '$initialize', function $$initialize(path, flags) {
23950      var self = this, encoding_option_rx = nil, fd = nil;
23951
23952      $$initialize.$$p = null;
23953
23954      if (flags == null) flags = "r";
23955      self.binary_flag = flags['$include?']("b");
23956      flags = flags.$delete("b");
23957      encoding_option_rx = /:(.*)/;
23958      if ($truthy(encoding_option_rx['$match?'](flags))) {
23959
23960        handle_unsupported_feature("Encoding option (:encoding) is unsupported by Node.js openSync method and will be removed.");
23961        flags = flags.$sub(encoding_option_rx, "");
23962      }      self.path = path;
23963      fd = executeIOAction(function(){return __fs__.openSync(path, flags)});
23964      return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [fd, flags], null);
23965    }, -2);
23966    self.$attr_reader("path");
23967
23968    $def(self, '$sysread', function $$sysread(bytes) {
23969      var self = this, res = nil;
23970
23971      if ($truthy(self.eof)) {
23972        return self.$raise($$('EOFError'), "end of file reached")
23973      } else {
23974
23975        if ($truthy(self.binary_flag)) {
23976
23977
23978          var buf = executeIOAction(function(){return __fs__.readFileSync(self.path)});
23979          var content;
23980          if (is_utf8(buf)) {
23981            content = buf.toString('utf8');
23982          } else {
23983            // coerce to utf8
23984            content = __utf8TextDecoder__.decode(__textEncoder__.encode(buf.toString('binary')));
23985          }
23986          res = content;
23987        } else {
23988          res = executeIOAction(function(){return __fs__.readFileSync(self.path).toString('utf8')});
23989        }        self.eof = true;
23990        self.lineno = res.$size();
23991        return res;
23992      }
23993    });
23994
23995    $def(self, '$write', function $$write(string) {
23996      var self = this;
23997
23998      return executeIOAction(function(){return __fs__.writeSync(self.fd, string)})
23999    });
24000
24001    $def(self, '$flush', function $$flush() {
24002      var self = this;
24003
24004      return executeIOAction(function(){return __fs__.fsyncSync(self.fd)})
24005    });
24006
24007    $def(self, '$close', function $$close() {
24008      var $yield = $$close.$$p || nil, self = this;
24009
24010      $$close.$$p = null;
24011
24012      executeIOAction(function(){return __fs__.closeSync(self.fd)});
24013      return $send2(self, $find_super(self, 'close', $$close, false, true), 'close', [], $yield);
24014    });
24015    return $def(self, '$mtime', function $$mtime() {
24016      var self = this;
24017
24018      return executeIOAction(function(){return __fs__.statSync(self.path).mtime})
24019    });
24020  })($nesting[0], $$('IO'), $nesting);
24021  return (function($base, $super) {
24022    var self = $klass($base, $super, 'Stat');
24023
24024    var $proto = self.$$prototype;
24025    if (self.__fs__ == null) self.__fs__ = nil;
24026
24027    $proto.path = nil;
24028
24029    self.__fs__ = __fs__;
24030
24031    $def(self, '$initialize', $assign_ivar("path"));
24032
24033    $def(self, '$file?', function $Stat_file$ques$7() {
24034      var self = this;
24035
24036      return executeIOAction(function(){return __fs__.statSync(self.path).isFile()})
24037    });
24038
24039    $def(self, '$directory?', function $Stat_directory$ques$8() {
24040      var self = this;
24041
24042      return executeIOAction(function(){return __fs__.statSync(self.path).isDirectory()})
24043    });
24044
24045    $def(self, '$mtime', function $$mtime() {
24046      var self = this;
24047
24048      return executeIOAction(function(){return __fs__.statSync(self.path).mtime})
24049    });
24050
24051    $def(self, '$readable?', function $Stat_readable$ques$9() {
24052      var self = this;
24053
24054      return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.R_OK)})
24055    });
24056
24057    $def(self, '$writable?', function $Stat_writable$ques$10() {
24058      var self = this;
24059
24060      return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.W_OK)})
24061    });
24062    return $def(self, '$executable?', function $Stat_executable$ques$11() {
24063      var self = this;
24064
24065      return executeIOAction(function(){return __fs__.accessSync(self.path, __fs__.constants.X_OK)})
24066    });
24067  })($$('File'), null);
24068};
24069
24070Opal.modules["nodejs/dir"] = function(Opal) {/* Generated by Opal 1.7.3 */
24071  var $klass = Opal.klass, $def = Opal.def, $truthy = Opal.truthy, $send = Opal.send, $Opal = Opal.Opal, $alias = Opal.alias, $nesting = [], nil = Opal.nil;
24072
24073  Opal.add_stubs('respond_to?,flat_map,to_path,coerce_to!,pwd');
24074  return (function($base, $super, $parent_nesting) {
24075    var self = $klass($base, $super, 'Dir');
24076
24077    var $nesting = [self].concat($parent_nesting);
24078    if (self.__glob__ == null) self.__glob__ = nil;
24079    if (self.__fs__ == null) self.__fs__ = nil;
24080    if (self.__path__ == null) self.__path__ = nil;
24081    if (self.__os__ == null) self.__os__ = nil;
24082
24083
24084    self.__glob__ = __glob__;
24085    self.__fs__ = __fs__;
24086    self.__path__ = __path__;
24087    self.__os__ = __os__;
24088    return (function(self, $parent_nesting) {
24089      var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
24090
24091
24092
24093      $def(self, '$[]', function $$$1(glob) {
24094
24095        return __glob__.sync(glob)
24096      });
24097
24098      $def(self, '$pwd', function $$pwd() {
24099
24100        return process.cwd().split(__path__.sep).join(__path__.posix.sep);
24101      });
24102
24103      $def(self, '$home', function $$home() {
24104
24105        return __os__.homedir();
24106      });
24107
24108      $def(self, '$chdir', function $$chdir(path) {
24109
24110        return process.chdir(path)
24111      });
24112
24113      $def(self, '$mkdir', function $$mkdir(path) {
24114
24115        return __fs__.mkdirSync(path)
24116      });
24117
24118      $def(self, '$entries', function $$entries(dirname) {
24119
24120
24121        var result = [];
24122        var entries = __fs__.readdirSync(dirname);
24123        for (var i = 0, ii = entries.length; i < ii; i++) {
24124          result.push(entries[i]);
24125        }
24126        return result;
24127
24128      });
24129
24130      $def(self, '$glob', function $$glob(pattern) {
24131
24132
24133        if (!$truthy(pattern['$respond_to?']("each"))) {
24134          pattern = [pattern];
24135        }        return $send(pattern, 'flat_map', [], function $$2(subpattern){
24136
24137          if (subpattern == null) subpattern = nil;
24138          if ($truthy(subpattern['$respond_to?']("to_path"))) {
24139            subpattern = subpattern.$to_path();
24140          }          subpattern = $Opal['$coerce_to!'](subpattern, $$('String'), "to_str");
24141          return __glob__.sync(subpattern);});
24142      });
24143      return $alias(self, "getwd", "pwd");
24144    })(Opal.get_singleton_class(self), $nesting);
24145  })($nesting[0], null, $nesting)
24146};
24147
24148Opal.modules["nodejs/io"] = function(Opal) {/* Generated by Opal 1.7.3 */
24149  var $klass = Opal.klass, $alias = Opal.alias, $def = Opal.def, $defs = Opal.defs, self = Opal.top, $nesting = []; Opal.nil;
24150
24151  Opal.add_stubs('require,attr_reader,initialize,initialize_before_node_io,write,read');
24152
24153  self.$require("nodejs/file");
24154
24155  function executeIOAction(action) {
24156    try {
24157      return action();
24158    } catch (error) {
24159      if (error.code === 'EACCES' ||
24160          error.code === 'EISDIR' ||
24161          error.code === 'EMFILE' ||
24162          error.code === 'ENOENT' ||
24163          error.code === 'EPERM') {
24164        throw Opal.IOError.$new(error.message)
24165      }
24166      throw error;
24167    }
24168  }
24169  return (function($base, $super, $parent_nesting) {
24170    var self = $klass($base, $super, 'IO');
24171
24172    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
24173
24174
24175    self.__fs__ = __fs__;
24176    self.$attr_reader("lineno");
24177    $alias(self, "initialize_before_node_io", "initialize");
24178
24179    $def(self, '$initialize', function $$initialize(fd, flags) {
24180      var self = this;
24181
24182
24183      if (flags == null) flags = "r";
24184      self.lineno = 0;
24185      return self.$initialize_before_node_io(fd, flags);
24186    }, -2);
24187    $defs(self, '$write', function $$write(path, data) {
24188
24189      return $$('File').$write(path, data)
24190    });
24191    $defs(self, '$read', function $$read(path) {
24192
24193      return $$('File').$read(path)
24194    });
24195    return $defs(self, '$binread', function $$binread(path) {
24196
24197      return executeIOAction(function(){return __fs__.readFileSync(path).toString('binary')})
24198    });
24199  })($nesting[0], null, $nesting);
24200};
24201
24202Opal.modules["nodejs/argf"] = function(Opal) {/* Generated by Opal 1.7.3 */
24203  var $const_set = Opal.const_set, $return_val = Opal.return_val, $def = Opal.def, $eqeq = Opal.eqeq, $gvars = Opal.gvars, $truthy = Opal.truthy, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $rb_gt = Opal.rb_gt, $thrower = Opal.thrower, $not = Opal.not, $alias = Opal.alias, $a, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil;
24204
24205  Opal.add_stubs('new,include,filename,==,open,argv,shift,close,file,closed?,enum_for,gets,nil?,+,loop,read,-,length,>,to_a,each,attr_accessor,rewind,!,fileno,eof?,lineno=');
24206
24207  $const_set($nesting[0], 'ARGF', $$('Object').$new());
24208  (function(self, $parent_nesting) {
24209    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
24210
24211
24212    self.$include($$('Enumerable'));
24213
24214    $def(self, '$inspect', $return_val("ARGF"));
24215
24216    $def(self, '$argv', function $$argv() {
24217
24218      return $$('ARGV')
24219    });
24220
24221    $def(self, '$file', function $$file() {
24222      var self = this, fn = nil, $ret_or_1 = nil;
24223      if (self.file == null) self.file = nil;
24224      if ($gvars.stdin == null) $gvars.stdin = nil;
24225
24226
24227      fn = self.$filename();
24228      if ($eqeq(fn, "-")) {
24229        return $gvars.stdin
24230      } else {
24231        return (self.file = ($truthy(($ret_or_1 = self.file)) ? ($ret_or_1) : ($$('File').$open(fn, "r"))))
24232      }    });
24233
24234    $def(self, '$filename', function $$filename() {
24235      var self = this, $ret_or_1 = nil;
24236      if (self.filename == null) self.filename = nil;
24237      if (self.last_filename == null) self.last_filename = nil;
24238
24239
24240      if ($truthy(self.filename)) {
24241        return self.filename
24242      }      if ($eqeq(self.$argv(), ["-"])) {
24243        return "-"
24244      } else if ($eqeq(self.$argv(), [])) {
24245        if ($truthy(($ret_or_1 = self.last_filename))) {
24246          return $ret_or_1
24247        } else {
24248          return "-"
24249        }
24250      } else {
24251
24252        self.file = nil;
24253        return (self.filename = (self.last_filename = self.$argv().$shift()));
24254      }    });
24255
24256    $def(self, '$close', function $$close() {
24257      var self = this;
24258
24259
24260      self.$file().$close();
24261      self.filename = nil;
24262      return self;
24263    });
24264
24265    $def(self, '$closed?', function $closed$ques$1() {
24266      var self = this;
24267
24268      return self.$file()['$closed?']()
24269    });
24270
24271    $def(self, '$each', function $$each($a) {
24272      var block = $$each.$$p || nil, $post_args, args, self = this, l = nil;
24273
24274      $$each.$$p = null;
24275      $post_args = $slice(arguments);
24276      args = $post_args;
24277      if (!(block !== nil)) {
24278        return self.$enum_for("each")
24279      }      while ($truthy((l = $send(self, 'gets', $to_a(args))))) {
24280      Opal.yield1(block, l);
24281      }    }, -1);
24282
24283    $def(self, '$gets', function $$gets($a) {
24284      var $post_args, args, self = this, s = nil;
24285      if (self.lineno == null) self.lineno = nil;
24286
24287
24288      $post_args = $slice(arguments);
24289      args = $post_args;
24290      s = $send(self.$file(), 'gets', $to_a(args));
24291      if ($truthy(s['$nil?']())) {
24292
24293        self.$close();
24294        s = $send(self.$file(), 'gets', $to_a(args));
24295      }      if ($truthy(s)) {
24296        self.lineno = $rb_plus(self.lineno, 1);
24297      }      return s;
24298    }, -1);
24299
24300    $def(self, '$read', function $$read(len) {
24301      var self = this, buf = nil;
24302
24303
24304      if (len == null) len = nil;
24305      buf = "";
24306      return (function(){try { var $t_break = $thrower('break'); return $send(self, 'loop', [], function $$2(){var self = $$2.$$s == null ? this : $$2.$$s, r = nil;
24307        if (self.filename == null) self.filename = nil;
24308
24309
24310        r = self.$file().$read(len);
24311        if ($truthy(r)) {
24312
24313          buf = $rb_plus(buf, r);
24314          len = $rb_minus(len, r.$length());
24315        };
24316        self.$file().$close();
24317        if ((($truthy(len) && ($truthy($rb_gt(len, 0)))) && ($truthy(self.filename)))) {
24318          $t_break.$throw();
24319        } else {
24320          return nil
24321        };}, {$$s: self})} catch($e) {
24322        if ($e === $t_break) return $e.$v;
24323        throw $e;
24324      }})();
24325    }, -1);
24326
24327    $def(self, '$readlines', function $$readlines($a) {
24328      var $post_args, args, self = this;
24329
24330
24331      $post_args = $slice(arguments);
24332      args = $post_args;
24333      return $send(self, 'each', $to_a(args)).$to_a();
24334    }, -1);
24335    self.$attr_accessor("lineno");
24336
24337    $def(self, '$rewind', function $$rewind() {
24338      var self = this, f = nil;
24339
24340
24341      self.lineno = 1;
24342      f = self.$file();
24343
24344      try {
24345        f.$rewind();
24346      } catch ($err) {
24347        if (Opal.rescue($err, [$$('StandardError')])) {
24348          try {
24349            nil;
24350          } finally { Opal.pop_exception(); }
24351        } else { throw $err; }
24352      }      return 0;
24353    });
24354
24355    $def(self, '$fileno', function $$fileno() {
24356      var self = this;
24357      if (self.last_filename == null) self.last_filename = nil;
24358      if (self.filename == null) self.filename = nil;
24359
24360
24361      if (($not(self.filename) && ($truthy(self.last_filename)))) {
24362        return 0
24363      }      return self.$file().$fileno();
24364    });
24365
24366    $def(self, '$eof?', function $eof$ques$3() {
24367      var self = this;
24368
24369      return self.$file()['$eof?']()
24370    });
24371    $alias(self, "each_line", "each");
24372    $alias(self, "eof", "eof?");
24373    $alias(self, "path", "filename");
24374    $alias(self, "skip", "close");
24375    $alias(self, "to_i", "fileno");
24376    return $alias(self, "to_io", "file");
24377  })(Opal.get_singleton_class($$('ARGF')), $nesting);
24378  return ($a = [1], $send($$('ARGF'), 'lineno=', $a), $a[$a.length - 1]);
24379};
24380
24381Opal.modules["nodejs/open-uri"] = function(Opal) {/* Generated by Opal 1.7.3 */
24382  var $module = Opal.module, $defs = Opal.defs, $nesting = [], nil = Opal.nil;
24383
24384  return (function($base) {
24385    var self = $module($base, 'OpenURI');
24386
24387        if (self.__xmlhttprequest__ == null) self.__xmlhttprequest__ = nil;
24388
24389
24390    self.__xmlhttprequest__ = __xmlhttprequest__;
24391    var __XMLHttpRequest__ = self.__xmlhttprequest__.XMLHttpRequest;
24392    $defs(self, '$request', function $$request(uri) {
24393
24394
24395      var xhr = new __XMLHttpRequest__();
24396      xhr.open('GET', uri, false);
24397      xhr.responseType = 'arraybuffer';
24398      xhr.send();
24399      return xhr;
24400
24401    });
24402    return $defs(self, '$data', function $$data(req) {
24403
24404
24405      var arrayBuffer = req.response;
24406      var byteArray = new Uint8Array(arrayBuffer);
24407      var result = [];
24408      for (var i = 0; i < byteArray.byteLength; i++) {
24409        result.push(byteArray[i]);
24410      }
24411      return result;
24412
24413    });
24414  })($nesting[0])
24415};
24416
24417Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */
24418  var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$;
24419
24420  Opal.add_stubs('>,<,===,raise,class,<=>,equal?');
24421  return (function($base) {
24422    var self = $module($base, 'Comparable');
24423
24424    var $ret_or_1 = nil;
24425
24426
24427
24428    function normalize(what) {
24429      if (Opal.is_a(what, Opal.Integer)) { return what; }
24430
24431      if ($rb_gt(what, 0)) { return 1; }
24432      if ($rb_lt(what, 0)) { return -1; }
24433      return 0;
24434    }
24435
24436    function fail_comparison(lhs, rhs) {
24437      var class_name;
24438      (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class));
24439      $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed");
24440    }
24441
24442    function cmp_or_fail(lhs, rhs) {
24443      var cmp = (lhs)['$<=>'](rhs);
24444      if (!$truthy(cmp)) fail_comparison(lhs, rhs);
24445      return normalize(cmp);
24446    }
24447
24448    $def(self, '$==', function $Comparable_$eq_eq$1(other) {
24449      var self = this, cmp = nil;
24450
24451
24452      if ($truthy(self['$equal?'](other))) {
24453        return true
24454      }
24455      if (self["$<=>"] == Opal.Kernel["$<=>"]) {
24456        return false;
24457      }
24458
24459      // check for infinite recursion
24460      if (self.$$comparable) {
24461        self.$$comparable = false;
24462        return false;
24463      }
24464      if (!$truthy((cmp = self['$<=>'](other)))) {
24465        return false
24466      }      return normalize(cmp) == 0;    });
24467
24468    $def(self, '$>', function $Comparable_$gt$2(other) {
24469      var self = this;
24470
24471      return cmp_or_fail(self, other) > 0;
24472    });
24473
24474    $def(self, '$>=', function $Comparable_$gt_eq$3(other) {
24475      var self = this;
24476
24477      return cmp_or_fail(self, other) >= 0;
24478    });
24479
24480    $def(self, '$<', function $Comparable_$lt$4(other) {
24481      var self = this;
24482
24483      return cmp_or_fail(self, other) < 0;
24484    });
24485
24486    $def(self, '$<=', function $Comparable_$lt_eq$5(other) {
24487      var self = this;
24488
24489      return cmp_or_fail(self, other) <= 0;
24490    });
24491
24492    $def(self, '$between?', function $Comparable_between$ques$6(min, max) {
24493      var self = this;
24494
24495
24496      if ($rb_lt(self, min)) {
24497        return false
24498      }      if ($rb_gt(self, max)) {
24499        return false
24500      }      return true;
24501    });
24502    return $def(self, '$clamp', function $$clamp(min, max) {
24503      var self = this;
24504
24505
24506      if (max == null) max = nil;
24507
24508      var c, excl;
24509
24510      if (max === nil) {
24511        // We are dealing with a new Ruby 2.7 behaviour that we are able to
24512        // provide a single Range argument instead of 2 Comparables.
24513
24514        if (!Opal.is_a(min, Opal.Range)) {
24515          $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)");
24516        }
24517
24518        excl = min.excl;
24519        max = min.end;
24520        min = min.begin;
24521
24522        if (max !== nil && excl) {
24523          $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range");
24524        }
24525      }
24526
24527      if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) {
24528        $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument");
24529      }
24530
24531      if (min !== nil) {
24532        c = cmp_or_fail(self, min);
24533
24534        if (c == 0) return self;
24535        if (c < 0) return min;
24536      }
24537
24538      if (max !== nil) {
24539        c = cmp_or_fail(self, max);
24540
24541        if (c > 0) return max;
24542      }
24543
24544      return self;
24545    }, -2);
24546  })('::')
24547};
24548
24549Opal.modules["pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */
24550  var $klass = Opal.klass, $const_set = Opal.const_set, $regexp = Opal.regexp, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $def = Opal.def, $defs = Opal.defs, $to_ary = Opal.to_ary, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $return_ivar = Opal.return_ivar, $neqeq = Opal.neqeq, $rb_plus = Opal.rb_plus, $not = Opal.not, $thrower = Opal.thrower, $alias = Opal.alias, $module = Opal.module, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
24551
24552  Opal.add_stubs('require,include,quote,===,to_s,path,respond_to?,to_path,is_a?,nil?,raise,class,==,new,pwd,attr_reader,!,relative?,chop_basename,basename,=~,source,[],rindex,sub,absolute?,expand_path,plus,unshift,length,!=,empty?,first,shift,+,join,dirname,pop,reverse_each,directory?,extname,<=>,nonzero?,proc,casecmp,cleanpath,inspect,include?,fill,map,entries');
24553
24554  self.$require("corelib/comparable");
24555  (function($base, $super, $parent_nesting) {
24556    var self = $klass($base, $super, 'Pathname');
24557
24558    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
24559
24560    $proto.path = nil;
24561
24562    self.$include($$('Comparable'));
24563    $const_set($nesting[0], 'SEPARATOR_PAT', $regexp([$$('Regexp').$quote($$$($$('File'), 'SEPARATOR'))]));
24564
24565    $def(self, '$initialize', function $$initialize(path) {
24566      var self = this;
24567
24568
24569      if ($eqeqeq($$('Pathname'), path)) {
24570        self.path = path.$path().$to_s();
24571      } else if ($truthy(path['$respond_to?']("to_path"))) {
24572        self.path = path.$to_path();
24573      } else if ($truthy(path['$is_a?']($$('String')))) {
24574        self.path = path;
24575      } else if ($truthy(path['$nil?']())) {
24576        self.$raise($$('TypeError'), "no implicit conversion of nil into String");
24577      } else {
24578        self.$raise($$('TypeError'), "no implicit conversion of " + (path.$class()) + " into String");
24579      }      if ($eqeq(self.path, "\u0000")) {
24580        return self.$raise($$('ArgumentError'))
24581      } else {
24582        return nil
24583      }    });
24584    $defs(self, '$pwd', function $$pwd() {
24585      var self = this;
24586
24587      return self.$new($$('Dir').$pwd())
24588    });
24589    self.$attr_reader("path");
24590
24591    $def(self, '$==', function $Pathname_$eq_eq$1(other) {
24592      var self = this;
24593
24594      return other.$path()['$=='](self.path)
24595    });
24596
24597    $def(self, '$absolute?', function $Pathname_absolute$ques$2() {
24598      var self = this;
24599
24600      return self['$relative?']()['$!']()
24601    });
24602
24603    $def(self, '$relative?', function $Pathname_relative$ques$3() {
24604      var $a, $b, self = this, path = nil, r = nil;
24605
24606
24607      path = self.path;
24608      while ($truthy((r = self.$chop_basename(path)))) {
24609      $b = r, $a = $to_ary($b), (path = ($a[0] == null ? nil : $a[0]));
24610      }      return path['$==']("");
24611    });
24612
24613    $def(self, '$chop_basename', function $$chop_basename(path) {
24614      var base = nil;
24615
24616
24617      base = $$('File').$basename(path);
24618      if ($truthy($$('Regexp').$new("^" + ($$$($$('Pathname'), 'SEPARATOR_PAT').$source()) + "?$")['$=~'](base))) {
24619        return nil
24620      } else {
24621        return [path['$[]'](0, path.$rindex(base)), base]
24622      }    });
24623
24624    $def(self, '$root?', function $Pathname_root$ques$4() {
24625      var self = this;
24626
24627      return self.path['$==']("/")
24628    });
24629
24630    $def(self, '$parent', function $$parent() {
24631      var self = this, new_path = nil;
24632
24633
24634      new_path = self.path.$sub(/\/([^\/]+\/?$)/, "");
24635      if ($eqeq(new_path, "")) {
24636        new_path = ($truthy(self['$absolute?']()) ? ("/") : ("."));
24637      }      return $$('Pathname').$new(new_path);
24638    });
24639
24640    $def(self, '$sub', function $$sub($a) {
24641      var $post_args, args, self = this;
24642
24643
24644      $post_args = $slice(arguments);
24645      args = $post_args;
24646      return $$('Pathname').$new($send(self.path, 'sub', $to_a(args)));
24647    }, -1);
24648
24649    $def(self, '$cleanpath', function $$cleanpath() {
24650      var self = this;
24651
24652      return Opal.normalize(self.path)
24653    });
24654
24655    $def(self, '$to_path', $return_ivar("path"));
24656
24657    $def(self, '$hash', $return_ivar("path"));
24658
24659    $def(self, '$expand_path', function $$expand_path() {
24660      var self = this;
24661
24662      return $$('Pathname').$new($$('File').$expand_path(self.path))
24663    });
24664
24665    $def(self, '$+', function $Pathname_$plus$5(other) {
24666      var self = this;
24667
24668
24669      if (!$eqeqeq($$('Pathname'), other)) {
24670        other = $$('Pathname').$new(other);
24671      }      return $$('Pathname').$new(self.$plus(self.path, other.$to_s()));
24672    });
24673
24674    $def(self, '$plus', function $$plus(path1, path2) {
24675      var $a, $b, self = this, prefix2 = nil, index_list2 = nil, basename_list2 = nil, r2 = nil, basename2 = nil, prefix1 = nil, $ret_or_1 = nil, r1 = nil, basename1 = nil, suffix2 = nil;
24676
24677
24678      prefix2 = path2;
24679      index_list2 = [];
24680      basename_list2 = [];
24681      while ($truthy((r2 = self.$chop_basename(prefix2)))) {
24682
24683        $b = r2, $a = $to_ary($b), (prefix2 = ($a[0] == null ? nil : $a[0])), (basename2 = ($a[1] == null ? nil : $a[1]));
24684        index_list2.$unshift(prefix2.$length());
24685        basename_list2.$unshift(basename2);
24686      }      if ($neqeq(prefix2, "")) {
24687        return path2
24688      }      prefix1 = path1;
24689      while ($truthy(true)) {
24690
24691        while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$=='](".")) : ($ret_or_1)))) {
24692
24693          index_list2.$shift();
24694          basename_list2.$shift();
24695        }        if (!$truthy((r1 = self.$chop_basename(prefix1)))) {
24696          break
24697        }        $b = r1, $a = $to_ary($b), (prefix1 = ($a[0] == null ? nil : $a[0])), (basename1 = ($a[1] == null ? nil : $a[1]));
24698        if ($eqeq(basename1, ".")) {
24699          continue
24700        }        if ((($eqeq(basename1, "..") || ($truthy(basename_list2['$empty?']()))) || ($neqeq(basename_list2.$first(), "..")))) {
24701
24702          prefix1 = $rb_plus(prefix1, basename1);
24703          break;
24704        }        index_list2.$shift();
24705        basename_list2.$shift();
24706      }      r1 = self.$chop_basename(prefix1);
24707      if (($not(r1) && ($truthy($regexp([$$('SEPARATOR_PAT')])['$=~']($$('File').$basename(prefix1)))))) {
24708        while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$==']("..")) : ($ret_or_1)))) {
24709
24710          index_list2.$shift();
24711          basename_list2.$shift();
24712        }
24713      }      if ($not(basename_list2['$empty?']())) {
24714
24715        suffix2 = path2['$[]'](Opal.Range.$new(index_list2.$first(), -1, false));
24716        if ($truthy(r1)) {
24717          return $$('File').$join(prefix1, suffix2)
24718        } else {
24719          return $rb_plus(prefix1, suffix2)
24720        }      } else if ($truthy(r1)) {
24721        return prefix1
24722      } else {
24723        return $$('File').$dirname(prefix1)
24724      }    });
24725
24726    $def(self, '$join', function $$join($a) {try { var $t_return = $thrower('return');
24727      var $post_args, args, self = this, result = nil;
24728
24729
24730      $post_args = $slice(arguments);
24731      args = $post_args;
24732      if ($truthy(args['$empty?']())) {
24733        return self
24734      };
24735      result = args.$pop();
24736      if (!$eqeqeq($$('Pathname'), result)) {
24737        result = $$('Pathname').$new(result);
24738      };
24739      if ($truthy(result['$absolute?']())) {
24740        return result
24741      };
24742      $send(args, 'reverse_each', [], function $$6(arg){
24743
24744        if (arg == null) arg = nil;
24745        if (!$eqeqeq($$('Pathname'), arg)) {
24746          arg = $$('Pathname').$new(arg);
24747        };
24748        result = $rb_plus(arg, result);
24749        if ($truthy(result['$absolute?']())) {
24750          $t_return.$throw(result);
24751        } else {
24752          return nil
24753        };}, {$$ret: $t_return});
24754      return $rb_plus(self, result);} catch($e) {
24755        if ($e === $t_return) return $e.$v;
24756        throw $e;
24757      }
24758    }, -1);
24759
24760    $def(self, '$split', function $$split() {
24761      var self = this;
24762
24763      return [self.$dirname(), self.$basename()]
24764    });
24765
24766    $def(self, '$dirname', function $$dirname() {
24767      var self = this;
24768
24769      return $$('Pathname').$new($$('File').$dirname(self.path))
24770    });
24771
24772    $def(self, '$basename', function $$basename() {
24773      var self = this;
24774
24775      return $$('Pathname').$new($$('File').$basename(self.path))
24776    });
24777
24778    $def(self, '$directory?', function $Pathname_directory$ques$7() {
24779      var self = this;
24780
24781      return $$('File')['$directory?'](self.path)
24782    });
24783
24784    $def(self, '$extname', function $$extname() {
24785      var self = this;
24786
24787      return $$('File').$extname(self.path)
24788    });
24789
24790    $def(self, '$<=>', function $Pathname_$lt_eq_gt$8(other) {
24791      var self = this;
24792
24793      return self.$path()['$<=>'](other.$path())
24794    });
24795    $const_set($nesting[0], 'SAME_PATHS', ($truthy($$$($$('File'), 'FNM_SYSCASE')['$nonzero?']()) ? ($send(self, 'proc', [], function $Pathname$9(a, b){
24796
24797      if (a == null) a = nil;
24798      if (b == null) b = nil;
24799      return a.$casecmp(b)['$=='](0);})) : ($send(self, 'proc', [], function $Pathname$10(a, b){
24800
24801      if (a == null) a = nil;
24802      if (b == null) b = nil;
24803      return a['$=='](b);}))));
24804
24805    $def(self, '$relative_path_from', function $$relative_path_from(base_directory) {
24806      var $a, $b, self = this, dest_directory = nil, dest_prefix = nil, dest_names = nil, r = nil, basename = nil, base_prefix = nil, base_names = nil, $ret_or_1 = nil, $ret_or_2 = nil, relpath_names = nil;
24807
24808
24809      dest_directory = self.$cleanpath().$to_s();
24810      base_directory = base_directory.$cleanpath().$to_s();
24811      dest_prefix = dest_directory;
24812      dest_names = [];
24813      while ($truthy((r = self.$chop_basename(dest_prefix)))) {
24814
24815        $b = r, $a = $to_ary($b), (dest_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1]));
24816        if ($neqeq(basename, ".")) {
24817          dest_names.$unshift(basename);
24818        }      }      base_prefix = base_directory;
24819      base_names = [];
24820      while ($truthy((r = self.$chop_basename(base_prefix)))) {
24821
24822        $b = r, $a = $to_ary($b), (base_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1]));
24823        if ($neqeq(basename, ".")) {
24824          base_names.$unshift(basename);
24825        }      }      if (!$truthy($$('SAME_PATHS')['$[]'](dest_prefix, base_prefix))) {
24826        self.$raise($$('ArgumentError'), "different prefix: " + (dest_prefix.$inspect()) + " and " + (base_directory.$inspect()));
24827      }      while ($truthy(($truthy(($ret_or_1 = ($truthy(($ret_or_2 = dest_names['$empty?']()['$!']())) ? (base_names['$empty?']()['$!']()) : ($ret_or_2)))) ? ($$('SAME_PATHS')['$[]'](dest_names.$first(), base_names.$first())) : ($ret_or_1)))) {
24828
24829        dest_names.$shift();
24830        base_names.$shift();
24831      }      if ($truthy(base_names['$include?'](".."))) {
24832        self.$raise($$('ArgumentError'), "base_directory has ..: " + (base_directory.$inspect()));
24833      }      base_names.$fill("..");
24834      relpath_names = $rb_plus(base_names, dest_names);
24835      if ($truthy(relpath_names['$empty?']())) {
24836        return $$('Pathname').$new(".")
24837      } else {
24838        return $$('Pathname').$new($send($$('File'), 'join', $to_a(relpath_names)))
24839      }    });
24840
24841    $def(self, '$entries', function $$entries() {
24842      var self = this;
24843
24844      return $send($$('Dir').$entries(self.path), 'map', [], function $$11(f){var self = $$11.$$s == null ? this : $$11.$$s;
24845
24846
24847        if (f == null) f = nil;
24848        return self.$class().$new(f);}, {$$s: self})
24849    });
24850    $alias(self, "===", "==");
24851    $alias(self, "eql?", "==");
24852    $alias(self, "to_s", "to_path");
24853    return $alias(self, "to_str", "to_path");
24854  })($nesting[0], null, $nesting);
24855  return (function($base, $parent_nesting) {
24856    var self = $module($base, 'Kernel');
24857
24858    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
24859
24860    return $def(self, '$Pathname', function $$Pathname(path) {
24861
24862      return $$('Pathname').$new(path)
24863    })
24864  })($nesting[0], $nesting);
24865};
24866
24867Opal.modules["nodejs/pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */
24868  var $klass = Opal.klass, $def = Opal.def, $return_ivar = Opal.return_ivar, self = Opal.top, $nesting = [], nil = Opal.nil;
24869
24870  Opal.add_stubs('require,include,to_str,!,absolute?');
24871
24872  self.$require("pathname");
24873  return (function($base, $super, $parent_nesting) {
24874    var self = $klass($base, $super, 'Pathname');
24875
24876    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
24877    if (self.__path__ == null) self.__path__ = nil;
24878
24879    $proto.path = nil;
24880
24881    self.$include($$('Comparable'));
24882    self.__path__ = __path__;
24883
24884    $def(self, '$absolute?', function $Pathname_absolute$ques$1() {
24885      var self = this;
24886
24887      return __path__.isAbsolute(self.path.$to_str())
24888    });
24889
24890    $def(self, '$relative?', function $Pathname_relative$ques$2() {
24891      var self = this;
24892
24893      return self['$absolute?']()['$!']()
24894    });
24895    return $def(self, '$to_path', $return_ivar("path"));
24896  })($nesting[0], null, $nesting);
24897};
24898
24899Opal.modules["nodejs/env"] = function(Opal) {/* Generated by Opal 1.7.3 */
24900  var $const_set = Opal.const_set, $def = Opal.def, $truthy = Opal.truthy, $return_val = Opal.return_val, $send = Opal.send, $alias = Opal.alias, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil;
24901
24902  Opal.add_stubs('new,to_s,key?,[],raise,to_h,keys,merge');
24903
24904  $const_set($nesting[0], 'ENV', $$('Object').$new());
24905  return (function(self, $parent_nesting) {
24906    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
24907
24908
24909
24910    $def(self, '$[]', function $$$1(name) {
24911
24912      return process.env[name] || nil
24913    });
24914
24915    $def(self, '$[]=', function $$$eq$2(name, value) {
24916
24917      return process.env[name.$to_s()] = value.$to_s()
24918    });
24919
24920    $def(self, '$key?', function $key$ques$3(name) {
24921
24922      return process.env.hasOwnProperty(name)
24923    });
24924
24925    $def(self, '$empty?', function $empty$ques$4() {
24926
24927      return Object.keys(process.env).length === 0;
24928    });
24929
24930    $def(self, '$keys', function $$keys() {
24931
24932      return Object.keys(process.env);
24933    });
24934
24935    $def(self, '$delete', function $delete$5(name) {
24936
24937
24938      var value = process.env[name] || nil;
24939      delete process.env[name];
24940      return value;
24941
24942    });
24943
24944    $def(self, '$fetch', function $$fetch(key, default_value) {
24945      var block = $$fetch.$$p || nil, self = this;
24946
24947      $$fetch.$$p = null;
24948      if ($truthy(self['$key?'](key))) {
24949        return self['$[]'](key)
24950      }      if ((block !== nil)) {
24951        return Opal.yield1(block, key)
24952      }      if (!$truthy(typeof(default_value) === 'undefined')) {
24953        return default_value
24954      }      return self.$raise($$('KeyError'), "key not found");
24955    }, -2);
24956
24957    $def(self, '$to_s', $return_val("ENV"));
24958
24959    $def(self, '$to_h', function $$to_h() {
24960      var self = this;
24961
24962      return $send(self.$keys(), 'to_h', [], function $$6(k){var self = $$6.$$s == null ? this : $$6.$$s;
24963
24964
24965        if (k == null) k = nil;
24966        return [k, self['$[]'](k)];}, {$$s: self})
24967    });
24968
24969    $def(self, '$merge', function $$merge(keys) {
24970      var self = this;
24971
24972      return self.$to_h().$merge(keys)
24973    });
24974    $alias(self, "has_key?", "key?");
24975    $alias(self, "include?", "key?");
24976    $alias(self, "inspect", "to_s");
24977    $alias(self, "member?", "key?");
24978    return $alias(self, "to_hash", "to_h");
24979  })(Opal.get_singleton_class($$('ENV')), $nesting);
24980};
24981
24982Opal.modules["nodejs"] = function(Opal) {/* Generated by Opal 1.7.3 */
24983  var self = Opal.top; Opal.nil;
24984
24985  Opal.add_stubs('require');
24986
24987  self.$require("nodejs/base");
24988  self.$require("nodejs/file");
24989  self.$require("nodejs/dir");
24990  self.$require("nodejs/io");
24991  self.$require("nodejs/argf");
24992  self.$require("nodejs/open-uri");
24993  self.$require("nodejs/pathname");
24994  return self.$require("nodejs/env");
24995};
24996
24997Opal.modules["corelib/comparable"] = function(Opal) {/* Generated by Opal 1.7.3 */
24998  var $truthy = Opal.truthy, $module = Opal.module, $rb_gt = Opal.rb_gt, $rb_lt = Opal.rb_lt, $eqeqeq = Opal.eqeqeq, $Kernel = Opal.Kernel, $def = Opal.def, nil = Opal.nil, $$$ = Opal.$$$;
24999
25000  Opal.add_stubs('>,<,===,raise,class,<=>,equal?');
25001  return (function($base) {
25002    var self = $module($base, 'Comparable');
25003
25004    var $ret_or_1 = nil;
25005
25006
25007
25008    function normalize(what) {
25009      if (Opal.is_a(what, Opal.Integer)) { return what; }
25010
25011      if ($rb_gt(what, 0)) { return 1; }
25012      if ($rb_lt(what, 0)) { return -1; }
25013      return 0;
25014    }
25015
25016    function fail_comparison(lhs, rhs) {
25017      var class_name;
25018      (($eqeqeq(nil, ($ret_or_1 = rhs)) || (($eqeqeq(true, $ret_or_1) || (($eqeqeq(false, $ret_or_1) || (($eqeqeq($$$('Integer'), $ret_or_1) || ($eqeqeq($$$('Float'), $ret_or_1))))))))) ? (class_name = rhs.$inspect()) : (class_name = rhs.$$class));
25019      $Kernel.$raise($$$('ArgumentError'), "comparison of " + ((lhs).$class()) + " with " + (class_name) + " failed");
25020    }
25021
25022    function cmp_or_fail(lhs, rhs) {
25023      var cmp = (lhs)['$<=>'](rhs);
25024      if (!$truthy(cmp)) fail_comparison(lhs, rhs);
25025      return normalize(cmp);
25026    }
25027
25028    $def(self, '$==', function $Comparable_$eq_eq$1(other) {
25029      var self = this, cmp = nil;
25030
25031
25032      if ($truthy(self['$equal?'](other))) {
25033        return true
25034      }
25035      if (self["$<=>"] == Opal.Kernel["$<=>"]) {
25036        return false;
25037      }
25038
25039      // check for infinite recursion
25040      if (self.$$comparable) {
25041        self.$$comparable = false;
25042        return false;
25043      }
25044      if (!$truthy((cmp = self['$<=>'](other)))) {
25045        return false
25046      }      return normalize(cmp) == 0;    });
25047
25048    $def(self, '$>', function $Comparable_$gt$2(other) {
25049      var self = this;
25050
25051      return cmp_or_fail(self, other) > 0;
25052    });
25053
25054    $def(self, '$>=', function $Comparable_$gt_eq$3(other) {
25055      var self = this;
25056
25057      return cmp_or_fail(self, other) >= 0;
25058    });
25059
25060    $def(self, '$<', function $Comparable_$lt$4(other) {
25061      var self = this;
25062
25063      return cmp_or_fail(self, other) < 0;
25064    });
25065
25066    $def(self, '$<=', function $Comparable_$lt_eq$5(other) {
25067      var self = this;
25068
25069      return cmp_or_fail(self, other) <= 0;
25070    });
25071
25072    $def(self, '$between?', function $Comparable_between$ques$6(min, max) {
25073      var self = this;
25074
25075
25076      if ($rb_lt(self, min)) {
25077        return false
25078      }      if ($rb_gt(self, max)) {
25079        return false
25080      }      return true;
25081    });
25082    return $def(self, '$clamp', function $$clamp(min, max) {
25083      var self = this;
25084
25085
25086      if (max == null) max = nil;
25087
25088      var c, excl;
25089
25090      if (max === nil) {
25091        // We are dealing with a new Ruby 2.7 behaviour that we are able to
25092        // provide a single Range argument instead of 2 Comparables.
25093
25094        if (!Opal.is_a(min, Opal.Range)) {
25095          $Kernel.$raise($$$('TypeError'), "wrong argument type " + (min.$class()) + " (expected Range)");
25096        }
25097
25098        excl = min.excl;
25099        max = min.end;
25100        min = min.begin;
25101
25102        if (max !== nil && excl) {
25103          $Kernel.$raise($$$('ArgumentError'), "cannot clamp with an exclusive range");
25104        }
25105      }
25106
25107      if (min !== nil && max !== nil && cmp_or_fail(min, max) > 0) {
25108        $Kernel.$raise($$$('ArgumentError'), "min argument must be smaller than max argument");
25109      }
25110
25111      if (min !== nil) {
25112        c = cmp_or_fail(self, min);
25113
25114        if (c == 0) return self;
25115        if (c < 0) return min;
25116      }
25117
25118      if (max !== nil) {
25119        c = cmp_or_fail(self, max);
25120
25121        if (c > 0) return max;
25122      }
25123
25124      return self;
25125    }, -2);
25126  })('::')
25127};
25128
25129Opal.modules["pathname"] = function(Opal) {/* Generated by Opal 1.7.3 */
25130  var $klass = Opal.klass, $const_set = Opal.const_set, $regexp = Opal.regexp, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $eqeq = Opal.eqeq, $def = Opal.def, $defs = Opal.defs, $to_ary = Opal.to_ary, $slice = Opal.slice, $send = Opal.send, $to_a = Opal.to_a, $return_ivar = Opal.return_ivar, $neqeq = Opal.neqeq, $rb_plus = Opal.rb_plus, $not = Opal.not, $thrower = Opal.thrower, $alias = Opal.alias, $module = Opal.module, self = Opal.top, $nesting = [], nil = Opal.nil, $$$ = Opal.$$$;
25131
25132  Opal.add_stubs('require,include,quote,===,to_s,path,respond_to?,to_path,is_a?,nil?,raise,class,==,new,pwd,attr_reader,!,relative?,chop_basename,basename,=~,source,[],rindex,sub,absolute?,expand_path,plus,unshift,length,!=,empty?,first,shift,+,join,dirname,pop,reverse_each,directory?,extname,<=>,nonzero?,proc,casecmp,cleanpath,inspect,include?,fill,map,entries');
25133
25134  self.$require("corelib/comparable");
25135  (function($base, $super, $parent_nesting) {
25136    var self = $klass($base, $super, 'Pathname');
25137
25138    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
25139
25140    $proto.path = nil;
25141
25142    self.$include($$('Comparable'));
25143    $const_set($nesting[0], 'SEPARATOR_PAT', $regexp([$$('Regexp').$quote($$$($$('File'), 'SEPARATOR'))]));
25144
25145    $def(self, '$initialize', function $$initialize(path) {
25146      var self = this;
25147
25148
25149      if ($eqeqeq($$('Pathname'), path)) {
25150        self.path = path.$path().$to_s();
25151      } else if ($truthy(path['$respond_to?']("to_path"))) {
25152        self.path = path.$to_path();
25153      } else if ($truthy(path['$is_a?']($$('String')))) {
25154        self.path = path;
25155      } else if ($truthy(path['$nil?']())) {
25156        self.$raise($$('TypeError'), "no implicit conversion of nil into String");
25157      } else {
25158        self.$raise($$('TypeError'), "no implicit conversion of " + (path.$class()) + " into String");
25159      }      if ($eqeq(self.path, "\u0000")) {
25160        return self.$raise($$('ArgumentError'))
25161      } else {
25162        return nil
25163      }    });
25164    $defs(self, '$pwd', function $$pwd() {
25165      var self = this;
25166
25167      return self.$new($$('Dir').$pwd())
25168    });
25169    self.$attr_reader("path");
25170
25171    $def(self, '$==', function $Pathname_$eq_eq$1(other) {
25172      var self = this;
25173
25174      return other.$path()['$=='](self.path)
25175    });
25176
25177    $def(self, '$absolute?', function $Pathname_absolute$ques$2() {
25178      var self = this;
25179
25180      return self['$relative?']()['$!']()
25181    });
25182
25183    $def(self, '$relative?', function $Pathname_relative$ques$3() {
25184      var $a, $b, self = this, path = nil, r = nil;
25185
25186
25187      path = self.path;
25188      while ($truthy((r = self.$chop_basename(path)))) {
25189      $b = r, $a = $to_ary($b), (path = ($a[0] == null ? nil : $a[0]));
25190      }      return path['$==']("");
25191    });
25192
25193    $def(self, '$chop_basename', function $$chop_basename(path) {
25194      var base = nil;
25195
25196
25197      base = $$('File').$basename(path);
25198      if ($truthy($$('Regexp').$new("^" + ($$$($$('Pathname'), 'SEPARATOR_PAT').$source()) + "?$")['$=~'](base))) {
25199        return nil
25200      } else {
25201        return [path['$[]'](0, path.$rindex(base)), base]
25202      }    });
25203
25204    $def(self, '$root?', function $Pathname_root$ques$4() {
25205      var self = this;
25206
25207      return self.path['$==']("/")
25208    });
25209
25210    $def(self, '$parent', function $$parent() {
25211      var self = this, new_path = nil;
25212
25213
25214      new_path = self.path.$sub(/\/([^\/]+\/?$)/, "");
25215      if ($eqeq(new_path, "")) {
25216        new_path = ($truthy(self['$absolute?']()) ? ("/") : ("."));
25217      }      return $$('Pathname').$new(new_path);
25218    });
25219
25220    $def(self, '$sub', function $$sub($a) {
25221      var $post_args, args, self = this;
25222
25223
25224      $post_args = $slice(arguments);
25225      args = $post_args;
25226      return $$('Pathname').$new($send(self.path, 'sub', $to_a(args)));
25227    }, -1);
25228
25229    $def(self, '$cleanpath', function $$cleanpath() {
25230      var self = this;
25231
25232      return Opal.normalize(self.path)
25233    });
25234
25235    $def(self, '$to_path', $return_ivar("path"));
25236
25237    $def(self, '$hash', $return_ivar("path"));
25238
25239    $def(self, '$expand_path', function $$expand_path() {
25240      var self = this;
25241
25242      return $$('Pathname').$new($$('File').$expand_path(self.path))
25243    });
25244
25245    $def(self, '$+', function $Pathname_$plus$5(other) {
25246      var self = this;
25247
25248
25249      if (!$eqeqeq($$('Pathname'), other)) {
25250        other = $$('Pathname').$new(other);
25251      }      return $$('Pathname').$new(self.$plus(self.path, other.$to_s()));
25252    });
25253
25254    $def(self, '$plus', function $$plus(path1, path2) {
25255      var $a, $b, self = this, prefix2 = nil, index_list2 = nil, basename_list2 = nil, r2 = nil, basename2 = nil, prefix1 = nil, $ret_or_1 = nil, r1 = nil, basename1 = nil, suffix2 = nil;
25256
25257
25258      prefix2 = path2;
25259      index_list2 = [];
25260      basename_list2 = [];
25261      while ($truthy((r2 = self.$chop_basename(prefix2)))) {
25262
25263        $b = r2, $a = $to_ary($b), (prefix2 = ($a[0] == null ? nil : $a[0])), (basename2 = ($a[1] == null ? nil : $a[1]));
25264        index_list2.$unshift(prefix2.$length());
25265        basename_list2.$unshift(basename2);
25266      }      if ($neqeq(prefix2, "")) {
25267        return path2
25268      }      prefix1 = path1;
25269      while ($truthy(true)) {
25270
25271        while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$=='](".")) : ($ret_or_1)))) {
25272
25273          index_list2.$shift();
25274          basename_list2.$shift();
25275        }        if (!$truthy((r1 = self.$chop_basename(prefix1)))) {
25276          break
25277        }        $b = r1, $a = $to_ary($b), (prefix1 = ($a[0] == null ? nil : $a[0])), (basename1 = ($a[1] == null ? nil : $a[1]));
25278        if ($eqeq(basename1, ".")) {
25279          continue
25280        }        if ((($eqeq(basename1, "..") || ($truthy(basename_list2['$empty?']()))) || ($neqeq(basename_list2.$first(), "..")))) {
25281
25282          prefix1 = $rb_plus(prefix1, basename1);
25283          break;
25284        }        index_list2.$shift();
25285        basename_list2.$shift();
25286      }      r1 = self.$chop_basename(prefix1);
25287      if (($not(r1) && ($truthy($regexp([$$('SEPARATOR_PAT')])['$=~']($$('File').$basename(prefix1)))))) {
25288        while ($truthy(($truthy(($ret_or_1 = basename_list2['$empty?']()['$!']())) ? (basename_list2.$first()['$==']("..")) : ($ret_or_1)))) {
25289
25290          index_list2.$shift();
25291          basename_list2.$shift();
25292        }
25293      }      if ($not(basename_list2['$empty?']())) {
25294
25295        suffix2 = path2['$[]'](Opal.Range.$new(index_list2.$first(), -1, false));
25296        if ($truthy(r1)) {
25297          return $$('File').$join(prefix1, suffix2)
25298        } else {
25299          return $rb_plus(prefix1, suffix2)
25300        }      } else if ($truthy(r1)) {
25301        return prefix1
25302      } else {
25303        return $$('File').$dirname(prefix1)
25304      }    });
25305
25306    $def(self, '$join', function $$join($a) {try { var $t_return = $thrower('return');
25307      var $post_args, args, self = this, result = nil;
25308
25309
25310      $post_args = $slice(arguments);
25311      args = $post_args;
25312      if ($truthy(args['$empty?']())) {
25313        return self
25314      };
25315      result = args.$pop();
25316      if (!$eqeqeq($$('Pathname'), result)) {
25317        result = $$('Pathname').$new(result);
25318      };
25319      if ($truthy(result['$absolute?']())) {
25320        return result
25321      };
25322      $send(args, 'reverse_each', [], function $$6(arg){
25323
25324        if (arg == null) arg = nil;
25325        if (!$eqeqeq($$('Pathname'), arg)) {
25326          arg = $$('Pathname').$new(arg);
25327        };
25328        result = $rb_plus(arg, result);
25329        if ($truthy(result['$absolute?']())) {
25330          $t_return.$throw(result);
25331        } else {
25332          return nil
25333        };}, {$$ret: $t_return});
25334      return $rb_plus(self, result);} catch($e) {
25335        if ($e === $t_return) return $e.$v;
25336        throw $e;
25337      }
25338    }, -1);
25339
25340    $def(self, '$split', function $$split() {
25341      var self = this;
25342
25343      return [self.$dirname(), self.$basename()]
25344    });
25345
25346    $def(self, '$dirname', function $$dirname() {
25347      var self = this;
25348
25349      return $$('Pathname').$new($$('File').$dirname(self.path))
25350    });
25351
25352    $def(self, '$basename', function $$basename() {
25353      var self = this;
25354
25355      return $$('Pathname').$new($$('File').$basename(self.path))
25356    });
25357
25358    $def(self, '$directory?', function $Pathname_directory$ques$7() {
25359      var self = this;
25360
25361      return $$('File')['$directory?'](self.path)
25362    });
25363
25364    $def(self, '$extname', function $$extname() {
25365      var self = this;
25366
25367      return $$('File').$extname(self.path)
25368    });
25369
25370    $def(self, '$<=>', function $Pathname_$lt_eq_gt$8(other) {
25371      var self = this;
25372
25373      return self.$path()['$<=>'](other.$path())
25374    });
25375    $const_set($nesting[0], 'SAME_PATHS', ($truthy($$$($$('File'), 'FNM_SYSCASE')['$nonzero?']()) ? ($send(self, 'proc', [], function $Pathname$9(a, b){
25376
25377      if (a == null) a = nil;
25378      if (b == null) b = nil;
25379      return a.$casecmp(b)['$=='](0);})) : ($send(self, 'proc', [], function $Pathname$10(a, b){
25380
25381      if (a == null) a = nil;
25382      if (b == null) b = nil;
25383      return a['$=='](b);}))));
25384
25385    $def(self, '$relative_path_from', function $$relative_path_from(base_directory) {
25386      var $a, $b, self = this, dest_directory = nil, dest_prefix = nil, dest_names = nil, r = nil, basename = nil, base_prefix = nil, base_names = nil, $ret_or_1 = nil, $ret_or_2 = nil, relpath_names = nil;
25387
25388
25389      dest_directory = self.$cleanpath().$to_s();
25390      base_directory = base_directory.$cleanpath().$to_s();
25391      dest_prefix = dest_directory;
25392      dest_names = [];
25393      while ($truthy((r = self.$chop_basename(dest_prefix)))) {
25394
25395        $b = r, $a = $to_ary($b), (dest_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1]));
25396        if ($neqeq(basename, ".")) {
25397          dest_names.$unshift(basename);
25398        }      }      base_prefix = base_directory;
25399      base_names = [];
25400      while ($truthy((r = self.$chop_basename(base_prefix)))) {
25401
25402        $b = r, $a = $to_ary($b), (base_prefix = ($a[0] == null ? nil : $a[0])), (basename = ($a[1] == null ? nil : $a[1]));
25403        if ($neqeq(basename, ".")) {
25404          base_names.$unshift(basename);
25405        }      }      if (!$truthy($$('SAME_PATHS')['$[]'](dest_prefix, base_prefix))) {
25406        self.$raise($$('ArgumentError'), "different prefix: " + (dest_prefix.$inspect()) + " and " + (base_directory.$inspect()));
25407      }      while ($truthy(($truthy(($ret_or_1 = ($truthy(($ret_or_2 = dest_names['$empty?']()['$!']())) ? (base_names['$empty?']()['$!']()) : ($ret_or_2)))) ? ($$('SAME_PATHS')['$[]'](dest_names.$first(), base_names.$first())) : ($ret_or_1)))) {
25408
25409        dest_names.$shift();
25410        base_names.$shift();
25411      }      if ($truthy(base_names['$include?'](".."))) {
25412        self.$raise($$('ArgumentError'), "base_directory has ..: " + (base_directory.$inspect()));
25413      }      base_names.$fill("..");
25414      relpath_names = $rb_plus(base_names, dest_names);
25415      if ($truthy(relpath_names['$empty?']())) {
25416        return $$('Pathname').$new(".")
25417      } else {
25418        return $$('Pathname').$new($send($$('File'), 'join', $to_a(relpath_names)))
25419      }    });
25420
25421    $def(self, '$entries', function $$entries() {
25422      var self = this;
25423
25424      return $send($$('Dir').$entries(self.path), 'map', [], function $$11(f){var self = $$11.$$s == null ? this : $$11.$$s;
25425
25426
25427        if (f == null) f = nil;
25428        return self.$class().$new(f);}, {$$s: self})
25429    });
25430    $alias(self, "===", "==");
25431    $alias(self, "eql?", "==");
25432    $alias(self, "to_s", "to_path");
25433    return $alias(self, "to_str", "to_path");
25434  })($nesting[0], null, $nesting);
25435  return (function($base, $parent_nesting) {
25436    var self = $module($base, 'Kernel');
25437
25438    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting);
25439
25440    return $def(self, '$Pathname', function $$Pathname(path) {
25441
25442      return $$('Pathname').$new(path)
25443    })
25444  })($nesting[0], $nesting);
25445};
25446
25447Opal.modules["stringio"] = function(Opal) {/* Generated by Opal 1.7.3 */
25448  var $klass = Opal.klass, $defs = Opal.defs, $send2 = Opal.send2, $find_super = Opal.find_super, $def = Opal.def, $eqeqeq = Opal.eqeqeq, $truthy = Opal.truthy, $rb_ge = Opal.rb_ge, $rb_gt = Opal.rb_gt, $rb_plus = Opal.rb_plus, $rb_minus = Opal.rb_minus, $return_ivar = Opal.return_ivar, $eqeq = Opal.eqeq, $alias = Opal.alias, $nesting = [], $$ = Opal.$r($nesting), nil = Opal.nil, $$$ = Opal.$$$;
25449
25450  Opal.add_stubs('new,call,close,attr_accessor,check_readable,==,length,===,>=,raise,>,+,-,seek,check_writable,String,[],eof?,write,read,tell');
25451  return (function($base, $super, $parent_nesting) {
25452    var self = $klass($base, $super, 'StringIO');
25453
25454    var $nesting = [self].concat($parent_nesting), $$ = Opal.$r($nesting), $proto = self.$$prototype;
25455
25456    $proto.position = $proto.string = nil;
25457
25458    $defs(self, '$open', function $$open(string, mode) {
25459      var block = $$open.$$p || nil, self = this, io = nil, res = nil;
25460
25461      $$open.$$p = null;
25462      if (string == null) string = "";
25463      if (mode == null) mode = nil;
25464      io = self.$new(string, mode);
25465      res = block.$call(io);
25466      io.$close();
25467      return res;
25468    }, -1);
25469    self.$attr_accessor("string");
25470
25471    $def(self, '$initialize', function $$initialize(string, mode) {
25472      var self = this;
25473
25474      $$initialize.$$p = null;
25475
25476      if (string == null) string = "";
25477      if (mode == null) mode = "rw";
25478      self.string = string;
25479      self.position = 0;
25480      return $send2(self, $find_super(self, 'initialize', $$initialize, false, true), 'initialize', [nil, mode], null);
25481    }, -1);
25482
25483    $def(self, '$eof?', function $StringIO_eof$ques$1() {
25484      var self = this;
25485
25486
25487      self.$check_readable();
25488      return self.position['$=='](self.string.$length());
25489    });
25490
25491    $def(self, '$seek', function $$seek(pos, whence) {
25492      var self = this, $ret_or_1 = nil;
25493
25494
25495      if (whence == null) whence = $$$($$('IO'), 'SEEK_SET');
25496      self.read_buffer = "";
25497      if ($eqeqeq($$$($$('IO'), 'SEEK_SET'), ($ret_or_1 = whence))) {
25498
25499        if (!$truthy($rb_ge(pos, 0))) {
25500          self.$raise($$$($$('Errno'), 'EINVAL'));
25501        }        self.position = pos;
25502      } else if ($eqeqeq($$$($$('IO'), 'SEEK_CUR'), $ret_or_1)) {
25503        if ($truthy($rb_gt($rb_plus(self.position, pos), self.string.$length()))) {
25504          self.position = self.string.$length();
25505        } else {
25506          self.position = $rb_plus(self.position, pos);
25507        }
25508      } else if ($eqeqeq($$$($$('IO'), 'SEEK_END'), $ret_or_1)) {
25509        if ($truthy($rb_gt(pos, self.string.$length()))) {
25510          self.position = 0;
25511        } else {
25512          self.position = $rb_minus(self.position, pos);
25513        }
25514      } else ;      return 0;
25515    }, -2);
25516
25517    $def(self, '$tell', $return_ivar("position"));
25518
25519    $def(self, '$rewind', function $$rewind() {
25520      var self = this;
25521
25522      return self.$seek(0)
25523    });
25524
25525    $def(self, '$write', function $$write(string) {
25526      var self = this, before = nil, after = nil;
25527
25528
25529      self.$check_writable();
25530      self.read_buffer = "";
25531      string = self.$String(string);
25532      if ($eqeq(self.string.$length(), self.position)) {
25533
25534        self.string = $rb_plus(self.string, string);
25535        return (self.position = $rb_plus(self.position, string.$length()));
25536      } else {
25537
25538        before = self.string['$[]'](Opal.Range.$new(0, $rb_minus(self.position, 1), false));
25539        after = self.string['$[]'](Opal.Range.$new($rb_plus(self.position, string.$length()), -1, false));
25540        self.string = $rb_plus($rb_plus(before, string), after);
25541        return (self.position = $rb_plus(self.position, string.$length()));
25542      }    });
25543
25544    $def(self, '$read', function $$read(length, outbuf) {
25545      var self = this, string = nil, str = nil;
25546
25547
25548      if (length == null) length = nil;
25549      if (outbuf == null) outbuf = nil;
25550      self.$check_readable();
25551      if ($truthy(self['$eof?']())) {
25552        return nil
25553      }      string = ($truthy(length) ? (((str = self.string['$[]'](self.position, length)), (self.position = $rb_plus(self.position, length)), ($truthy($rb_gt(self.position, self.string.$length())) ? ((self.position = self.string.$length())) : nil), str)) : (((str = self.string['$[]'](Opal.Range.$new(self.position, -1, false))), (self.position = self.string.$length()), str)));
25554      if ($truthy(outbuf)) {
25555        return outbuf.$write(string)
25556      } else {
25557        return string
25558      }    }, -1);
25559
25560    $def(self, '$sysread', function $$sysread(length) {
25561      var self = this;
25562
25563
25564      self.$check_readable();
25565      return self.$read(length);
25566    });
25567    $alias(self, "eof", "eof?");
25568    $alias(self, "pos", "tell");
25569    $alias(self, "pos=", "seek");
25570    return $alias(self, "readpartial", "read");
25571  })($nesting[0], $$('IO'), $nesting)
25572};
25573
25574module.exports = Opal$1;
25575