public
Fork of rails/rails
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/ddollar/rails.git
Search Repo:
Update to Prototype -r8232

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8234 
5ecf4fe2-1ee6-0310-87b1-e25e094e27de
sstephenson (author)
Wed Nov 28 16:39:59 -0800 2007
commit  ab73a988aca073e6ff16cd608df6e2e08808d31c
tree    36c6f6c77c413b0829ceb64449bfa359f7c33741
parent  54a75de3ecabf5dd07a60c27d21fc4e0671904c0
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 *2.0.0 [RC2]* (November 28th, 2007)
0
 
0
+* Update to Prototype -r8232. [sam]
0
+
0
 * Make sure the optimisation code for routes doesn't get used if :host, :anchor or :port are provided in the hash arguments. [pager, Koz] #10292
0
 
0
 * Added protection from trailing slashes on page caching #10229 [devrieda]
...
36
37
38
39
40
41
42
43
...
110
111
112
113
 
114
115
116
...
135
136
137
138
 
139
140
141
...
204
205
206
207
 
208
209
210
...
351
352
353
354
 
355
356
357
...
366
367
368
369
 
370
371
372
...
486
487
488
489
 
 
 
490
491
492
...
565
566
567
568
 
 
569
570
571
...
686
687
688
689
 
690
691
692
...
713
714
715
716
 
717
718
719
...
724
725
726
727
 
728
729
730
...
904
905
906
907
 
908
909
910
...
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
...
1023
1024
1025
1026
 
 
 
 
 
 
 
 
1027
1028
1029
...
1187
1188
1189
 
1190
1191
 
 
1192
1193
1194
...
1371
1372
1373
1374
 
1375
1376
1377
...
1417
1418
1419
1420
1421
 
 
 
1422
1423
 
1424
1425
1426
...
1434
1435
1436
1437
 
1438
1439
 
1440
1441
 
1442
1443
1444
...
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
...
1690
1691
1692
1693
 
1694
1695
1696
...
1795
1796
1797
1798
 
1799
1800
1801
 
 
1802
1803
1804
...
1867
1868
1869
 
1870
1871
1872
...
1882
1883
1884
1885
 
1886
1887
1888
...
1921
1922
1923
1924
 
1925
1926
1927
...
2301
2302
2303
2304
 
2305
2306
2307
...
2719
2720
2721
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2722
2723
2724
 
2725
2726
2727
...
2844
2845
2846
2847
 
 
 
 
2848
 
2849
2850
2851
...
2874
2875
2876
2877
 
2878
2879
2880
...
3051
3052
3053
3054
 
3055
3056
3057
...
3323
3324
3325
3326
 
 
3327
3328
3329
...
3336
3337
3338
 
 
 
 
 
 
 
 
 
 
3339
3340
3341
...
3347
3348
3349
3350
 
3351
3352
3353
...
3545
3546
3547
3548
 
3549
3550
3551
3552
3553
 
3554
3555
3556
3557
3558
 
3559
3560
3561
...
3746
3747
3748
3749
 
 
 
3750
3751
3752
...
3938
3939
3940
3941
 
3942
3943
3944
...
36
37
38
 
 
39
40
41
...
108
109
110
 
111
112
113
114
...
133
134
135
 
136
137
138
139
...
202
203
204
 
205
206
207
208
...
349
350
351
 
352
353
354
355
...
364
365
366
 
367
368
369
370
...
484
485
486
 
487
488
489
490
491
492
...
565
566
567
 
568
569
570
571
572
...
687
688
689
 
690
691
692
693
...
714
715
716
 
717
718
719
720
...
725
726
727
 
728
729
730
731
...
905
906
907
 
908
909
910
911
...
985
986
987
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
988
989
990
...
996
997
998
 
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
...
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
...
1354
1355
1356
 
1357
1358
1359
1360
...
1400
1401
1402
 
 
1403
1404
1405
1406
 
1407
1408
1409
1410
...
1418
1419
1420
 
1421
1422
 
1423
1424
 
1425
1426
1427
1428
...
1444
1445
1446
 
 
 
 
1447
1448
1449
...
1670
1671
1672
 
1673
1674
1675
1676
...
1775
1776
1777
 
1778
1779
1780
 
1781
1782
1783
1784
1785
...
1848
1849
1850
1851
1852
1853
1854
...
1864
1865
1866
 
1867
1868
1869
1870
...
1903
1904
1905
 
1906
1907
1908
1909
...
2283
2284
2285
 
2286
2287
2288
2289
...
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
 
 
2723
2724
2725
2726
...
2843
2844
2845
 
2846
2847
2848
2849
2850
2851
2852
2853
2854
...
2877
2878
2879
 
2880
2881
2882
2883
...
3054
3055
3056
 
3057
3058
3059
3060
...
3326
3327
3328
 
3329
3330
3331
3332
3333
...
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
...
3361
3362
3363
 
3364
3365
3366
3367
...
3559
3560
3561
 
3562
3563
3564
3565
3566
 
3567
3568
3569
3570
3571
 
3572
3573
3574
3575
...
3760
3761
3762
 
3763
3764
3765
3766
3767
3768
...
3954
3955
3956
 
3957
3958
3959
3960
0
@@ -36,8 +36,6 @@ var Prototype = {
0
 if (Prototype.Browser.MobileSafari)
0
   Prototype.BrowserFeatures.SpecificElementExtensions = false;
0
 
0
-if (Prototype.Browser.WebKit)
0
- Prototype.BrowserFeatures.XPath = false;
0
 
0
 /* Based on Alex Arnell's inheritance implementation. */
0
 var Class = {
0
@@ -110,7 +108,7 @@ Object.extend = function(destination, source) {
0
 Object.extend(Object, {
0
   inspect: function(object) {
0
     try {
0
- if (object === undefined) return 'undefined';
0
+ if (Object.isUndefined(object)) return 'undefined';
0
       if (object === null) return 'null';
0
       return object.inspect ? object.inspect() : object.toString();
0
     } catch (e) {
0
@@ -135,7 +133,7 @@ Object.extend(Object, {
0
     var results = [];
0
     for (var property in object) {
0
       var value = Object.toJSON(object[property]);
0
- if (value !== undefined)
0
+ if (!Object.isUndefined(value))
0
         results.push(property.toJSON() + ': ' + value);
0
     }
0
 
0
@@ -204,7 +202,7 @@ Object.extend(Function.prototype, {
0
   },
0
 
0
   bind: function() {
0
- if (arguments.length < 2 && arguments[0] === undefined) return this;
0
+ if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
0
     var __method = this, args = $A(arguments), object = args.shift();
0
     return function() {
0
       return __method.apply(object, args.concat($A(arguments)));
0
@@ -351,7 +349,7 @@ Object.extend(String.prototype, {
0
 
0
   sub: function(pattern, replacement, count) {
0
     replacement = this.gsub.prepareReplacement(replacement);
0
- count = count === undefined ? 1 : count;
0
+ count = Object.isUndefined(count) ? 1 : count;
0
 
0
     return this.gsub(pattern, function(match) {
0
       if (--count < 0) return match[0];
0
@@ -366,7 +364,7 @@ Object.extend(String.prototype, {
0
 
0
   truncate: function(length, truncation) {
0
     length = length || 30;
0
- truncation = truncation === undefined ? '...' : truncation;
0
+ truncation = Object.isUndefined(truncation) ? '...' : truncation;
0
     return this.length > length ?
0
       this.slice(0, length - truncation.length) + truncation : String(this);
0
   },
0
@@ -486,7 +484,9 @@ Object.extend(String.prototype, {
0
   },
0
 
0
   isJSON: function() {
0
- var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
0
+ var str = this;
0
+ if (str.blank()) return false;
0
+ str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
0
     return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
0
   },
0
 
0
@@ -565,7 +565,8 @@ var Template = Class.create({
0
       if (before == '\\') return match[2];
0
 
0
       var ctx = object, expr = match[3];
0
- var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
0
+ var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
0
+ match = pattern.exec(expr);
0
       if (match == null) return before;
0
 
0
       while (match != null) {
0
@@ -686,7 +687,7 @@ var Enumerable = {
0
   },
0
 
0
   inGroupsOf: function(number, fillWith) {
0
- fillWith = fillWith === undefined ? null : fillWith;
0
+ fillWith = Object.isUndefined(fillWith) ? null : fillWith;
0
     return this.eachSlice(number, function(slice) {
0
       while(slice.length < number) slice.push(fillWith);
0
       return slice;
0
@@ -713,7 +714,7 @@ var Enumerable = {
0
     var result;
0
     this.each(function(value, index) {
0
       value = iterator(value, index);
0
- if (result == undefined || value >= result)
0
+ if (result == null || value >= result)
0
         result = value;
0
     });
0
     return result;
0
@@ -724,7 +725,7 @@ var Enumerable = {
0
     var result;
0
     this.each(function(value, index) {
0
       value = iterator(value, index);
0
- if (result == undefined || value < result)
0
+ if (result == null || value < result)
0
         result = value;
0
     });
0
     return result;
0
@@ -904,7 +905,7 @@ Object.extend(Array.prototype, {
0
     var results = [];
0
     this.each(function(object) {
0
       var value = Object.toJSON(object);
0
- if (value !== undefined) results.push(value);
0
+ if (!Object.isUndefined(value)) results.push(value);
0
     });
0
     return '[' + results.join(', ') + ']';
0
   }
0
@@ -984,34 +985,6 @@ function $H(object) {
0
 };
0
 
0
 var Hash = Class.create(Enumerable, (function() {
0
- if (function() {
0
- var i = 0, Test = function(value) { this.key = value };
0
- Test.prototype.key = 'foo';
0
- for (var property in new Test('bar')) i++;
0
- return i > 1;
0
- }()) {
0
- function each(iterator) {
0
- var cache = [];
0
- for (var key in this._object) {
0
- var value = this._object[key];
0
- if (cache.include(key)) continue;
0
- cache.push(key);
0
- var pair = [key, value];
0
- pair.key = key;
0
- pair.value = value;
0
- iterator(pair);
0
- }
0
- }
0
- } else {
0
- function each(iterator) {
0
- for (var key in this._object) {
0
- var value = this._object[key], pair = [key, value];
0
- pair.key = key;
0
- pair.value = value;
0
- iterator(pair);
0
- }
0
- }
0
- }
0
 
0
   function toQueryPair(key, value) {
0
     if (Object.isUndefined(value)) return key;
0
@@ -1023,7 +996,14 @@ var Hash = Class.create(Enumerable, (function() {
0
       this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
0
     },
0
 
0
- _each: each,
0
+ _each: function(iterator) {
0
+ for (var key in this._object) {
0
+ var value = this._object[key], pair = [key, value];
0
+ pair.key = key;
0
+ pair.value = value;
0
+ iterator(pair);
0
+ }
0
+ },
0
 
0
     set: function(key, value) {
0
       return this._object[key] = value;
0
@@ -1187,8 +1167,11 @@ Ajax.Base = Class.create({
0
     Object.extend(this.options, options || { });
0
 
0
     this.options.method = this.options.method.toLowerCase();
0
+
0
     if (Object.isString(this.options.parameters))
0
       this.options.parameters = this.options.parameters.toQueryParams();
0
+ else if (Object.isHash(this.options.parameters))
0
+ this.options.parameters = this.options.parameters.toObject();
0
   }
0
 });
0
 
0
@@ -1371,7 +1354,7 @@ Ajax.Response = Class.create({
0
 
0
     if(readyState == 4) {
0
       var xml = transport.responseXML;
0
- this.responseXML = xml === undefined ? null : xml;
0
+ this.responseXML = Object.isUndefined(xml) ? null : xml;
0
       this.responseJSON = this._getResponseJSON();
0
     }
0
   },
0
@@ -1417,10 +1400,11 @@ Ajax.Response = Class.create({
0
   _getResponseJSON: function() {
0
     var options = this.request.options;
0
     if (!options.evalJSON || (options.evalJSON != 'force' &&
0
- !(this.getHeader('Content-type') || '').include('application/json')))
0
- return null;
0
+ !(this.getHeader('Content-type') || '').include('application/json')) ||
0
+ this.responseText.blank())
0
+ return null;
0
     try {
0
- return this.transport.responseText.evalJSON(options.sanitizeJSON);
0
+ return this.responseText.evalJSON(options.sanitizeJSON);
0
     } catch (e) {
0
       this.request.dispatchException(e);
0
     }
0
@@ -1434,11 +1418,11 @@ Ajax.Updater = Class.create(Ajax.Request, {
0
       failure: (container.failure || (container.success ? null : container))
0
     };
0
 
0
- options = options || { };
0
+ options = Object.clone(options);
0
     var onComplete = options.onComplete;
0
- options.onComplete = (function(response, param) {
0
+ options.onComplete = (function(response, json) {
0
       this.updateContent(response.responseText);
0
- if (Object.isFunction(onComplete)) onComplete(response, param);
0
+ if (Object.isFunction(onComplete)) onComplete(response, json);
0
     }).bind(this);
0
 
0
     $super(url, options);
0
@@ -1460,10 +1444,6 @@ Ajax.Updater = Class.create(Ajax.Request, {
0
       }
0
       else receiver.update(responseText);
0
     }
0
-
0
- if (this.success()) {
0
- if (this.onComplete) this.onComplete.bind(this).defer();
0
- }
0
   }
0
 });
0
 
0
@@ -1690,7 +1670,7 @@ Element.Methods = {
0
   },
0
 
0
   descendants: function(element) {
0
- return $A($(element).getElementsByTagName('*')).each(Element.extend);
0
+ return $(element).getElementsBySelector("*");
0
   },
0
 
0
   firstDescendant: function(element) {
0
@@ -1795,10 +1775,11 @@ Element.Methods = {
0
     var attributes = { }, t = Element._attributeTranslations.write;
0
 
0
     if (typeof name == 'object') attributes = name;
0
- else attributes[name] = value === undefined ? true : value;
0
+ else attributes[name] = Object.isUndefined(value) ? true : value;
0
 
0
     for (var attr in attributes) {
0
- var name = t.names[attr] || attr, value = attributes[attr];
0
+ name = t.names[attr] || attr;
0
+ value = attributes[attr];
0
       if (t.values[attr]) name = t.values[attr](element, value);
0
       if (value === false || value === null)
0
         element.removeAttribute(name);
0
@@ -1867,6 +1848,7 @@ Element.Methods = {
0
 
0
   descendantOf: function(element, ancestor) {
0
     element = $(element), ancestor = $(ancestor);
0
+ var originalAncestor = ancestor;
0
 
0
     if (element.compareDocumentPosition)
0
       return (element.compareDocumentPosition(ancestor) & 8) === 8;
0
@@ -1882,7 +1864,7 @@ Element.Methods = {
0
     }
0
 
0
     while (element = element.parentNode)
0
- if (element == ancestor) return true;
0
+ if (element == originalAncestor) return true;
0
     return false;
0
   },
0
 
0
@@ -1921,7 +1903,7 @@ Element.Methods = {
0
       if (property == 'opacity') element.setOpacity(styles[property]);
0
       else
0
         elementStyle[(property == 'float' || property == 'cssFloat') ?
0
- (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
0
+ (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
0
             property] = styles[property];
0
 
0
     return element;
0
@@ -2301,7 +2283,7 @@ else if (Prototype.Browser.IE) {
0
           return node ? node.value : "";
0
         },
0
         _getEv: function(element, attribute) {
0
- var attribute = element.getAttribute(attribute);
0
+ attribute = element.getAttribute(attribute);
0
           return attribute ? attribute.toString().slice(23, -2) : null;
0
         },
0
         _flag: function(element, attribute) {
0
@@ -2719,9 +2701,26 @@ var Selector = Class.create({
0
     this.compileMatcher();
0
   },
0
 
0
+ shouldUseXPath: function() {
0
+ if (!Prototype.BrowserFeatures.XPath) return false;
0
+
0
+ var e = this.expression;
0
+
0
+ // Safari 3 chokes on :*-of-type and :empty
0
+ if (Prototype.Browser.WebKit &&
0
+ (e.include("-of-type") || e.include(":empty")))
0
+ return false;
0
+
0
+ // XPath can't do namespaced attributes, nor can it read
0
+ // the "checked" property from DOM nodes
0
+ if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
0
+ return false;
0
+
0
+ return true;
0
+ },
0
+
0
   compileMatcher: function() {
0
- // Selectors with namespaced attributes can't use the XPath version
0
- if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
0
+ if (this.shouldUseXPath())
0
       return this.compileXPathMatcher();
0
 
0
     var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
0
@@ -2844,8 +2843,12 @@ Object.extend(Selector, {
0
     },
0
     className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
0
     id: "[@id='#{1}']",
0
- attrPresence: "[@#{1}]",
0
+ attrPresence: function(m) {
0
+ m[1] = m[1].toLowerCase();
0
+ return new Template("[@#{1}]").evaluate(m);
0
+ },
0
     attr: function(m) {
0
+ m[1] = m[1].toLowerCase();
0
       m[3] = m[5] || m[6];
0
       return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
0
     },
0
@@ -2874,7 +2877,7 @@ Object.extend(Selector, {
0
       'enabled': "[not(@disabled)]",
0
       'not': function(m) {
0
         var e = m[6], p = Selector.patterns,
0
- x = Selector.xpath, le, m, v;
0
+ x = Selector.xpath, le, v;
0
 
0
         var exclusion = [];
0
         while (e && le != e && (/\S/).test(e)) {
0
@@ -3051,7 +3054,7 @@ Object.extend(Selector, {
0
     child: function(nodes) {
0
       var h = Selector.handlers;
0
       for (var i = 0, results = [], node; node = nodes[i]; i++) {
0
- for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
0
+ for (var j = 0, child; child = node.childNodes[j]; j++)
0
           if (child.nodeType == 1 && child.tagName != '!') results.push(child);
0
       }
0
       return results;
0
@@ -3323,7 +3326,8 @@ Object.extend(Selector, {
0
   },
0
 
0
   findChildElements: function(element, expressions) {
0
- var exprs = expressions.join(','), expressions = [];
0
+ var exprs = expressions.join(',');
0
+ expressions = [];
0
     exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
0
       expressions.push(m[1].strip());
0
     });
0
@@ -3336,6 +3340,16 @@ Object.extend(Selector, {
0
   }
0
 });
0
 
0
+if (Prototype.Browser.IE) {
0
+ // IE returns comment nodes on getElementsByTagName("*").
0
+ // Filter them out.
0
+ Selector.handlers.concat = function(a, b) {
0
+ for (var i = 0, node; node = b[i]; i++)
0
+ if (node.tagName !== "!") a.push(node);
0
+ return a;
0
+ };
0
+}
0
+
0
 function $$() {
0
   return Selector.findChildElements(document, $A(arguments));
0
 }
0
@@ -3347,7 +3361,7 @@ var Form = {
0
 
0
   serializeElements: function(elements, options) {
0
     if (typeof options != 'object') options = { hash: !!options };
0
- else if (options.hash === undefined) options.hash = true;
0
+ else if (Object.isUndefined(options.hash)) options.hash = true;
0
     var key, value, submitted = false, submit = options.submit;
0
 
0
     var data = elements.inject({ }, function(result, element) {
0
@@ -3545,17 +3559,17 @@ Form.Element.Serializers = {
0
   },
0
 
0
   inputSelector: function(element, value) {
0
- if (value === undefined) return element.checked ? element.value : null;
0
+ if (Object.isUndefined(value)) return element.checked ? element.value : null;
0
     else element.checked = !!value;
0
   },
0
 
0
   textarea: function(element, value) {
0
- if (value === undefined) return element.value;
0
+ if (Object.isUndefined(value)) return element.value;
0
     else element.value = value;
0
   },
0
 
0
   select: function(element, index) {
0
- if (index === undefined)
0
+ if (Object.isUndefined(index))
0
       return this[element.type == 'select-one' ?
0
         'selectOne' : 'selectMany'](element);
0
     else {
0
@@ -3746,7 +3760,9 @@ Event.Methods = (function() {
0
 
0
     findElement: function(event, expression) {
0
       var element = Event.element(event);
0
- return element.match(expression) ? element : element.up(expression);
0
+ if (!expression) return element;
0
+ var elements = [element].concat(element.ancestors());
0
+ return Selector.findElement(elements, expression, 0);
0
     },
0
 
0
     pointer: function(event) {
0
@@ -3938,7 +3954,7 @@ Object.extend(Event, (function() {
0
         element.fireEvent(event.eventType, event);
0
       }
0
 
0
- return event;
0
+ return Event.extend(event);
0
     }
0
   };
0
 })());
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 *2.0.0 [RC2]* (November 28th, 2007)
0
 
0
+* Update to Prototype -r8232. [sam]
0
+
0
 * Introduce SecretKeyGenerator for more secure session secrets than CGI::Session's pseudo-random id generator. Consider extracting to Active Support later. #10286 [Hongli Lai]
0
 
0
 * RAILS_GEM_VERSION may be set to any valid gem version specifier. #10057 [Chad Woolley, Chu Yeow]
...
36
37
38
39
40
41
42
43
...
110
111
112
113
 
114
115
116
...
135
136
137
138
 
139
140
141
...
204
205
206
207
 
208
209
210
...
351
352
353
354
 
355
356
357
...
366
367
368
369
 
370
371
372
...
486
487
488
489
 
 
 
490
491
492
...
565
566
567
568
 
 
569
570
571
...
686
687
688
689
 
690
691
692
...
713
714
715
716
 
717
718
719
...
724
725
726
727
 
728
729
730
...
904
905
906
907
 
908
909
910
...
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
...
1023
1024
1025
1026
 
 
 
 
 
 
 
 
1027
1028
1029
...
1187
1188
1189
 
1190
1191
 
 
1192
1193
1194
...
1371
1372
1373
1374
 
1375
1376
1377
...
1417
1418
1419
1420
1421
 
 
 
1422
1423
 
1424
1425
1426
...
1434
1435
1436
1437
 
1438
1439
 
1440
1441
 
1442
1443
1444
...
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
...
1690
1691
1692
1693
 
1694
1695
1696
...
1795
1796
1797
1798
 
1799
1800
1801
 
 
1802
1803
1804
...
1867
1868
1869
 
1870
1871
1872
...
1882
1883
1884
1885
 
1886
1887
1888
...
1921
1922
1923
1924
 
1925
1926
1927
...
2301
2302
2303
2304
 
2305
2306
2307
...
2719
2720
2721
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2722
2723
2724
 
2725
2726
2727
...
2844
2845
2846
2847
 
 
 
 
2848
 
2849
2850
2851
...
2874
2875
2876
2877
 
2878
2879
2880
...
3051
3052
3053
3054
 
3055
3056
3057
...
3323
3324
3325
3326
 
 
3327
3328
3329
...
3336
3337
3338
 
 
 
 
 
 
 
 
 
 
3339
3340
3341
...
3347
3348
3349
3350
 
3351
3352
3353
...
3545
3546
3547
3548
 
3549
3550
3551
3552
3553
 
3554
3555
3556
3557
3558
 
3559
3560
3561
...
3746
3747
3748
3749
 
 
 
3750
3751
3752
...
3938
3939
3940
3941
 
3942
3943
3944
...
36
37
38
 
 
39
40
41
...
108
109
110
 
111
112
113
114
...
133
134
135
 
136
137
138
139
...
202
203
204
 
205
206
207
208
...
349
350
351
 
352
353
354
355
...
364
365
366
 
367
368
369
370
...
484
485
486
 
487
488
489
490
491
492
...
565
566
567
 
568
569
570
571
572
...
687
688
689
 
690
691
692
693
...
714
715
716
 
717
718
719
720
...
725
726
727
 
728
729
730
731
...
905
906
907
 
908
909
910
911
...
985
986
987
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
988
989
990
...
996
997
998
 
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
...
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
...
1354
1355
1356
 
1357
1358
1359
1360
...
1400
1401
1402
 
 
1403
1404
1405
1406
 
1407
1408
1409
1410
...
1418
1419
1420
 
1421
1422
 
1423
1424
 
1425
1426
1427
1428
...
1444
1445
1446
 
 
 
 
1447
1448
1449
...
1670
1671
1672
 
1673
1674
1675
1676
...
1775
1776
1777
 
1778
1779
1780
 
1781
1782
1783
1784
1785
...
1848
1849
1850
1851
1852
1853
1854
...
1864
1865
1866
 
1867
1868
1869
1870
...
1903
1904
1905
 
1906
1907
1908
1909
...
2283
2284
2285
 
2286
2287
2288
2289
...
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
 
 
2723
2724
2725
2726
...
2843
2844
2845
 
2846
2847
2848
2849
2850
2851
2852
2853
2854
...
2877
2878
2879
 
2880
2881
2882
2883
...
3054
3055
3056
 
3057
3058
3059
3060
...
3326
3327
3328
 
3329
3330
3331
3332
3333
...
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
...
3361
3362
3363
 
3364
3365
3366
3367
...
3559
3560
3561
 
3562
3563
3564
3565
3566
 
3567
3568
3569
3570
3571
 
3572
3573
3574
3575
...<