comparison env/lib/python3.7/site-packages/cwltool/jshint/jshint.js @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 /*
2 Copyright 2012 Anton Kovalyov (http://jshint.com)
3
4 Permission is hereby granted, free of charge, to any person obtaining
5 a copy of this software and associated documentation files (the
6 "Software"), to deal in the Software without restriction, including
7 without limitation the rights to use, copy, modify, merge, publish,
8 distribute, sublicense, and/or sell copies of the Software, and to
9 permit persons to whom the Software is furnished to do so, subject to
10 the following conditions:
11
12 The above copyright notice and this permission notice shall be
13 included in all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23 /*! 2.9.5 */
24 var JSHINT;
25 if (typeof window === 'undefined') window = {};
26 (function () {
27 var require;
28 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
29 var identifierStartTable = [];
30
31 for (var i = 0; i < 128; i++) {
32 identifierStartTable[i] =
33 i === 36 || // $
34 i >= 65 && i <= 90 || // A-Z
35 i === 95 || // _
36 i >= 97 && i <= 122; // a-z
37 }
38
39 var identifierPartTable = [];
40
41 for (var i = 0; i < 128; i++) {
42 identifierPartTable[i] =
43 identifierStartTable[i] || // $, _, A-Z, a-z
44 i >= 48 && i <= 57; // 0-9
45 }
46
47 module.exports = {
48 asciiIdentifierStartTable: identifierStartTable,
49 asciiIdentifierPartTable: identifierPartTable
50 };
51
52 },{}],2:[function(require,module,exports){
53 var str = '768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,1155,1156,1157,1158,1159,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1648,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1767,1768,1770,1771,1772,1773,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,2027,2028,2029,2030,2031,2032,2033,2034,2035,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2304,2305,2306,2307,2362,2363,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2385,2386,2387,2388,2389,2390,2391,2402,2403,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2433,2434,2435,2492,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2509,2519,2530,2531,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2561,2562,2563,2620,2622,2623,2624,2625,2626,2631,2632,2635,2636,2637,2641,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2677,2689,2690,2691,2748,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2765,2786,2787,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2817,2818,2819,2876,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2893,2902,2903,2914,2915,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2946,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3021,3031,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3073,3074,3075,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3202,3203,3260,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3277,3285,3286,3298,3299,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3330,3331,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3405,3415,3426,3427,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3458,3459,3530,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3570,3571,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3761,3764,3765,3766,3767,3768,3769,3771,3772,3784,3785,3786,3787,3788,3789,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3864,3865,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3893,3895,3897,3902,3903,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4182,4183,4184,4185,4190,4191,4192,4194,4195,4196,4199,4200,4201,4202,4203,4204,4205,4209,4210,4211,4212,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4957,4958,4959,5906,5907,5908,5938,5939,5940,5970,5971,6002,6003,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6155,6156,6157,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6313,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6600,6601,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6679,6680,6681,6682,6683,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6912,6913,6914,6915,6916,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7042,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,7155,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7405,7410,7411,7412,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7676,7677,7678,7679,8204,8205,8255,8256,8276,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11503,11504,11505,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12330,12331,12332,12333,12334,12335,12441,12442,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42655,42736,42737,43010,43014,43019,43043,43044,43045,43046,43047,43136,43137,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43204,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43347,43392,43393,43394,43395,43443,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43456,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43587,43596,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43643,43696,43698,43699,43700,43703,43704,43710,43711,43713,43755,43756,43757,43758,43759,43765,43766,44003,44004,44005,44006,44007,44008,44009,44010,44012,44013,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,64286,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65075,65076,65101,65102,65103,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65343';
54 var arr = str.split(',').map(function(code) {
55 return parseInt(code, 10);
56 });
57 module.exports = arr;
58 },{}],3:[function(require,module,exports){
59 var str = '170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,880,881,882,883,884,886,887,890,891,892,893,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,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,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1765,1766,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2417,2418,2419,2420,2421,2422,2423,2425,2426,2427,2428,2429,2430,2431,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3125,3126,3127,3128,3129,3133,3160,3161,3168,3169,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3294,3296,3297,3313,3314,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3654,3713,3714,3716,3719,3720,3722,3725,3732,3733,3734,3735,3737,3738,3739,3740,3741,3742,3743,3745,3746,3747,3749,3751,3754,3755,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3782,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5902,5903,5904,5905,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6593,6594,6595,6596,6597,6598,6599,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6823,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7401,7402,7403,7404,7406,7407,7408,7409,7413,7414,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,11823,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42896,42897,42898,42899,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43471,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43763,43764,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500';
60 var arr = str.split(',').map(function(code) {
61 return parseInt(code, 10);
62 });
63 module.exports = arr;
64 },{}],4:[function(require,module,exports){
65 // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
66 //
67 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
68 //
69 // Originally from narwhal.js (http://narwhaljs.org)
70 // Copyright (c) 2009 Thomas Robinson <280north.com>
71 //
72 // Permission is hereby granted, free of charge, to any person obtaining a copy
73 // of this software and associated documentation files (the 'Software'), to
74 // deal in the Software without restriction, including without limitation the
75 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
76 // sell copies of the Software, and to permit persons to whom the Software is
77 // furnished to do so, subject to the following conditions:
78 //
79 // The above copyright notice and this permission notice shall be included in
80 // all copies or substantial portions of the Software.
81 //
82 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
83 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
84 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
85 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
86 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
87 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
88
89 // when used in node, this will actually load the util module we depend on
90 // versus loading the builtin util module as happens otherwise
91 // this is a bug in node module loading as far as I am concerned
92 var util = require('util/');
93
94 var pSlice = Array.prototype.slice;
95 var hasOwn = Object.prototype.hasOwnProperty;
96
97 // 1. The assert module provides functions that throw
98 // AssertionError's when particular conditions are not met. The
99 // assert module must conform to the following interface.
100
101 var assert = module.exports = ok;
102
103 // 2. The AssertionError is defined in assert.
104 // new assert.AssertionError({ message: message,
105 // actual: actual,
106 // expected: expected })
107
108 assert.AssertionError = function AssertionError(options) {
109 this.name = 'AssertionError';
110 this.actual = options.actual;
111 this.expected = options.expected;
112 this.operator = options.operator;
113 if (options.message) {
114 this.message = options.message;
115 this.generatedMessage = false;
116 } else {
117 this.message = getMessage(this);
118 this.generatedMessage = true;
119 }
120 var stackStartFunction = options.stackStartFunction || fail;
121
122 if (Error.captureStackTrace) {
123 Error.captureStackTrace(this, stackStartFunction);
124 }
125 else {
126 // non v8 browsers so we can have a stacktrace
127 var err = new Error();
128 if (err.stack) {
129 var out = err.stack;
130
131 // try to strip useless frames
132 var fn_name = stackStartFunction.name;
133 var idx = out.indexOf('\n' + fn_name);
134 if (idx >= 0) {
135 // once we have located the function frame
136 // we need to strip out everything before it (and its line)
137 var next_line = out.indexOf('\n', idx + 1);
138 out = out.substring(next_line + 1);
139 }
140
141 this.stack = out;
142 }
143 }
144 };
145
146 // assert.AssertionError instanceof Error
147 util.inherits(assert.AssertionError, Error);
148
149 function replacer(key, value) {
150 if (util.isUndefined(value)) {
151 return '' + value;
152 }
153 if (util.isNumber(value) && !isFinite(value)) {
154 return value.toString();
155 }
156 if (util.isFunction(value) || util.isRegExp(value)) {
157 return value.toString();
158 }
159 return value;
160 }
161
162 function truncate(s, n) {
163 if (util.isString(s)) {
164 return s.length < n ? s : s.slice(0, n);
165 } else {
166 return s;
167 }
168 }
169
170 function getMessage(self) {
171 return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
172 self.operator + ' ' +
173 truncate(JSON.stringify(self.expected, replacer), 128);
174 }
175
176 // At present only the three keys mentioned above are used and
177 // understood by the spec. Implementations or sub modules can pass
178 // other keys to the AssertionError's constructor - they will be
179 // ignored.
180
181 // 3. All of the following functions must throw an AssertionError
182 // when a corresponding condition is not met, with a message that
183 // may be undefined if not provided. All assertion methods provide
184 // both the actual and expected values to the assertion error for
185 // display purposes.
186
187 function fail(actual, expected, message, operator, stackStartFunction) {
188 throw new assert.AssertionError({
189 message: message,
190 actual: actual,
191 expected: expected,
192 operator: operator,
193 stackStartFunction: stackStartFunction
194 });
195 }
196
197 // EXTENSION! allows for well behaved errors defined elsewhere.
198 assert.fail = fail;
199
200 // 4. Pure assertion tests whether a value is truthy, as determined
201 // by !!guard.
202 // assert.ok(guard, message_opt);
203 // This statement is equivalent to assert.equal(true, !!guard,
204 // message_opt);. To test strictly for the value true, use
205 // assert.strictEqual(true, guard, message_opt);.
206
207 function ok(value, message) {
208 if (!value) fail(value, true, message, '==', assert.ok);
209 }
210 assert.ok = ok;
211
212 // 5. The equality assertion tests shallow, coercive equality with
213 // ==.
214 // assert.equal(actual, expected, message_opt);
215
216 assert.equal = function equal(actual, expected, message) {
217 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
218 };
219
220 // 6. The non-equality assertion tests for whether two objects are not equal
221 // with != assert.notEqual(actual, expected, message_opt);
222
223 assert.notEqual = function notEqual(actual, expected, message) {
224 if (actual == expected) {
225 fail(actual, expected, message, '!=', assert.notEqual);
226 }
227 };
228
229 // 7. The equivalence assertion tests a deep equality relation.
230 // assert.deepEqual(actual, expected, message_opt);
231
232 assert.deepEqual = function deepEqual(actual, expected, message) {
233 if (!_deepEqual(actual, expected)) {
234 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
235 }
236 };
237
238 function _deepEqual(actual, expected) {
239 // 7.1. All identical values are equivalent, as determined by ===.
240 if (actual === expected) {
241 return true;
242
243 } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
244 if (actual.length != expected.length) return false;
245
246 for (var i = 0; i < actual.length; i++) {
247 if (actual[i] !== expected[i]) return false;
248 }
249
250 return true;
251
252 // 7.2. If the expected value is a Date object, the actual value is
253 // equivalent if it is also a Date object that refers to the same time.
254 } else if (util.isDate(actual) && util.isDate(expected)) {
255 return actual.getTime() === expected.getTime();
256
257 // 7.3 If the expected value is a RegExp object, the actual value is
258 // equivalent if it is also a RegExp object with the same source and
259 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
260 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
261 return actual.source === expected.source &&
262 actual.global === expected.global &&
263 actual.multiline === expected.multiline &&
264 actual.lastIndex === expected.lastIndex &&
265 actual.ignoreCase === expected.ignoreCase;
266
267 // 7.4. Other pairs that do not both pass typeof value == 'object',
268 // equivalence is determined by ==.
269 } else if (!util.isObject(actual) && !util.isObject(expected)) {
270 return actual == expected;
271
272 // 7.5 For all other Object pairs, including Array objects, equivalence is
273 // determined by having the same number of owned properties (as verified
274 // with Object.prototype.hasOwnProperty.call), the same set of keys
275 // (although not necessarily the same order), equivalent values for every
276 // corresponding key, and an identical 'prototype' property. Note: this
277 // accounts for both named and indexed properties on Arrays.
278 } else {
279 return objEquiv(actual, expected);
280 }
281 }
282
283 function isArguments(object) {
284 return Object.prototype.toString.call(object) == '[object Arguments]';
285 }
286
287 function objEquiv(a, b) {
288 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
289 return false;
290 // an identical 'prototype' property.
291 if (a.prototype !== b.prototype) return false;
292 // if one is a primitive, the other must be same
293 if (util.isPrimitive(a) || util.isPrimitive(b)) {
294 return a === b;
295 }
296 var aIsArgs = isArguments(a),
297 bIsArgs = isArguments(b);
298 if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
299 return false;
300 if (aIsArgs) {
301 a = pSlice.call(a);
302 b = pSlice.call(b);
303 return _deepEqual(a, b);
304 }
305 var ka = objectKeys(a),
306 kb = objectKeys(b),
307 key, i;
308 // having the same number of owned properties (keys incorporates
309 // hasOwnProperty)
310 if (ka.length != kb.length)
311 return false;
312 //the same set of keys (although not necessarily the same order),
313 ka.sort();
314 kb.sort();
315 //~~~cheap key test
316 for (i = ka.length - 1; i >= 0; i--) {
317 if (ka[i] != kb[i])
318 return false;
319 }
320 //equivalent values for every corresponding key, and
321 //~~~possibly expensive deep test
322 for (i = ka.length - 1; i >= 0; i--) {
323 key = ka[i];
324 if (!_deepEqual(a[key], b[key])) return false;
325 }
326 return true;
327 }
328
329 // 8. The non-equivalence assertion tests for any deep inequality.
330 // assert.notDeepEqual(actual, expected, message_opt);
331
332 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
333 if (_deepEqual(actual, expected)) {
334 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
335 }
336 };
337
338 // 9. The strict equality assertion tests strict equality, as determined by ===.
339 // assert.strictEqual(actual, expected, message_opt);
340
341 assert.strictEqual = function strictEqual(actual, expected, message) {
342 if (actual !== expected) {
343 fail(actual, expected, message, '===', assert.strictEqual);
344 }
345 };
346
347 // 10. The strict non-equality assertion tests for strict inequality, as
348 // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
349
350 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
351 if (actual === expected) {
352 fail(actual, expected, message, '!==', assert.notStrictEqual);
353 }
354 };
355
356 function expectedException(actual, expected) {
357 if (!actual || !expected) {
358 return false;
359 }
360
361 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
362 return expected.test(actual);
363 } else if (actual instanceof expected) {
364 return true;
365 } else if (expected.call({}, actual) === true) {
366 return true;
367 }
368
369 return false;
370 }
371
372 function _throws(shouldThrow, block, expected, message) {
373 var actual;
374
375 if (util.isString(expected)) {
376 message = expected;
377 expected = null;
378 }
379
380 try {
381 block();
382 } catch (e) {
383 actual = e;
384 }
385
386 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
387 (message ? ' ' + message : '.');
388
389 if (shouldThrow && !actual) {
390 fail(actual, expected, 'Missing expected exception' + message);
391 }
392
393 if (!shouldThrow && expectedException(actual, expected)) {
394 fail(actual, expected, 'Got unwanted exception' + message);
395 }
396
397 if ((shouldThrow && actual && expected &&
398 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
399 throw actual;
400 }
401 }
402
403 // 11. Expected to throw an error:
404 // assert.throws(block, Error_opt, message_opt);
405
406 assert.throws = function(block, /*optional*/error, /*optional*/message) {
407 _throws.apply(this, [true].concat(pSlice.call(arguments)));
408 };
409
410 // EXTENSION! This is annoying to write outside this module.
411 assert.doesNotThrow = function(block, /*optional*/message) {
412 _throws.apply(this, [false].concat(pSlice.call(arguments)));
413 };
414
415 assert.ifError = function(err) { if (err) {throw err;}};
416
417 var objectKeys = Object.keys || function (obj) {
418 var keys = [];
419 for (var key in obj) {
420 if (hasOwn.call(obj, key)) keys.push(key);
421 }
422 return keys;
423 };
424
425 },{"util/":9}],5:[function(require,module,exports){
426 // Copyright Joyent, Inc. and other Node contributors.
427 //
428 // Permission is hereby granted, free of charge, to any person obtaining a
429 // copy of this software and associated documentation files (the
430 // "Software"), to deal in the Software without restriction, including
431 // without limitation the rights to use, copy, modify, merge, publish,
432 // distribute, sublicense, and/or sell copies of the Software, and to permit
433 // persons to whom the Software is furnished to do so, subject to the
434 // following conditions:
435 //
436 // The above copyright notice and this permission notice shall be included
437 // in all copies or substantial portions of the Software.
438 //
439 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
440 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
441 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
442 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
443 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
444 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
445 // USE OR OTHER DEALINGS IN THE SOFTWARE.
446
447 function EventEmitter() {
448 this._events = this._events || {};
449 this._maxListeners = this._maxListeners || undefined;
450 }
451 module.exports = EventEmitter;
452
453 // Backwards-compat with node 0.10.x
454 EventEmitter.EventEmitter = EventEmitter;
455
456 EventEmitter.prototype._events = undefined;
457 EventEmitter.prototype._maxListeners = undefined;
458
459 // By default EventEmitters will print a warning if more than 10 listeners are
460 // added to it. This is a useful default which helps finding memory leaks.
461 EventEmitter.defaultMaxListeners = 10;
462
463 // Obviously not all Emitters should be limited to 10. This function allows
464 // that to be increased. Set to zero for unlimited.
465 EventEmitter.prototype.setMaxListeners = function(n) {
466 if (!isNumber(n) || n < 0 || isNaN(n))
467 throw TypeError('n must be a positive number');
468 this._maxListeners = n;
469 return this;
470 };
471
472 EventEmitter.prototype.emit = function(type) {
473 var er, handler, len, args, i, listeners;
474
475 if (!this._events)
476 this._events = {};
477
478 // If there is no 'error' event listener then throw.
479 if (type === 'error') {
480 if (!this._events.error ||
481 (isObject(this._events.error) && !this._events.error.length)) {
482 er = arguments[1];
483 if (er instanceof Error) {
484 throw er; // Unhandled 'error' event
485 }
486 throw TypeError('Uncaught, unspecified "error" event.');
487 }
488 }
489
490 handler = this._events[type];
491
492 if (isUndefined(handler))
493 return false;
494
495 if (isFunction(handler)) {
496 switch (arguments.length) {
497 // fast cases
498 case 1:
499 handler.call(this);
500 break;
501 case 2:
502 handler.call(this, arguments[1]);
503 break;
504 case 3:
505 handler.call(this, arguments[1], arguments[2]);
506 break;
507 // slower
508 default:
509 len = arguments.length;
510 args = new Array(len - 1);
511 for (i = 1; i < len; i++)
512 args[i - 1] = arguments[i];
513 handler.apply(this, args);
514 }
515 } else if (isObject(handler)) {
516 len = arguments.length;
517 args = new Array(len - 1);
518 for (i = 1; i < len; i++)
519 args[i - 1] = arguments[i];
520
521 listeners = handler.slice();
522 len = listeners.length;
523 for (i = 0; i < len; i++)
524 listeners[i].apply(this, args);
525 }
526
527 return true;
528 };
529
530 EventEmitter.prototype.addListener = function(type, listener) {
531 var m;
532
533 if (!isFunction(listener))
534 throw TypeError('listener must be a function');
535
536 if (!this._events)
537 this._events = {};
538
539 // To avoid recursion in the case that type === "newListener"! Before
540 // adding it to the listeners, first emit "newListener".
541 if (this._events.newListener)
542 this.emit('newListener', type,
543 isFunction(listener.listener) ?
544 listener.listener : listener);
545
546 if (!this._events[type])
547 // Optimize the case of one listener. Don't need the extra array object.
548 this._events[type] = listener;
549 else if (isObject(this._events[type]))
550 // If we've already got an array, just append.
551 this._events[type].push(listener);
552 else
553 // Adding the second element, need to change to array.
554 this._events[type] = [this._events[type], listener];
555
556 // Check for listener leak
557 if (isObject(this._events[type]) && !this._events[type].warned) {
558 var m;
559 if (!isUndefined(this._maxListeners)) {
560 m = this._maxListeners;
561 } else {
562 m = EventEmitter.defaultMaxListeners;
563 }
564
565 if (m && m > 0 && this._events[type].length > m) {
566 this._events[type].warned = true;
567 console.error('(node) warning: possible EventEmitter memory ' +
568 'leak detected. %d listeners added. ' +
569 'Use emitter.setMaxListeners() to increase limit.',
570 this._events[type].length);
571 if (typeof console.trace === 'function') {
572 // not supported in IE 10
573 console.trace();
574 }
575 }
576 }
577
578 return this;
579 };
580
581 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
582
583 EventEmitter.prototype.once = function(type, listener) {
584 if (!isFunction(listener))
585 throw TypeError('listener must be a function');
586
587 var fired = false;
588
589 function g() {
590 this.removeListener(type, g);
591
592 if (!fired) {
593 fired = true;
594 listener.apply(this, arguments);
595 }
596 }
597
598 g.listener = listener;
599 this.on(type, g);
600
601 return this;
602 };
603
604 // emits a 'removeListener' event iff the listener was removed
605 EventEmitter.prototype.removeListener = function(type, listener) {
606 var list, position, length, i;
607
608 if (!isFunction(listener))
609 throw TypeError('listener must be a function');
610
611 if (!this._events || !this._events[type])
612 return this;
613
614 list = this._events[type];
615 length = list.length;
616 position = -1;
617
618 if (list === listener ||
619 (isFunction(list.listener) && list.listener === listener)) {
620 delete this._events[type];
621 if (this._events.removeListener)
622 this.emit('removeListener', type, listener);
623
624 } else if (isObject(list)) {
625 for (i = length; i-- > 0;) {
626 if (list[i] === listener ||
627 (list[i].listener && list[i].listener === listener)) {
628 position = i;
629 break;
630 }
631 }
632
633 if (position < 0)
634 return this;
635
636 if (list.length === 1) {
637 list.length = 0;
638 delete this._events[type];
639 } else {
640 list.splice(position, 1);
641 }
642
643 if (this._events.removeListener)
644 this.emit('removeListener', type, listener);
645 }
646
647 return this;
648 };
649
650 EventEmitter.prototype.removeAllListeners = function(type) {
651 var key, listeners;
652
653 if (!this._events)
654 return this;
655
656 // not listening for removeListener, no need to emit
657 if (!this._events.removeListener) {
658 if (arguments.length === 0)
659 this._events = {};
660 else if (this._events[type])
661 delete this._events[type];
662 return this;
663 }
664
665 // emit removeListener for all listeners on all events
666 if (arguments.length === 0) {
667 for (key in this._events) {
668 if (key === 'removeListener') continue;
669 this.removeAllListeners(key);
670 }
671 this.removeAllListeners('removeListener');
672 this._events = {};
673 return this;
674 }
675
676 listeners = this._events[type];
677
678 if (isFunction(listeners)) {
679 this.removeListener(type, listeners);
680 } else {
681 // LIFO order
682 while (listeners.length)
683 this.removeListener(type, listeners[listeners.length - 1]);
684 }
685 delete this._events[type];
686
687 return this;
688 };
689
690 EventEmitter.prototype.listeners = function(type) {
691 var ret;
692 if (!this._events || !this._events[type])
693 ret = [];
694 else if (isFunction(this._events[type]))
695 ret = [this._events[type]];
696 else
697 ret = this._events[type].slice();
698 return ret;
699 };
700
701 EventEmitter.listenerCount = function(emitter, type) {
702 var ret;
703 if (!emitter._events || !emitter._events[type])
704 ret = 0;
705 else if (isFunction(emitter._events[type]))
706 ret = 1;
707 else
708 ret = emitter._events[type].length;
709 return ret;
710 };
711
712 function isFunction(arg) {
713 return typeof arg === 'function';
714 }
715
716 function isNumber(arg) {
717 return typeof arg === 'number';
718 }
719
720 function isObject(arg) {
721 return typeof arg === 'object' && arg !== null;
722 }
723
724 function isUndefined(arg) {
725 return arg === void 0;
726 }
727
728 },{}],6:[function(require,module,exports){
729 // shim for using process in browser
730
731 var process = module.exports = {};
732 var queue = [];
733 var draining = false;
734
735 function drainQueue() {
736 if (draining) {
737 return;
738 }
739 draining = true;
740 var currentQueue;
741 var len = queue.length;
742 while(len) {
743 currentQueue = queue;
744 queue = [];
745 var i = -1;
746 while (++i < len) {
747 currentQueue[i]();
748 }
749 len = queue.length;
750 }
751 draining = false;
752 }
753 process.nextTick = function (fun) {
754 queue.push(fun);
755 if (!draining) {
756 setTimeout(drainQueue, 0);
757 }
758 };
759
760 process.title = 'browser';
761 process.browser = true;
762 process.env = {};
763 process.argv = [];
764 process.version = ''; // empty string to avoid regexp issues
765 process.versions = {};
766
767 function noop() {}
768
769 process.on = noop;
770 process.addListener = noop;
771 process.once = noop;
772 process.off = noop;
773 process.removeListener = noop;
774 process.removeAllListeners = noop;
775 process.emit = noop;
776
777 process.binding = function (name) {
778 throw new Error('process.binding is not supported');
779 };
780
781 // TODO(shtylman)
782 process.cwd = function () { return '/' };
783 process.chdir = function (dir) {
784 throw new Error('process.chdir is not supported');
785 };
786 process.umask = function() { return 0; };
787
788 },{}],7:[function(require,module,exports){
789 if (typeof Object.create === 'function') {
790 // implementation from standard node.js 'util' module
791 module.exports = function inherits(ctor, superCtor) {
792 ctor.super_ = superCtor
793 ctor.prototype = Object.create(superCtor.prototype, {
794 constructor: {
795 value: ctor,
796 enumerable: false,
797 writable: true,
798 configurable: true
799 }
800 });
801 };
802 } else {
803 // old school shim for old browsers
804 module.exports = function inherits(ctor, superCtor) {
805 ctor.super_ = superCtor
806 var TempCtor = function () {}
807 TempCtor.prototype = superCtor.prototype
808 ctor.prototype = new TempCtor()
809 ctor.prototype.constructor = ctor
810 }
811 }
812
813 },{}],8:[function(require,module,exports){
814 module.exports = function isBuffer(arg) {
815 return arg && typeof arg === 'object'
816 && typeof arg.copy === 'function'
817 && typeof arg.fill === 'function'
818 && typeof arg.readUInt8 === 'function';
819 }
820 },{}],9:[function(require,module,exports){
821 (function (process,global){
822 // Copyright Joyent, Inc. and other Node contributors.
823 //
824 // Permission is hereby granted, free of charge, to any person obtaining a
825 // copy of this software and associated documentation files (the
826 // "Software"), to deal in the Software without restriction, including
827 // without limitation the rights to use, copy, modify, merge, publish,
828 // distribute, sublicense, and/or sell copies of the Software, and to permit
829 // persons to whom the Software is furnished to do so, subject to the
830 // following conditions:
831 //
832 // The above copyright notice and this permission notice shall be included
833 // in all copies or substantial portions of the Software.
834 //
835 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
836 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
837 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
838 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
839 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
840 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
841 // USE OR OTHER DEALINGS IN THE SOFTWARE.
842
843 var formatRegExp = /%[sdj%]/g;
844 exports.format = function(f) {
845 if (!isString(f)) {
846 var objects = [];
847 for (var i = 0; i < arguments.length; i++) {
848 objects.push(inspect(arguments[i]));
849 }
850 return objects.join(' ');
851 }
852
853 var i = 1;
854 var args = arguments;
855 var len = args.length;
856 var str = String(f).replace(formatRegExp, function(x) {
857 if (x === '%%') return '%';
858 if (i >= len) return x;
859 switch (x) {
860 case '%s': return String(args[i++]);
861 case '%d': return Number(args[i++]);
862 case '%j':
863 try {
864 return JSON.stringify(args[i++]);
865 } catch (_) {
866 return '[Circular]';
867 }
868 default:
869 return x;
870 }
871 });
872 for (var x = args[i]; i < len; x = args[++i]) {
873 if (isNull(x) || !isObject(x)) {
874 str += ' ' + x;
875 } else {
876 str += ' ' + inspect(x);
877 }
878 }
879 return str;
880 };
881
882
883 // Mark that a method should not be used.
884 // Returns a modified function which warns once by default.
885 // If --no-deprecation is set, then it is a no-op.
886 exports.deprecate = function(fn, msg) {
887 // Allow for deprecating things in the process of starting up.
888 if (isUndefined(global.process)) {
889 return function() {
890 return exports.deprecate(fn, msg).apply(this, arguments);
891 };
892 }
893
894 if (process.noDeprecation === true) {
895 return fn;
896 }
897
898 var warned = false;
899 function deprecated() {
900 if (!warned) {
901 if (process.throwDeprecation) {
902 throw new Error(msg);
903 } else if (process.traceDeprecation) {
904 console.trace(msg);
905 } else {
906 console.error(msg);
907 }
908 warned = true;
909 }
910 return fn.apply(this, arguments);
911 }
912
913 return deprecated;
914 };
915
916
917 var debugs = {};
918 var debugEnviron;
919 exports.debuglog = function(set) {
920 if (isUndefined(debugEnviron))
921 debugEnviron = process.env.NODE_DEBUG || '';
922 set = set.toUpperCase();
923 if (!debugs[set]) {
924 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
925 var pid = process.pid;
926 debugs[set] = function() {
927 var msg = exports.format.apply(exports, arguments);
928 console.error('%s %d: %s', set, pid, msg);
929 };
930 } else {
931 debugs[set] = function() {};
932 }
933 }
934 return debugs[set];
935 };
936
937
938 /**
939 * Echos the value of a value. Trys to print the value out
940 * in the best way possible given the different types.
941 *
942 * @param {Object} obj The object to print out.
943 * @param {Object} opts Optional options object that alters the output.
944 */
945 /* legacy: obj, showHidden, depth, colors*/
946 function inspect(obj, opts) {
947 // default options
948 var ctx = {
949 seen: [],
950 stylize: stylizeNoColor
951 };
952 // legacy...
953 if (arguments.length >= 3) ctx.depth = arguments[2];
954 if (arguments.length >= 4) ctx.colors = arguments[3];
955 if (isBoolean(opts)) {
956 // legacy...
957 ctx.showHidden = opts;
958 } else if (opts) {
959 // got an "options" object
960 exports._extend(ctx, opts);
961 }
962 // set default options
963 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
964 if (isUndefined(ctx.depth)) ctx.depth = 2;
965 if (isUndefined(ctx.colors)) ctx.colors = false;
966 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
967 if (ctx.colors) ctx.stylize = stylizeWithColor;
968 return formatValue(ctx, obj, ctx.depth);
969 }
970 exports.inspect = inspect;
971
972
973 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
974 inspect.colors = {
975 'bold' : [1, 22],
976 'italic' : [3, 23],
977 'underline' : [4, 24],
978 'inverse' : [7, 27],
979 'white' : [37, 39],
980 'grey' : [90, 39],
981 'black' : [30, 39],
982 'blue' : [34, 39],
983 'cyan' : [36, 39],
984 'green' : [32, 39],
985 'magenta' : [35, 39],
986 'red' : [31, 39],
987 'yellow' : [33, 39]
988 };
989
990 // Don't use 'blue' not visible on cmd.exe
991 inspect.styles = {
992 'special': 'cyan',
993 'number': 'yellow',
994 'boolean': 'yellow',
995 'undefined': 'grey',
996 'null': 'bold',
997 'string': 'green',
998 'date': 'magenta',
999 // "name": intentionally not styling
1000 'regexp': 'red'
1001 };
1002
1003
1004 function stylizeWithColor(str, styleType) {
1005 var style = inspect.styles[styleType];
1006
1007 if (style) {
1008 return '\u001b[' + inspect.colors[style][0] + 'm' + str +
1009 '\u001b[' + inspect.colors[style][1] + 'm';
1010 } else {
1011 return str;
1012 }
1013 }
1014
1015
1016 function stylizeNoColor(str, styleType) {
1017 return str;
1018 }
1019
1020
1021 function arrayToHash(array) {
1022 var hash = {};
1023
1024 array.forEach(function(val, idx) {
1025 hash[val] = true;
1026 });
1027
1028 return hash;
1029 }
1030
1031
1032 function formatValue(ctx, value, recurseTimes) {
1033 // Provide a hook for user-specified inspect functions.
1034 // Check that value is an object with an inspect function on it
1035 if (ctx.customInspect &&
1036 value &&
1037 isFunction(value.inspect) &&
1038 // Filter out the util module, it's inspect function is special
1039 value.inspect !== exports.inspect &&
1040 // Also filter out any prototype objects using the circular check.
1041 !(value.constructor && value.constructor.prototype === value)) {
1042 var ret = value.inspect(recurseTimes, ctx);
1043 if (!isString(ret)) {
1044 ret = formatValue(ctx, ret, recurseTimes);
1045 }
1046 return ret;
1047 }
1048
1049 // Primitive types cannot have properties
1050 var primitive = formatPrimitive(ctx, value);
1051 if (primitive) {
1052 return primitive;
1053 }
1054
1055 // Look up the keys of the object.
1056 var keys = Object.keys(value);
1057 var visibleKeys = arrayToHash(keys);
1058
1059 if (ctx.showHidden) {
1060 keys = Object.getOwnPropertyNames(value);
1061 }
1062
1063 // IE doesn't make error fields non-enumerable
1064 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
1065 if (isError(value)
1066 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
1067 return formatError(value);
1068 }
1069
1070 // Some type of object without properties can be shortcutted.
1071 if (keys.length === 0) {
1072 if (isFunction(value)) {
1073 var name = value.name ? ': ' + value.name : '';
1074 return ctx.stylize('[Function' + name + ']', 'special');
1075 }
1076 if (isRegExp(value)) {
1077 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
1078 }
1079 if (isDate(value)) {
1080 return ctx.stylize(Date.prototype.toString.call(value), 'date');
1081 }
1082 if (isError(value)) {
1083 return formatError(value);
1084 }
1085 }
1086
1087 var base = '', array = false, braces = ['{', '}'];
1088
1089 // Make Array say that they are Array
1090 if (isArray(value)) {
1091 array = true;
1092 braces = ['[', ']'];
1093 }
1094
1095 // Make functions say that they are functions
1096 if (isFunction(value)) {
1097 var n = value.name ? ': ' + value.name : '';
1098 base = ' [Function' + n + ']';
1099 }
1100
1101 // Make RegExps say that they are RegExps
1102 if (isRegExp(value)) {
1103 base = ' ' + RegExp.prototype.toString.call(value);
1104 }
1105
1106 // Make dates with properties first say the date
1107 if (isDate(value)) {
1108 base = ' ' + Date.prototype.toUTCString.call(value);
1109 }
1110
1111 // Make error with message first say the error
1112 if (isError(value)) {
1113 base = ' ' + formatError(value);
1114 }
1115
1116 if (keys.length === 0 && (!array || value.length == 0)) {
1117 return braces[0] + base + braces[1];
1118 }
1119
1120 if (recurseTimes < 0) {
1121 if (isRegExp(value)) {
1122 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
1123 } else {
1124 return ctx.stylize('[Object]', 'special');
1125 }
1126 }
1127
1128 ctx.seen.push(value);
1129
1130 var output;
1131 if (array) {
1132 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
1133 } else {
1134 output = keys.map(function(key) {
1135 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
1136 });
1137 }
1138
1139 ctx.seen.pop();
1140
1141 return reduceToSingleString(output, base, braces);
1142 }
1143
1144
1145 function formatPrimitive(ctx, value) {
1146 if (isUndefined(value))
1147 return ctx.stylize('undefined', 'undefined');
1148 if (isString(value)) {
1149 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
1150 .replace(/'/g, "\\'")
1151 .replace(/\\"/g, '"') + '\'';
1152 return ctx.stylize(simple, 'string');
1153 }
1154 if (isNumber(value))
1155 return ctx.stylize('' + value, 'number');
1156 if (isBoolean(value))
1157 return ctx.stylize('' + value, 'boolean');
1158 // For some reason typeof null is "object", so special case here.
1159 if (isNull(value))
1160 return ctx.stylize('null', 'null');
1161 }
1162
1163
1164 function formatError(value) {
1165 return '[' + Error.prototype.toString.call(value) + ']';
1166 }
1167
1168
1169 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
1170 var output = [];
1171 for (var i = 0, l = value.length; i < l; ++i) {
1172 if (hasOwnProperty(value, String(i))) {
1173 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
1174 String(i), true));
1175 } else {
1176 output.push('');
1177 }
1178 }
1179 keys.forEach(function(key) {
1180 if (!key.match(/^\d+$/)) {
1181 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
1182 key, true));
1183 }
1184 });
1185 return output;
1186 }
1187
1188
1189 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
1190 var name, str, desc;
1191 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
1192 if (desc.get) {
1193 if (desc.set) {
1194 str = ctx.stylize('[Getter/Setter]', 'special');
1195 } else {
1196 str = ctx.stylize('[Getter]', 'special');
1197 }
1198 } else {
1199 if (desc.set) {
1200 str = ctx.stylize('[Setter]', 'special');
1201 }
1202 }
1203 if (!hasOwnProperty(visibleKeys, key)) {
1204 name = '[' + key + ']';
1205 }
1206 if (!str) {
1207 if (ctx.seen.indexOf(desc.value) < 0) {
1208 if (isNull(recurseTimes)) {
1209 str = formatValue(ctx, desc.value, null);
1210 } else {
1211 str = formatValue(ctx, desc.value, recurseTimes - 1);
1212 }
1213 if (str.indexOf('\n') > -1) {
1214 if (array) {
1215 str = str.split('\n').map(function(line) {
1216 return ' ' + line;
1217 }).join('\n').substr(2);
1218 } else {
1219 str = '\n' + str.split('\n').map(function(line) {
1220 return ' ' + line;
1221 }).join('\n');
1222 }
1223 }
1224 } else {
1225 str = ctx.stylize('[Circular]', 'special');
1226 }
1227 }
1228 if (isUndefined(name)) {
1229 if (array && key.match(/^\d+$/)) {
1230 return str;
1231 }
1232 name = JSON.stringify('' + key);
1233 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
1234 name = name.substr(1, name.length - 2);
1235 name = ctx.stylize(name, 'name');
1236 } else {
1237 name = name.replace(/'/g, "\\'")
1238 .replace(/\\"/g, '"')
1239 .replace(/(^"|"$)/g, "'");
1240 name = ctx.stylize(name, 'string');
1241 }
1242 }
1243
1244 return name + ': ' + str;
1245 }
1246
1247
1248 function reduceToSingleString(output, base, braces) {
1249 var numLinesEst = 0;
1250 var length = output.reduce(function(prev, cur) {
1251 numLinesEst++;
1252 if (cur.indexOf('\n') >= 0) numLinesEst++;
1253 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
1254 }, 0);
1255
1256 if (length > 60) {
1257 return braces[0] +
1258 (base === '' ? '' : base + '\n ') +
1259 ' ' +
1260 output.join(',\n ') +
1261 ' ' +
1262 braces[1];
1263 }
1264
1265 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
1266 }
1267
1268
1269 // NOTE: These type checking functions intentionally don't use `instanceof`
1270 // because it is fragile and can be easily faked with `Object.create()`.
1271 function isArray(ar) {
1272 return Array.isArray(ar);
1273 }
1274 exports.isArray = isArray;
1275
1276 function isBoolean(arg) {
1277 return typeof arg === 'boolean';
1278 }
1279 exports.isBoolean = isBoolean;
1280
1281 function isNull(arg) {
1282 return arg === null;
1283 }
1284 exports.isNull = isNull;
1285
1286 function isNullOrUndefined(arg) {
1287 return arg == null;
1288 }
1289 exports.isNullOrUndefined = isNullOrUndefined;
1290
1291 function isNumber(arg) {
1292 return typeof arg === 'number';
1293 }
1294 exports.isNumber = isNumber;
1295
1296 function isString(arg) {
1297 return typeof arg === 'string';
1298 }
1299 exports.isString = isString;
1300
1301 function isSymbol(arg) {
1302 return typeof arg === 'symbol';
1303 }
1304 exports.isSymbol = isSymbol;
1305
1306 function isUndefined(arg) {
1307 return arg === void 0;
1308 }
1309 exports.isUndefined = isUndefined;
1310
1311 function isRegExp(re) {
1312 return isObject(re) && objectToString(re) === '[object RegExp]';
1313 }
1314 exports.isRegExp = isRegExp;
1315
1316 function isObject(arg) {
1317 return typeof arg === 'object' && arg !== null;
1318 }
1319 exports.isObject = isObject;
1320
1321 function isDate(d) {
1322 return isObject(d) && objectToString(d) === '[object Date]';
1323 }
1324 exports.isDate = isDate;
1325
1326 function isError(e) {
1327 return isObject(e) &&
1328 (objectToString(e) === '[object Error]' || e instanceof Error);
1329 }
1330 exports.isError = isError;
1331
1332 function isFunction(arg) {
1333 return typeof arg === 'function';
1334 }
1335 exports.isFunction = isFunction;
1336
1337 function isPrimitive(arg) {
1338 return arg === null ||
1339 typeof arg === 'boolean' ||
1340 typeof arg === 'number' ||
1341 typeof arg === 'string' ||
1342 typeof arg === 'symbol' || // ES6 symbol
1343 typeof arg === 'undefined';
1344 }
1345 exports.isPrimitive = isPrimitive;
1346
1347 exports.isBuffer = require('./support/isBuffer');
1348
1349 function objectToString(o) {
1350 return Object.prototype.toString.call(o);
1351 }
1352
1353
1354 function pad(n) {
1355 return n < 10 ? '0' + n.toString(10) : n.toString(10);
1356 }
1357
1358
1359 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
1360 'Oct', 'Nov', 'Dec'];
1361
1362 // 26 Feb 16:19:34
1363 function timestamp() {
1364 var d = new Date();
1365 var time = [pad(d.getHours()),
1366 pad(d.getMinutes()),
1367 pad(d.getSeconds())].join(':');
1368 return [d.getDate(), months[d.getMonth()], time].join(' ');
1369 }
1370
1371
1372 // log is just a thin wrapper to console.log that prepends a timestamp
1373 exports.log = function() {
1374 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
1375 };
1376
1377
1378 /**
1379 * Inherit the prototype methods from one constructor into another.
1380 *
1381 * The Function.prototype.inherits from lang.js rewritten as a standalone
1382 * function (not on Function.prototype). NOTE: If this file is to be loaded
1383 * during bootstrapping this function needs to be rewritten using some native
1384 * functions as prototype setup using normal JavaScript does not work as
1385 * expected during bootstrapping (see mirror.js in r114903).
1386 *
1387 * @param {function} ctor Constructor function which needs to inherit the
1388 * prototype.
1389 * @param {function} superCtor Constructor function to inherit prototype from.
1390 */
1391 exports.inherits = require('inherits');
1392
1393 exports._extend = function(origin, add) {
1394 // Don't do anything if add isn't an object
1395 if (!add || !isObject(add)) return origin;
1396
1397 var keys = Object.keys(add);
1398 var i = keys.length;
1399 while (i--) {
1400 origin[keys[i]] = add[keys[i]];
1401 }
1402 return origin;
1403 };
1404
1405 function hasOwnProperty(obj, prop) {
1406 return Object.prototype.hasOwnProperty.call(obj, prop);
1407 }
1408
1409 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1410 },{"./support/isBuffer":8,"_process":6,"inherits":7}],10:[function(require,module,exports){
1411 (function (global){
1412 /*global window, global*/
1413 var util = require("util")
1414 var assert = require("assert")
1415 var now = require("date-now")
1416
1417 var slice = Array.prototype.slice
1418 var console
1419 var times = {}
1420
1421 if (typeof global !== "undefined" && global.console) {
1422 console = global.console
1423 } else if (typeof window !== "undefined" && window.console) {
1424 console = window.console
1425 } else {
1426 console = {}
1427 }
1428
1429 var functions = [
1430 [log, "log"],
1431 [info, "info"],
1432 [warn, "warn"],
1433 [error, "error"],
1434 [time, "time"],
1435 [timeEnd, "timeEnd"],
1436 [trace, "trace"],
1437 [dir, "dir"],
1438 [consoleAssert, "assert"]
1439 ]
1440
1441 for (var i = 0; i < functions.length; i++) {
1442 var tuple = functions[i]
1443 var f = tuple[0]
1444 var name = tuple[1]
1445
1446 if (!console[name]) {
1447 console[name] = f
1448 }
1449 }
1450
1451 module.exports = console
1452
1453 function log() {}
1454
1455 function info() {
1456 console.log.apply(console, arguments)
1457 }
1458
1459 function warn() {
1460 console.log.apply(console, arguments)
1461 }
1462
1463 function error() {
1464 console.warn.apply(console, arguments)
1465 }
1466
1467 function time(label) {
1468 times[label] = now()
1469 }
1470
1471 function timeEnd(label) {
1472 var time = times[label]
1473 if (!time) {
1474 throw new Error("No such label: " + label)
1475 }
1476
1477 var duration = now() - time
1478 console.log(label + ": " + duration + "ms")
1479 }
1480
1481 function trace() {
1482 var err = new Error()
1483 err.name = "Trace"
1484 err.message = util.format.apply(null, arguments)
1485 console.error(err.stack)
1486 }
1487
1488 function dir(object) {
1489 console.log(util.inspect(object) + "\n")
1490 }
1491
1492 function consoleAssert(expression) {
1493 if (!expression) {
1494 var arr = slice.call(arguments, 1)
1495 assert.ok(false, util.format.apply(null, arr))
1496 }
1497 }
1498
1499 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1500 },{"assert":4,"date-now":11,"util":9}],11:[function(require,module,exports){
1501 module.exports = now
1502
1503 function now() {
1504 return new Date().getTime()
1505 }
1506
1507 },{}],12:[function(require,module,exports){
1508 (function (global){
1509 /**
1510 * @license
1511 * lodash 3.7.0 (Custom Build) <https://lodash.com/>
1512 * Build: `lodash modern -d -o ./index.js`
1513 * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
1514 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
1515 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
1516 * Available under MIT license <https://lodash.com/license>
1517 */
1518 ;(function() {
1519
1520 /** Used as a safe reference for `undefined` in pre-ES5 environments. */
1521 var undefined;
1522
1523 /** Used as the semantic version number. */
1524 var VERSION = '3.7.0';
1525
1526 /** Used to compose bitmasks for wrapper metadata. */
1527 var BIND_FLAG = 1,
1528 BIND_KEY_FLAG = 2,
1529 CURRY_BOUND_FLAG = 4,
1530 CURRY_FLAG = 8,
1531 CURRY_RIGHT_FLAG = 16,
1532 PARTIAL_FLAG = 32,
1533 PARTIAL_RIGHT_FLAG = 64,
1534 ARY_FLAG = 128,
1535 REARG_FLAG = 256;
1536
1537 /** Used as default options for `_.trunc`. */
1538 var DEFAULT_TRUNC_LENGTH = 30,
1539 DEFAULT_TRUNC_OMISSION = '...';
1540
1541 /** Used to detect when a function becomes hot. */
1542 var HOT_COUNT = 150,
1543 HOT_SPAN = 16;
1544
1545 /** Used to indicate the type of lazy iteratees. */
1546 var LAZY_DROP_WHILE_FLAG = 0,
1547 LAZY_FILTER_FLAG = 1,
1548 LAZY_MAP_FLAG = 2;
1549
1550 /** Used as the `TypeError` message for "Functions" methods. */
1551 var FUNC_ERROR_TEXT = 'Expected a function';
1552
1553 /** Used as the internal argument placeholder. */
1554 var PLACEHOLDER = '__lodash_placeholder__';
1555
1556 /** `Object#toString` result references. */
1557 var argsTag = '[object Arguments]',
1558 arrayTag = '[object Array]',
1559 boolTag = '[object Boolean]',
1560 dateTag = '[object Date]',
1561 errorTag = '[object Error]',
1562 funcTag = '[object Function]',
1563 mapTag = '[object Map]',
1564 numberTag = '[object Number]',
1565 objectTag = '[object Object]',
1566 regexpTag = '[object RegExp]',
1567 setTag = '[object Set]',
1568 stringTag = '[object String]',
1569 weakMapTag = '[object WeakMap]';
1570
1571 var arrayBufferTag = '[object ArrayBuffer]',
1572 float32Tag = '[object Float32Array]',
1573 float64Tag = '[object Float64Array]',
1574 int8Tag = '[object Int8Array]',
1575 int16Tag = '[object Int16Array]',
1576 int32Tag = '[object Int32Array]',
1577 uint8Tag = '[object Uint8Array]',
1578 uint8ClampedTag = '[object Uint8ClampedArray]',
1579 uint16Tag = '[object Uint16Array]',
1580 uint32Tag = '[object Uint32Array]';
1581
1582 /** Used to match empty string literals in compiled template source. */
1583 var reEmptyStringLeading = /\b__p \+= '';/g,
1584 reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
1585 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
1586
1587 /** Used to match HTML entities and HTML characters. */
1588 var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
1589 reUnescapedHtml = /[&<>"'`]/g,
1590 reHasEscapedHtml = RegExp(reEscapedHtml.source),
1591 reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
1592
1593 /** Used to match template delimiters. */
1594 var reEscape = /<%-([\s\S]+?)%>/g,
1595 reEvaluate = /<%([\s\S]+?)%>/g,
1596 reInterpolate = /<%=([\s\S]+?)%>/g;
1597
1598 /** Used to match property names within property paths. */
1599 var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,
1600 reIsPlainProp = /^\w*$/,
1601 rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
1602
1603 /**
1604 * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).
1605 * In addition to special characters the forward slash is escaped to allow for
1606 * easier `eval` use and `Function` compilation.
1607 */
1608 var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
1609 reHasRegExpChars = RegExp(reRegExpChars.source);
1610
1611 /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
1612 var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
1613
1614 /** Used to match backslashes in property paths. */
1615 var reEscapeChar = /\\(\\)?/g;
1616
1617 /** Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components). */
1618 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
1619
1620 /** Used to match `RegExp` flags from their coerced string values. */
1621 var reFlags = /\w*$/;
1622
1623 /** Used to detect hexadecimal string values. */
1624 var reHasHexPrefix = /^0[xX]/;
1625
1626 /** Used to detect host constructors (Safari > 5). */
1627 var reIsHostCtor = /^\[object .+?Constructor\]$/;
1628
1629 /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
1630 var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
1631
1632 /** Used to ensure capturing order of template delimiters. */
1633 var reNoMatch = /($^)/;
1634
1635 /** Used to match unescaped characters in compiled string literals. */
1636 var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
1637
1638 /** Used to match words to create compound words. */
1639 var reWords = (function() {
1640 var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
1641 lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';
1642
1643 return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
1644 }());
1645
1646 /** Used to detect and test for whitespace. */
1647 var whitespace = (
1648 // Basic whitespace characters.
1649 ' \t\x0b\f\xa0\ufeff' +
1650
1651 // Line terminators.
1652 '\n\r\u2028\u2029' +
1653
1654 // Unicode category "Zs" space separators.
1655 '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
1656 );
1657
1658 /** Used to assign default `context` object properties. */
1659 var contextProps = [
1660 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
1661 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
1662 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',
1663 'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
1664 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
1665 'window'
1666 ];
1667
1668 /** Used to make template sourceURLs easier to identify. */
1669 var templateCounter = -1;
1670
1671 /** Used to identify `toStringTag` values of typed arrays. */
1672 var typedArrayTags = {};
1673 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
1674 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
1675 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
1676 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
1677 typedArrayTags[uint32Tag] = true;
1678 typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
1679 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
1680 typedArrayTags[dateTag] = typedArrayTags[errorTag] =
1681 typedArrayTags[funcTag] = typedArrayTags[mapTag] =
1682 typedArrayTags[numberTag] = typedArrayTags[objectTag] =
1683 typedArrayTags[regexpTag] = typedArrayTags[setTag] =
1684 typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
1685
1686 /** Used to identify `toStringTag` values supported by `_.clone`. */
1687 var cloneableTags = {};
1688 cloneableTags[argsTag] = cloneableTags[arrayTag] =
1689 cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
1690 cloneableTags[dateTag] = cloneableTags[float32Tag] =
1691 cloneableTags[float64Tag] = cloneableTags[int8Tag] =
1692 cloneableTags[int16Tag] = cloneableTags[int32Tag] =
1693 cloneableTags[numberTag] = cloneableTags[objectTag] =
1694 cloneableTags[regexpTag] = cloneableTags[stringTag] =
1695 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
1696 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
1697 cloneableTags[errorTag] = cloneableTags[funcTag] =
1698 cloneableTags[mapTag] = cloneableTags[setTag] =
1699 cloneableTags[weakMapTag] = false;
1700
1701 /** Used as an internal `_.debounce` options object by `_.throttle`. */
1702 var debounceOptions = {
1703 'leading': false,
1704 'maxWait': 0,
1705 'trailing': false
1706 };
1707
1708 /** Used to map latin-1 supplementary letters to basic latin letters. */
1709 var deburredLetters = {
1710 '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
1711 '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
1712 '\xc7': 'C', '\xe7': 'c',
1713 '\xd0': 'D', '\xf0': 'd',
1714 '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
1715 '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
1716 '\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
1717 '\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
1718 '\xd1': 'N', '\xf1': 'n',
1719 '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
1720 '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
1721 '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
1722 '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
1723 '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
1724 '\xc6': 'Ae', '\xe6': 'ae',
1725 '\xde': 'Th', '\xfe': 'th',
1726 '\xdf': 'ss'
1727 };
1728
1729 /** Used to map characters to HTML entities. */
1730 var htmlEscapes = {
1731 '&': '&amp;',
1732 '<': '&lt;',
1733 '>': '&gt;',
1734 '"': '&quot;',
1735 "'": '&#39;',
1736 '`': '&#96;'
1737 };
1738
1739 /** Used to map HTML entities to characters. */
1740 var htmlUnescapes = {
1741 '&amp;': '&',
1742 '&lt;': '<',
1743 '&gt;': '>',
1744 '&quot;': '"',
1745 '&#39;': "'",
1746 '&#96;': '`'
1747 };
1748
1749 /** Used to determine if values are of the language type `Object`. */
1750 var objectTypes = {
1751 'function': true,
1752 'object': true
1753 };
1754
1755 /** Used to escape characters for inclusion in compiled string literals. */
1756 var stringEscapes = {
1757 '\\': '\\',
1758 "'": "'",
1759 '\n': 'n',
1760 '\r': 'r',
1761 '\u2028': 'u2028',
1762 '\u2029': 'u2029'
1763 };
1764
1765 /** Detect free variable `exports`. */
1766 var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
1767
1768 /** Detect free variable `module`. */
1769 var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
1770
1771 /** Detect free variable `global` from Node.js. */
1772 var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;
1773
1774 /** Detect free variable `self`. */
1775 var freeSelf = objectTypes[typeof self] && self && self.Object && self;
1776
1777 /** Detect free variable `window`. */
1778 var freeWindow = objectTypes[typeof window] && window && window.Object && window;
1779
1780 /** Detect the popular CommonJS extension `module.exports`. */
1781 var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
1782
1783 /**
1784 * Used as a reference to the global object.
1785 *
1786 * The `this` value is used if it is the global object to avoid Greasemonkey's
1787 * restricted `window` object, otherwise the `window` object is used.
1788 */
1789 var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
1790
1791 /*--------------------------------------------------------------------------*/
1792
1793 /**
1794 * The base implementation of `compareAscending` which compares values and
1795 * sorts them in ascending order without guaranteeing a stable sort.
1796 *
1797 * @private
1798 * @param {*} value The value to compare to `other`.
1799 * @param {*} other The value to compare to `value`.
1800 * @returns {number} Returns the sort order indicator for `value`.
1801 */
1802 function baseCompareAscending(value, other) {
1803 if (value !== other) {
1804 var valIsReflexive = value === value,
1805 othIsReflexive = other === other;
1806
1807 if (value > other || !valIsReflexive || (value === undefined && othIsReflexive)) {
1808 return 1;
1809 }
1810 if (value < other || !othIsReflexive || (other === undefined && valIsReflexive)) {
1811 return -1;
1812 }
1813 }
1814 return 0;
1815 }
1816
1817 /**
1818 * The base implementation of `_.findIndex` and `_.findLastIndex` without
1819 * support for callback shorthands and `this` binding.
1820 *
1821 * @private
1822 * @param {Array} array The array to search.
1823 * @param {Function} predicate The function invoked per iteration.
1824 * @param {boolean} [fromRight] Specify iterating from right to left.
1825 * @returns {number} Returns the index of the matched value, else `-1`.
1826 */
1827 function baseFindIndex(array, predicate, fromRight) {
1828 var length = array.length,
1829 index = fromRight ? length : -1;
1830
1831 while ((fromRight ? index-- : ++index < length)) {
1832 if (predicate(array[index], index, array)) {
1833 return index;
1834 }
1835 }
1836 return -1;
1837 }
1838
1839 /**
1840 * The base implementation of `_.indexOf` without support for binary searches.
1841 *
1842 * @private
1843 * @param {Array} array The array to search.
1844 * @param {*} value The value to search for.
1845 * @param {number} fromIndex The index to search from.
1846 * @returns {number} Returns the index of the matched value, else `-1`.
1847 */
1848 function baseIndexOf(array, value, fromIndex) {
1849 if (value !== value) {
1850 return indexOfNaN(array, fromIndex);
1851 }
1852 var index = fromIndex - 1,
1853 length = array.length;
1854
1855 while (++index < length) {
1856 if (array[index] === value) {
1857 return index;
1858 }
1859 }
1860 return -1;
1861 }
1862
1863 /**
1864 * The base implementation of `_.isFunction` without support for environments
1865 * with incorrect `typeof` results.
1866 *
1867 * @private
1868 * @param {*} value The value to check.
1869 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
1870 */
1871 function baseIsFunction(value) {
1872 // Avoid a Chakra JIT bug in compatibility modes of IE 11.
1873 // See https://github.com/jashkenas/underscore/issues/1621 for more details.
1874 return typeof value == 'function' || false;
1875 }
1876
1877 /**
1878 * Converts `value` to a string if it is not one. An empty string is returned
1879 * for `null` or `undefined` values.
1880 *
1881 * @private
1882 * @param {*} value The value to process.
1883 * @returns {string} Returns the string.
1884 */
1885 function baseToString(value) {
1886 if (typeof value == 'string') {
1887 return value;
1888 }
1889 return value == null ? '' : (value + '');
1890 }
1891
1892 /**
1893 * Used by `_.max` and `_.min` as the default callback for string values.
1894 *
1895 * @private
1896 * @param {string} string The string to inspect.
1897 * @returns {number} Returns the code unit of the first character of the string.
1898 */
1899 function charAtCallback(string) {
1900 return string.charCodeAt(0);
1901 }
1902
1903 /**
1904 * Used by `_.trim` and `_.trimLeft` to get the index of the first character
1905 * of `string` that is not found in `chars`.
1906 *
1907 * @private
1908 * @param {string} string The string to inspect.
1909 * @param {string} chars The characters to find.
1910 * @returns {number} Returns the index of the first character not found in `chars`.
1911 */
1912 function charsLeftIndex(string, chars) {
1913 var index = -1,
1914 length = string.length;
1915
1916 while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
1917 return index;
1918 }
1919
1920 /**
1921 * Used by `_.trim` and `_.trimRight` to get the index of the last character
1922 * of `string` that is not found in `chars`.
1923 *
1924 * @private
1925 * @param {string} string The string to inspect.
1926 * @param {string} chars The characters to find.
1927 * @returns {number} Returns the index of the last character not found in `chars`.
1928 */
1929 function charsRightIndex(string, chars) {
1930 var index = string.length;
1931
1932 while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
1933 return index;
1934 }
1935
1936 /**
1937 * Used by `_.sortBy` to compare transformed elements of a collection and stable
1938 * sort them in ascending order.
1939 *
1940 * @private
1941 * @param {Object} object The object to compare to `other`.
1942 * @param {Object} other The object to compare to `object`.
1943 * @returns {number} Returns the sort order indicator for `object`.
1944 */
1945 function compareAscending(object, other) {
1946 return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
1947 }
1948
1949 /**
1950 * Used by `_.sortByOrder` to compare multiple properties of each element
1951 * in a collection and stable sort them in the following order:
1952 *
1953 * If `orders` is unspecified, sort in ascending order for all properties.
1954 * Otherwise, for each property, sort in ascending order if its corresponding value in
1955 * orders is true, and descending order if false.
1956 *
1957 * @private
1958 * @param {Object} object The object to compare to `other`.
1959 * @param {Object} other The object to compare to `object`.
1960 * @param {boolean[]} orders The order to sort by for each property.
1961 * @returns {number} Returns the sort order indicator for `object`.
1962 */
1963 function compareMultiple(object, other, orders) {
1964 var index = -1,
1965 objCriteria = object.criteria,
1966 othCriteria = other.criteria,
1967 length = objCriteria.length,
1968 ordersLength = orders.length;
1969
1970 while (++index < length) {
1971 var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
1972 if (result) {
1973 if (index >= ordersLength) {
1974 return result;
1975 }
1976 return result * (orders[index] ? 1 : -1);
1977 }
1978 }
1979 // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
1980 // that causes it, under certain circumstances, to provide the same value for
1981 // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
1982 // for more details.
1983 //
1984 // This also ensures a stable sort in V8 and other engines.
1985 // See https://code.google.com/p/v8/issues/detail?id=90 for more details.
1986 return object.index - other.index;
1987 }
1988
1989 /**
1990 * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
1991 *
1992 * @private
1993 * @param {string} letter The matched letter to deburr.
1994 * @returns {string} Returns the deburred letter.
1995 */
1996 function deburrLetter(letter) {
1997 return deburredLetters[letter];
1998 }
1999
2000 /**
2001 * Used by `_.escape` to convert characters to HTML entities.
2002 *
2003 * @private
2004 * @param {string} chr The matched character to escape.
2005 * @returns {string} Returns the escaped character.
2006 */
2007 function escapeHtmlChar(chr) {
2008 return htmlEscapes[chr];
2009 }
2010
2011 /**
2012 * Used by `_.template` to escape characters for inclusion in compiled
2013 * string literals.
2014 *
2015 * @private
2016 * @param {string} chr The matched character to escape.
2017 * @returns {string} Returns the escaped character.
2018 */
2019 function escapeStringChar(chr) {
2020 return '\\' + stringEscapes[chr];
2021 }
2022
2023 /**
2024 * Gets the index at which the first occurrence of `NaN` is found in `array`.
2025 *
2026 * @private
2027 * @param {Array} array The array to search.
2028 * @param {number} fromIndex The index to search from.
2029 * @param {boolean} [fromRight] Specify iterating from right to left.
2030 * @returns {number} Returns the index of the matched `NaN`, else `-1`.
2031 */
2032 function indexOfNaN(array, fromIndex, fromRight) {
2033 var length = array.length,
2034 index = fromIndex + (fromRight ? 0 : -1);
2035
2036 while ((fromRight ? index-- : ++index < length)) {
2037 var other = array[index];
2038 if (other !== other) {
2039 return index;
2040 }
2041 }
2042 return -1;
2043 }
2044
2045 /**
2046 * Checks if `value` is object-like.
2047 *
2048 * @private
2049 * @param {*} value The value to check.
2050 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2051 */
2052 function isObjectLike(value) {
2053 return !!value && typeof value == 'object';
2054 }
2055
2056 /**
2057 * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
2058 * character code is whitespace.
2059 *
2060 * @private
2061 * @param {number} charCode The character code to inspect.
2062 * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.
2063 */
2064 function isSpace(charCode) {
2065 return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||
2066 (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));
2067 }
2068
2069 /**
2070 * Replaces all `placeholder` elements in `array` with an internal placeholder
2071 * and returns an array of their indexes.
2072 *
2073 * @private
2074 * @param {Array} array The array to modify.
2075 * @param {*} placeholder The placeholder to replace.
2076 * @returns {Array} Returns the new array of placeholder indexes.
2077 */
2078 function replaceHolders(array, placeholder) {
2079 var index = -1,
2080 length = array.length,
2081 resIndex = -1,
2082 result = [];
2083
2084 while (++index < length) {
2085 if (array[index] === placeholder) {
2086 array[index] = PLACEHOLDER;
2087 result[++resIndex] = index;
2088 }
2089 }
2090 return result;
2091 }
2092
2093 /**
2094 * An implementation of `_.uniq` optimized for sorted arrays without support
2095 * for callback shorthands and `this` binding.
2096 *
2097 * @private
2098 * @param {Array} array The array to inspect.
2099 * @param {Function} [iteratee] The function invoked per iteration.
2100 * @returns {Array} Returns the new duplicate-value-free array.
2101 */
2102 function sortedUniq(array, iteratee) {
2103 var seen,
2104 index = -1,
2105 length = array.length,
2106 resIndex = -1,
2107 result = [];
2108
2109 while (++index < length) {
2110 var value = array[index],
2111 computed = iteratee ? iteratee(value, index, array) : value;
2112
2113 if (!index || seen !== computed) {
2114 seen = computed;
2115 result[++resIndex] = value;
2116 }
2117 }
2118 return result;
2119 }
2120
2121 /**
2122 * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace
2123 * character of `string`.
2124 *
2125 * @private
2126 * @param {string} string The string to inspect.
2127 * @returns {number} Returns the index of the first non-whitespace character.
2128 */
2129 function trimmedLeftIndex(string) {
2130 var index = -1,
2131 length = string.length;
2132
2133 while (++index < length && isSpace(string.charCodeAt(index))) {}
2134 return index;
2135 }
2136
2137 /**
2138 * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace
2139 * character of `string`.
2140 *
2141 * @private
2142 * @param {string} string The string to inspect.
2143 * @returns {number} Returns the index of the last non-whitespace character.
2144 */
2145 function trimmedRightIndex(string) {
2146 var index = string.length;
2147
2148 while (index-- && isSpace(string.charCodeAt(index))) {}
2149 return index;
2150 }
2151
2152 /**
2153 * Used by `_.unescape` to convert HTML entities to characters.
2154 *
2155 * @private
2156 * @param {string} chr The matched character to unescape.
2157 * @returns {string} Returns the unescaped character.
2158 */
2159 function unescapeHtmlChar(chr) {
2160 return htmlUnescapes[chr];
2161 }
2162
2163 /*--------------------------------------------------------------------------*/
2164
2165 /**
2166 * Create a new pristine `lodash` function using the given `context` object.
2167 *
2168 * @static
2169 * @memberOf _
2170 * @category Utility
2171 * @param {Object} [context=root] The context object.
2172 * @returns {Function} Returns a new `lodash` function.
2173 * @example
2174 *
2175 * _.mixin({ 'foo': _.constant('foo') });
2176 *
2177 * var lodash = _.runInContext();
2178 * lodash.mixin({ 'bar': lodash.constant('bar') });
2179 *
2180 * _.isFunction(_.foo);
2181 * // => true
2182 * _.isFunction(_.bar);
2183 * // => false
2184 *
2185 * lodash.isFunction(lodash.foo);
2186 * // => false
2187 * lodash.isFunction(lodash.bar);
2188 * // => true
2189 *
2190 * // using `context` to mock `Date#getTime` use in `_.now`
2191 * var mock = _.runInContext({
2192 * 'Date': function() {
2193 * return { 'getTime': getTimeMock };
2194 * }
2195 * });
2196 *
2197 * // or creating a suped-up `defer` in Node.js
2198 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
2199 */
2200 function runInContext(context) {
2201 // Avoid issues with some ES3 environments that attempt to use values, named
2202 // after built-in constructors like `Object`, for the creation of literals.
2203 // ES5 clears this up by stating that literals must use built-in constructors.
2204 // See https://es5.github.io/#x11.1.5 for more details.
2205 context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
2206
2207 /** Native constructor references. */
2208 var Array = context.Array,
2209 Date = context.Date,
2210 Error = context.Error,
2211 Function = context.Function,
2212 Math = context.Math,
2213 Number = context.Number,
2214 Object = context.Object,
2215 RegExp = context.RegExp,
2216 String = context.String,
2217 TypeError = context.TypeError;
2218
2219 /** Used for native method references. */
2220 var arrayProto = Array.prototype,
2221 objectProto = Object.prototype,
2222 stringProto = String.prototype;
2223
2224 /** Used to detect DOM support. */
2225 var document = (document = context.window) && document.document;
2226
2227 /** Used to resolve the decompiled source of functions. */
2228 var fnToString = Function.prototype.toString;
2229
2230 /** Used to check objects for own properties. */
2231 var hasOwnProperty = objectProto.hasOwnProperty;
2232
2233 /** Used to generate unique IDs. */
2234 var idCounter = 0;
2235
2236 /**
2237 * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
2238 * of values.
2239 */
2240 var objToString = objectProto.toString;
2241
2242 /** Used to restore the original `_` reference in `_.noConflict`. */
2243 var oldDash = context._;
2244
2245 /** Used to detect if a method is native. */
2246 var reIsNative = RegExp('^' +
2247 escapeRegExp(objToString)
2248 .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
2249 );
2250
2251 /** Native method references. */
2252 var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer,
2253 bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,
2254 ceil = Math.ceil,
2255 clearTimeout = context.clearTimeout,
2256 floor = Math.floor,
2257 getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols,
2258 getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
2259 push = arrayProto.push,
2260 preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions,
2261 propertyIsEnumerable = objectProto.propertyIsEnumerable,
2262 Set = isNative(Set = context.Set) && Set,
2263 setTimeout = context.setTimeout,
2264 splice = arrayProto.splice,
2265 Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array,
2266 WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;
2267
2268 /** Used to clone array buffers. */
2269 var Float64Array = (function() {
2270 // Safari 5 errors when using an array buffer to initialize a typed array
2271 // where the array buffer's `byteLength` is not a multiple of the typed
2272 // array's `BYTES_PER_ELEMENT`.
2273 try {
2274 var func = isNative(func = context.Float64Array) && func,
2275 result = new func(new ArrayBuffer(10), 0, 1) && func;
2276 } catch(e) {}
2277 return result;
2278 }());
2279
2280 /** Used as `baseAssign`. */
2281 var nativeAssign = (function() {
2282 // Avoid `Object.assign` in Firefox 34-37 which have an early implementation
2283 // with a now defunct try/catch behavior. See https://bugzilla.mozilla.org/show_bug.cgi?id=1103344
2284 // for more details.
2285 //
2286 // Use `Object.preventExtensions` on a plain object instead of simply using
2287 // `Object('x')` because Chrome and IE fail to throw an error when attempting
2288 // to assign values to readonly indexes of strings in strict mode.
2289 var object = { '1': 0 },
2290 func = preventExtensions && isNative(func = Object.assign) && func;
2291
2292 try { func(preventExtensions(object), 'xo'); } catch(e) {}
2293 return !object[1] && func;
2294 }());
2295
2296 /* Native method references for those with the same name as other `lodash` methods. */
2297 var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
2298 nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
2299 nativeIsFinite = context.isFinite,
2300 nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
2301 nativeMax = Math.max,
2302 nativeMin = Math.min,
2303 nativeNow = isNative(nativeNow = Date.now) && nativeNow,
2304 nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite,
2305 nativeParseInt = context.parseInt,
2306 nativeRandom = Math.random;
2307
2308 /** Used as references for `-Infinity` and `Infinity`. */
2309 var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,
2310 POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
2311
2312 /** Used as references for the maximum length and index of an array. */
2313 var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,
2314 MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
2315 HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
2316
2317 /** Used as the size, in bytes, of each `Float64Array` element. */
2318 var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;
2319
2320 /**
2321 * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
2322 * of an array-like value.
2323 */
2324 var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
2325
2326 /** Used to store function metadata. */
2327 var metaMap = WeakMap && new WeakMap;
2328
2329 /** Used to lookup unminified function names. */
2330 var realNames = {};
2331
2332 /*------------------------------------------------------------------------*/
2333
2334 /**
2335 * Creates a `lodash` object which wraps `value` to enable implicit chaining.
2336 * Methods that operate on and return arrays, collections, and functions can
2337 * be chained together. Methods that return a boolean or single value will
2338 * automatically end the chain returning the unwrapped value. Explicit chaining
2339 * may be enabled using `_.chain`. The execution of chained methods is lazy,
2340 * that is, execution is deferred until `_#value` is implicitly or explicitly
2341 * called.
2342 *
2343 * Lazy evaluation allows several methods to support shortcut fusion. Shortcut
2344 * fusion is an optimization that merges iteratees to avoid creating intermediate
2345 * arrays and reduce the number of iteratee executions.
2346 *
2347 * Chaining is supported in custom builds as long as the `_#value` method is
2348 * directly or indirectly included in the build.
2349 *
2350 * In addition to lodash methods, wrappers have `Array` and `String` methods.
2351 *
2352 * The wrapper `Array` methods are:
2353 * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,
2354 * `splice`, and `unshift`
2355 *
2356 * The wrapper `String` methods are:
2357 * `replace` and `split`
2358 *
2359 * The wrapper methods that support shortcut fusion are:
2360 * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,
2361 * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,
2362 * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,
2363 * and `where`
2364 *
2365 * The chainable wrapper methods are:
2366 * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,
2367 * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,
2368 * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`,
2369 * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`,
2370 * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,
2371 * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,
2372 * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,
2373 * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`,
2374 * `merge`, `mixin`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
2375 * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
2376 * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,
2377 * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,
2378 * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,
2379 * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,
2380 * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,
2381 * `without`, `wrap`, `xor`, `zip`, and `zipObject`
2382 *
2383 * The wrapper methods that are **not** chainable by default are:
2384 * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,
2385 * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
2386 * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,
2387 * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,
2388 * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`
2389 * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`,
2390 * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `isTypedArray`,
2391 * `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, `noConflict`,
2392 * `noop`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`,
2393 * `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, `shift`, `size`,
2394 * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, `startsWith`,
2395 * `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, `unescape`,
2396 * `uniqueId`, `value`, and `words`
2397 *
2398 * The wrapper method `sample` will return a wrapped value when `n` is provided,
2399 * otherwise an unwrapped value is returned.
2400 *
2401 * @name _
2402 * @constructor
2403 * @category Chain
2404 * @param {*} value The value to wrap in a `lodash` instance.
2405 * @returns {Object} Returns the new `lodash` wrapper instance.
2406 * @example
2407 *
2408 * var wrapped = _([1, 2, 3]);
2409 *
2410 * // returns an unwrapped value
2411 * wrapped.reduce(function(total, n) {
2412 * return total + n;
2413 * });
2414 * // => 6
2415 *
2416 * // returns a wrapped value
2417 * var squares = wrapped.map(function(n) {
2418 * return n * n;
2419 * });
2420 *
2421 * _.isArray(squares);
2422 * // => false
2423 *
2424 * _.isArray(squares.value());
2425 * // => true
2426 */
2427 function lodash(value) {
2428 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
2429 if (value instanceof LodashWrapper) {
2430 return value;
2431 }
2432 if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
2433 return wrapperClone(value);
2434 }
2435 }
2436 return new LodashWrapper(value);
2437 }
2438
2439 /**
2440 * The function whose prototype all chaining wrappers inherit from.
2441 *
2442 * @private
2443 */
2444 function baseLodash() {
2445 // No operation performed.
2446 }
2447
2448 /**
2449 * The base constructor for creating `lodash` wrapper objects.
2450 *
2451 * @private
2452 * @param {*} value The value to wrap.
2453 * @param {boolean} [chainAll] Enable chaining for all wrapper methods.
2454 * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
2455 */
2456 function LodashWrapper(value, chainAll, actions) {
2457 this.__wrapped__ = value;
2458 this.__actions__ = actions || [];
2459 this.__chain__ = !!chainAll;
2460 }
2461
2462 /**
2463 * An object environment feature flags.
2464 *
2465 * @static
2466 * @memberOf _
2467 * @type Object
2468 */
2469 var support = lodash.support = {};
2470
2471 (function(x) {
2472 var Ctor = function() { this.x = x; },
2473 object = { '0': x, 'length': x },
2474 props = [];
2475
2476 Ctor.prototype = { 'valueOf': x, 'y': x };
2477 for (var key in new Ctor) { props.push(key); }
2478
2479 /**
2480 * Detect if functions can be decompiled by `Function#toString`
2481 * (all but Firefox OS certified apps, older Opera mobile browsers, and
2482 * the PlayStation 3; forced `false` for Windows 8 apps).
2483 *
2484 * @memberOf _.support
2485 * @type boolean
2486 */
2487 support.funcDecomp = /\bthis\b/.test(function() { return this; });
2488
2489 /**
2490 * Detect if `Function#name` is supported (all but IE).
2491 *
2492 * @memberOf _.support
2493 * @type boolean
2494 */
2495 support.funcNames = typeof Function.name == 'string';
2496
2497 /**
2498 * Detect if the DOM is supported.
2499 *
2500 * @memberOf _.support
2501 * @type boolean
2502 */
2503 try {
2504 support.dom = document.createDocumentFragment().nodeType === 11;
2505 } catch(e) {
2506 support.dom = false;
2507 }
2508
2509 /**
2510 * Detect if `arguments` object indexes are non-enumerable.
2511 *
2512 * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object
2513 * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat
2514 * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`
2515 * checks for indexes that exceed the number of function parameters and
2516 * whose associated argument values are `0`.
2517 *
2518 * @memberOf _.support
2519 * @type boolean
2520 */
2521 try {
2522 support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);
2523 } catch(e) {
2524 support.nonEnumArgs = true;
2525 }
2526 }(1, 0));
2527
2528 /**
2529 * By default, the template delimiters used by lodash are like those in
2530 * embedded Ruby (ERB). Change the following template settings to use
2531 * alternative delimiters.
2532 *
2533 * @static
2534 * @memberOf _
2535 * @type Object
2536 */
2537 lodash.templateSettings = {
2538
2539 /**
2540 * Used to detect `data` property values to be HTML-escaped.
2541 *
2542 * @memberOf _.templateSettings
2543 * @type RegExp
2544 */
2545 'escape': reEscape,
2546
2547 /**
2548 * Used to detect code to be evaluated.
2549 *
2550 * @memberOf _.templateSettings
2551 * @type RegExp
2552 */
2553 'evaluate': reEvaluate,
2554
2555 /**
2556 * Used to detect `data` property values to inject.
2557 *
2558 * @memberOf _.templateSettings
2559 * @type RegExp
2560 */
2561 'interpolate': reInterpolate,
2562
2563 /**
2564 * Used to reference the data object in the template text.
2565 *
2566 * @memberOf _.templateSettings
2567 * @type string
2568 */
2569 'variable': '',
2570
2571 /**
2572 * Used to import variables into the compiled template.
2573 *
2574 * @memberOf _.templateSettings
2575 * @type Object
2576 */
2577 'imports': {
2578
2579 /**
2580 * A reference to the `lodash` function.
2581 *
2582 * @memberOf _.templateSettings.imports
2583 * @type Function
2584 */
2585 '_': lodash
2586 }
2587 };
2588
2589 /*------------------------------------------------------------------------*/
2590
2591 /**
2592 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
2593 *
2594 * @private
2595 * @param {*} value The value to wrap.
2596 */
2597 function LazyWrapper(value) {
2598 this.__wrapped__ = value;
2599 this.__actions__ = null;
2600 this.__dir__ = 1;
2601 this.__dropCount__ = 0;
2602 this.__filtered__ = false;
2603 this.__iteratees__ = null;
2604 this.__takeCount__ = POSITIVE_INFINITY;
2605 this.__views__ = null;
2606 }
2607
2608 /**
2609 * Creates a clone of the lazy wrapper object.
2610 *
2611 * @private
2612 * @name clone
2613 * @memberOf LazyWrapper
2614 * @returns {Object} Returns the cloned `LazyWrapper` object.
2615 */
2616 function lazyClone() {
2617 var actions = this.__actions__,
2618 iteratees = this.__iteratees__,
2619 views = this.__views__,
2620 result = new LazyWrapper(this.__wrapped__);
2621
2622 result.__actions__ = actions ? arrayCopy(actions) : null;
2623 result.__dir__ = this.__dir__;
2624 result.__filtered__ = this.__filtered__;
2625 result.__iteratees__ = iteratees ? arrayCopy(iteratees) : null;
2626 result.__takeCount__ = this.__takeCount__;
2627 result.__views__ = views ? arrayCopy(views) : null;
2628 return result;
2629 }
2630
2631 /**
2632 * Reverses the direction of lazy iteration.
2633 *
2634 * @private
2635 * @name reverse
2636 * @memberOf LazyWrapper
2637 * @returns {Object} Returns the new reversed `LazyWrapper` object.
2638 */
2639 function lazyReverse() {
2640 if (this.__filtered__) {
2641 var result = new LazyWrapper(this);
2642 result.__dir__ = -1;
2643 result.__filtered__ = true;
2644 } else {
2645 result = this.clone();
2646 result.__dir__ *= -1;
2647 }
2648 return result;
2649 }
2650
2651 /**
2652 * Extracts the unwrapped value from its lazy wrapper.
2653 *
2654 * @private
2655 * @name value
2656 * @memberOf LazyWrapper
2657 * @returns {*} Returns the unwrapped value.
2658 */
2659 function lazyValue() {
2660 var array = this.__wrapped__.value();
2661 if (!isArray(array)) {
2662 return baseWrapperValue(array, this.__actions__);
2663 }
2664 var dir = this.__dir__,
2665 isRight = dir < 0,
2666 view = getView(0, array.length, this.__views__),
2667 start = view.start,
2668 end = view.end,
2669 length = end - start,
2670 index = isRight ? end : (start - 1),
2671 takeCount = nativeMin(length, this.__takeCount__),
2672 iteratees = this.__iteratees__,
2673 iterLength = iteratees ? iteratees.length : 0,
2674 resIndex = 0,
2675 result = [];
2676
2677 outer:
2678 while (length-- && resIndex < takeCount) {
2679 index += dir;
2680
2681 var iterIndex = -1,
2682 value = array[index];
2683
2684 while (++iterIndex < iterLength) {
2685 var data = iteratees[iterIndex],
2686 iteratee = data.iteratee,
2687 type = data.type;
2688
2689 if (type == LAZY_DROP_WHILE_FLAG) {
2690 if (data.done && (isRight ? (index > data.index) : (index < data.index))) {
2691 data.count = 0;
2692 data.done = false;
2693 }
2694 data.index = index;
2695 if (!data.done) {
2696 var limit = data.limit;
2697 if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) {
2698 continue outer;
2699 }
2700 }
2701 } else {
2702 var computed = iteratee(value);
2703 if (type == LAZY_MAP_FLAG) {
2704 value = computed;
2705 } else if (!computed) {
2706 if (type == LAZY_FILTER_FLAG) {
2707 continue outer;
2708 } else {
2709 break outer;
2710 }
2711 }
2712 }
2713 }
2714 result[resIndex++] = value;
2715 }
2716 return result;
2717 }
2718
2719 /*------------------------------------------------------------------------*/
2720
2721 /**
2722 * Creates a cache object to store key/value pairs.
2723 *
2724 * @private
2725 * @static
2726 * @name Cache
2727 * @memberOf _.memoize
2728 */
2729 function MapCache() {
2730 this.__data__ = {};
2731 }
2732
2733 /**
2734 * Removes `key` and its value from the cache.
2735 *
2736 * @private
2737 * @name delete
2738 * @memberOf _.memoize.Cache
2739 * @param {string} key The key of the value to remove.
2740 * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.
2741 */
2742 function mapDelete(key) {
2743 return this.has(key) && delete this.__data__[key];
2744 }
2745
2746 /**
2747 * Gets the cached value for `key`.
2748 *
2749 * @private
2750 * @name get
2751 * @memberOf _.memoize.Cache
2752 * @param {string} key The key of the value to get.
2753 * @returns {*} Returns the cached value.
2754 */
2755 function mapGet(key) {
2756 return key == '__proto__' ? undefined : this.__data__[key];
2757 }
2758
2759 /**
2760 * Checks if a cached value for `key` exists.
2761 *
2762 * @private
2763 * @name has
2764 * @memberOf _.memoize.Cache
2765 * @param {string} key The key of the entry to check.
2766 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2767 */
2768 function mapHas(key) {
2769 return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
2770 }
2771
2772 /**
2773 * Sets `value` to `key` of the cache.
2774 *
2775 * @private
2776 * @name set
2777 * @memberOf _.memoize.Cache
2778 * @param {string} key The key of the value to cache.
2779 * @param {*} value The value to cache.
2780 * @returns {Object} Returns the cache object.
2781 */
2782 function mapSet(key, value) {
2783 if (key != '__proto__') {
2784 this.__data__[key] = value;
2785 }
2786 return this;
2787 }
2788
2789 /*------------------------------------------------------------------------*/
2790
2791 /**
2792 *
2793 * Creates a cache object to store unique values.
2794 *
2795 * @private
2796 * @param {Array} [values] The values to cache.
2797 */
2798 function SetCache(values) {
2799 var length = values ? values.length : 0;
2800
2801 this.data = { 'hash': nativeCreate(null), 'set': new Set };
2802 while (length--) {
2803 this.push(values[length]);
2804 }
2805 }
2806
2807 /**
2808 * Checks if `value` is in `cache` mimicking the return signature of
2809 * `_.indexOf` by returning `0` if the value is found, else `-1`.
2810 *
2811 * @private
2812 * @param {Object} cache The cache to search.
2813 * @param {*} value The value to search for.
2814 * @returns {number} Returns `0` if `value` is found, else `-1`.
2815 */
2816 function cacheIndexOf(cache, value) {
2817 var data = cache.data,
2818 result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];
2819
2820 return result ? 0 : -1;
2821 }
2822
2823 /**
2824 * Adds `value` to the cache.
2825 *
2826 * @private
2827 * @name push
2828 * @memberOf SetCache
2829 * @param {*} value The value to cache.
2830 */
2831 function cachePush(value) {
2832 var data = this.data;
2833 if (typeof value == 'string' || isObject(value)) {
2834 data.set.add(value);
2835 } else {
2836 data.hash[value] = true;
2837 }
2838 }
2839
2840 /*------------------------------------------------------------------------*/
2841
2842 /**
2843 * Copies the values of `source` to `array`.
2844 *
2845 * @private
2846 * @param {Array} source The array to copy values from.
2847 * @param {Array} [array=[]] The array to copy values to.
2848 * @returns {Array} Returns `array`.
2849 */
2850 function arrayCopy(source, array) {
2851 var index = -1,
2852 length = source.length;
2853
2854 array || (array = Array(length));
2855 while (++index < length) {
2856 array[index] = source[index];
2857 }
2858 return array;
2859 }
2860
2861 /**
2862 * A specialized version of `_.forEach` for arrays without support for callback
2863 * shorthands and `this` binding.
2864 *
2865 * @private
2866 * @param {Array} array The array to iterate over.
2867 * @param {Function} iteratee The function invoked per iteration.
2868 * @returns {Array} Returns `array`.
2869 */
2870 function arrayEach(array, iteratee) {
2871 var index = -1,
2872 length = array.length;
2873
2874 while (++index < length) {
2875 if (iteratee(array[index], index, array) === false) {
2876 break;
2877 }
2878 }
2879 return array;
2880 }
2881
2882 /**
2883 * A specialized version of `_.forEachRight` for arrays without support for
2884 * callback shorthands and `this` binding.
2885 *
2886 * @private
2887 * @param {Array} array The array to iterate over.
2888 * @param {Function} iteratee The function invoked per iteration.
2889 * @returns {Array} Returns `array`.
2890 */
2891 function arrayEachRight(array, iteratee) {
2892 var length = array.length;
2893
2894 while (length--) {
2895 if (iteratee(array[length], length, array) === false) {
2896 break;
2897 }
2898 }
2899 return array;
2900 }
2901
2902 /**
2903 * A specialized version of `_.every` for arrays without support for callback
2904 * shorthands and `this` binding.
2905 *
2906 * @private
2907 * @param {Array} array The array to iterate over.
2908 * @param {Function} predicate The function invoked per iteration.
2909 * @returns {boolean} Returns `true` if all elements pass the predicate check,
2910 * else `false`.
2911 */
2912 function arrayEvery(array, predicate) {
2913 var index = -1,
2914 length = array.length;
2915
2916 while (++index < length) {
2917 if (!predicate(array[index], index, array)) {
2918 return false;
2919 }
2920 }
2921 return true;
2922 }
2923
2924 /**
2925 * A specialized version of `_.filter` for arrays without support for callback
2926 * shorthands and `this` binding.
2927 *
2928 * @private
2929 * @param {Array} array The array to iterate over.
2930 * @param {Function} predicate The function invoked per iteration.
2931 * @returns {Array} Returns the new filtered array.
2932 */
2933 function arrayFilter(array, predicate) {
2934 var index = -1,
2935 length = array.length,
2936 resIndex = -1,
2937 result = [];
2938
2939 while (++index < length) {
2940 var value = array[index];
2941 if (predicate(value, index, array)) {
2942 result[++resIndex] = value;
2943 }
2944 }
2945 return result;
2946 }
2947
2948 /**
2949 * A specialized version of `_.map` for arrays without support for callback
2950 * shorthands and `this` binding.
2951 *
2952 * @private
2953 * @param {Array} array The array to iterate over.
2954 * @param {Function} iteratee The function invoked per iteration.
2955 * @returns {Array} Returns the new mapped array.
2956 */
2957 function arrayMap(array, iteratee) {
2958 var index = -1,
2959 length = array.length,
2960 result = Array(length);
2961
2962 while (++index < length) {
2963 result[index] = iteratee(array[index], index, array);
2964 }
2965 return result;
2966 }
2967
2968 /**
2969 * A specialized version of `_.max` for arrays without support for iteratees.
2970 *
2971 * @private
2972 * @param {Array} array The array to iterate over.
2973 * @returns {*} Returns the maximum value.
2974 */
2975 function arrayMax(array) {
2976 var index = -1,
2977 length = array.length,
2978 result = NEGATIVE_INFINITY;
2979
2980 while (++index < length) {
2981 var value = array[index];
2982 if (value > result) {
2983 result = value;
2984 }
2985 }
2986 return result;
2987 }
2988
2989 /**
2990 * A specialized version of `_.min` for arrays without support for iteratees.
2991 *
2992 * @private
2993 * @param {Array} array The array to iterate over.
2994 * @returns {*} Returns the minimum value.
2995 */
2996 function arrayMin(array) {
2997 var index = -1,
2998 length = array.length,
2999 result = POSITIVE_INFINITY;
3000
3001 while (++index < length) {
3002 var value = array[index];
3003 if (value < result) {
3004 result = value;
3005 }
3006 }
3007 return result;
3008 }
3009
3010 /**
3011 * A specialized version of `_.reduce` for arrays without support for callback
3012 * shorthands and `this` binding.
3013 *
3014 * @private
3015 * @param {Array} array The array to iterate over.
3016 * @param {Function} iteratee The function invoked per iteration.
3017 * @param {*} [accumulator] The initial value.
3018 * @param {boolean} [initFromArray] Specify using the first element of `array`
3019 * as the initial value.
3020 * @returns {*} Returns the accumulated value.
3021 */
3022 function arrayReduce(array, iteratee, accumulator, initFromArray) {
3023 var index = -1,
3024 length = array.length;
3025
3026 if (initFromArray && length) {
3027 accumulator = array[++index];
3028 }
3029 while (++index < length) {
3030 accumulator = iteratee(accumulator, array[index], index, array);
3031 }
3032 return accumulator;
3033 }
3034
3035 /**
3036 * A specialized version of `_.reduceRight` for arrays without support for
3037 * callback shorthands and `this` binding.
3038 *
3039 * @private
3040 * @param {Array} array The array to iterate over.
3041 * @param {Function} iteratee The function invoked per iteration.
3042 * @param {*} [accumulator] The initial value.
3043 * @param {boolean} [initFromArray] Specify using the last element of `array`
3044 * as the initial value.
3045 * @returns {*} Returns the accumulated value.
3046 */
3047 function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
3048 var length = array.length;
3049 if (initFromArray && length) {
3050 accumulator = array[--length];
3051 }
3052 while (length--) {
3053 accumulator = iteratee(accumulator, array[length], length, array);
3054 }
3055 return accumulator;
3056 }
3057
3058 /**
3059 * A specialized version of `_.some` for arrays without support for callback
3060 * shorthands and `this` binding.
3061 *
3062 * @private
3063 * @param {Array} array The array to iterate over.
3064 * @param {Function} predicate The function invoked per iteration.
3065 * @returns {boolean} Returns `true` if any element passes the predicate check,
3066 * else `false`.
3067 */
3068 function arraySome(array, predicate) {
3069 var index = -1,
3070 length = array.length;
3071
3072 while (++index < length) {
3073 if (predicate(array[index], index, array)) {
3074 return true;
3075 }
3076 }
3077 return false;
3078 }
3079
3080 /**
3081 * A specialized version of `_.sum` for arrays without support for iteratees.
3082 *
3083 * @private
3084 * @param {Array} array The array to iterate over.
3085 * @returns {number} Returns the sum.
3086 */
3087 function arraySum(array) {
3088 var length = array.length,
3089 result = 0;
3090
3091 while (length--) {
3092 result += +array[length] || 0;
3093 }
3094 return result;
3095 }
3096
3097 /**
3098 * Used by `_.defaults` to customize its `_.assign` use.
3099 *
3100 * @private
3101 * @param {*} objectValue The destination object property value.
3102 * @param {*} sourceValue The source object property value.
3103 * @returns {*} Returns the value to assign to the destination object.
3104 */
3105 function assignDefaults(objectValue, sourceValue) {
3106 return objectValue === undefined ? sourceValue : objectValue;
3107 }
3108
3109 /**
3110 * Used by `_.template` to customize its `_.assign` use.
3111 *
3112 * **Note:** This function is like `assignDefaults` except that it ignores
3113 * inherited property values when checking if a property is `undefined`.
3114 *
3115 * @private
3116 * @param {*} objectValue The destination object property value.
3117 * @param {*} sourceValue The source object property value.
3118 * @param {string} key The key associated with the object and source values.
3119 * @param {Object} object The destination object.
3120 * @returns {*} Returns the value to assign to the destination object.
3121 */
3122 function assignOwnDefaults(objectValue, sourceValue, key, object) {
3123 return (objectValue === undefined || !hasOwnProperty.call(object, key))
3124 ? sourceValue
3125 : objectValue;
3126 }
3127
3128 /**
3129 * A specialized version of `_.assign` for customizing assigned values without
3130 * support for argument juggling, multiple sources, and `this` binding `customizer`
3131 * functions.
3132 *
3133 * @private
3134 * @param {Object} object The destination object.
3135 * @param {Object} source The source object.
3136 * @param {Function} customizer The function to customize assigned values.
3137 * @returns {Object} Returns `object`.
3138 */
3139 function assignWith(object, source, customizer) {
3140 var props = keys(source);
3141 push.apply(props, getSymbols(source));
3142
3143 var index = -1,
3144 length = props.length;
3145
3146 while (++index < length) {
3147 var key = props[index],
3148 value = object[key],
3149 result = customizer(value, source[key], key, object, source);
3150
3151 if ((result === result ? (result !== value) : (value === value)) ||
3152 (value === undefined && !(key in object))) {
3153 object[key] = result;
3154 }
3155 }
3156 return object;
3157 }
3158
3159 /**
3160 * The base implementation of `_.assign` without support for argument juggling,
3161 * multiple sources, and `customizer` functions.
3162 *
3163 * @private
3164 * @param {Object} object The destination object.
3165 * @param {Object} source The source object.
3166 * @returns {Object} Returns `object`.
3167 */
3168 var baseAssign = nativeAssign || function(object, source) {
3169 return source == null
3170 ? object
3171 : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object));
3172 };
3173
3174 /**
3175 * The base implementation of `_.at` without support for string collections
3176 * and individual key arguments.
3177 *
3178 * @private
3179 * @param {Array|Object} collection The collection to iterate over.
3180 * @param {number[]|string[]} props The property names or indexes of elements to pick.
3181 * @returns {Array} Returns the new array of picked elements.
3182 */
3183 function baseAt(collection, props) {
3184 var index = -1,
3185 length = collection.length,
3186 isArr = isLength(length),
3187 propsLength = props.length,
3188 result = Array(propsLength);
3189
3190 while(++index < propsLength) {
3191 var key = props[index];
3192 if (isArr) {
3193 result[index] = isIndex(key, length) ? collection[key] : undefined;
3194 } else {
3195 result[index] = collection[key];
3196 }
3197 }
3198 return result;
3199 }
3200
3201 /**
3202 * Copies properties of `source` to `object`.
3203 *
3204 * @private
3205 * @param {Object} source The object to copy properties from.
3206 * @param {Array} props The property names to copy.
3207 * @param {Object} [object={}] The object to copy properties to.
3208 * @returns {Object} Returns `object`.
3209 */
3210 function baseCopy(source, props, object) {
3211 object || (object = {});
3212
3213 var index = -1,
3214 length = props.length;
3215
3216 while (++index < length) {
3217 var key = props[index];
3218 object[key] = source[key];
3219 }
3220 return object;
3221 }
3222
3223 /**
3224 * The base implementation of `_.callback` which supports specifying the
3225 * number of arguments to provide to `func`.
3226 *
3227 * @private
3228 * @param {*} [func=_.identity] The value to convert to a callback.
3229 * @param {*} [thisArg] The `this` binding of `func`.
3230 * @param {number} [argCount] The number of arguments to provide to `func`.
3231 * @returns {Function} Returns the callback.
3232 */
3233 function baseCallback(func, thisArg, argCount) {
3234 var type = typeof func;
3235 if (type == 'function') {
3236 return thisArg === undefined
3237 ? func
3238 : bindCallback(func, thisArg, argCount);
3239 }
3240 if (func == null) {
3241 return identity;
3242 }
3243 if (type == 'object') {
3244 return baseMatches(func);
3245 }
3246 return thisArg === undefined
3247 ? property(func)
3248 : baseMatchesProperty(func, thisArg);
3249 }
3250
3251 /**
3252 * The base implementation of `_.clone` without support for argument juggling
3253 * and `this` binding `customizer` functions.
3254 *
3255 * @private
3256 * @param {*} value The value to clone.
3257 * @param {boolean} [isDeep] Specify a deep clone.
3258 * @param {Function} [customizer] The function to customize cloning values.
3259 * @param {string} [key] The key of `value`.
3260 * @param {Object} [object] The object `value` belongs to.
3261 * @param {Array} [stackA=[]] Tracks traversed source objects.
3262 * @param {Array} [stackB=[]] Associates clones with source counterparts.
3263 * @returns {*} Returns the cloned value.
3264 */
3265 function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
3266 var result;
3267 if (customizer) {
3268 result = object ? customizer(value, key, object) : customizer(value);
3269 }
3270 if (result !== undefined) {
3271 return result;
3272 }
3273 if (!isObject(value)) {
3274 return value;
3275 }
3276 var isArr = isArray(value);
3277 if (isArr) {
3278 result = initCloneArray(value);
3279 if (!isDeep) {
3280 return arrayCopy(value, result);
3281 }
3282 } else {
3283 var tag = objToString.call(value),
3284 isFunc = tag == funcTag;
3285
3286 if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
3287 result = initCloneObject(isFunc ? {} : value);
3288 if (!isDeep) {
3289 return baseAssign(result, value);
3290 }
3291 } else {
3292 return cloneableTags[tag]
3293 ? initCloneByTag(value, tag, isDeep)
3294 : (object ? value : {});
3295 }
3296 }
3297 // Check for circular references and return corresponding clone.
3298 stackA || (stackA = []);
3299 stackB || (stackB = []);
3300
3301 var length = stackA.length;
3302 while (length--) {
3303 if (stackA[length] == value) {
3304 return stackB[length];
3305 }
3306 }
3307 // Add the source value to the stack of traversed objects and associate it with its clone.
3308 stackA.push(value);
3309 stackB.push(result);
3310
3311 // Recursively populate clone (susceptible to call stack limits).
3312 (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
3313 result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
3314 });
3315 return result;
3316 }
3317
3318 /**
3319 * The base implementation of `_.create` without support for assigning
3320 * properties to the created object.
3321 *
3322 * @private
3323 * @param {Object} prototype The object to inherit from.
3324 * @returns {Object} Returns the new object.
3325 */
3326 var baseCreate = (function() {
3327 function Object() {}
3328 return function(prototype) {
3329 if (isObject(prototype)) {
3330 Object.prototype = prototype;
3331 var result = new Object;
3332 Object.prototype = null;
3333 }
3334 return result || context.Object();
3335 };
3336 }());
3337
3338 /**
3339 * The base implementation of `_.delay` and `_.defer` which accepts an index
3340 * of where to slice the arguments to provide to `func`.
3341 *
3342 * @private
3343 * @param {Function} func The function to delay.
3344 * @param {number} wait The number of milliseconds to delay invocation.
3345 * @param {Object} args The arguments provide to `func`.
3346 * @returns {number} Returns the timer id.
3347 */
3348 function baseDelay(func, wait, args) {
3349 if (typeof func != 'function') {
3350 throw new TypeError(FUNC_ERROR_TEXT);
3351 }
3352 return setTimeout(function() { func.apply(undefined, args); }, wait);
3353 }
3354
3355 /**
3356 * The base implementation of `_.difference` which accepts a single array
3357 * of values to exclude.
3358 *
3359 * @private
3360 * @param {Array} array The array to inspect.
3361 * @param {Array} values The values to exclude.
3362 * @returns {Array} Returns the new array of filtered values.
3363 */
3364 function baseDifference(array, values) {
3365 var length = array ? array.length : 0,
3366 result = [];
3367
3368 if (!length) {
3369 return result;
3370 }
3371 var index = -1,
3372 indexOf = getIndexOf(),
3373 isCommon = indexOf == baseIndexOf,
3374 cache = (isCommon && values.length >= 200) ? createCache(values) : null,
3375 valuesLength = values.length;
3376
3377 if (cache) {
3378 indexOf = cacheIndexOf;
3379 isCommon = false;
3380 values = cache;
3381 }
3382 outer:
3383 while (++index < length) {
3384 var value = array[index];
3385
3386 if (isCommon && value === value) {
3387 var valuesIndex = valuesLength;
3388 while (valuesIndex--) {
3389 if (values[valuesIndex] === value) {
3390 continue outer;
3391 }
3392 }
3393 result.push(value);
3394 }
3395 else if (indexOf(values, value, 0) < 0) {
3396 result.push(value);
3397 }
3398 }
3399 return result;
3400 }
3401
3402 /**
3403 * The base implementation of `_.forEach` without support for callback
3404 * shorthands and `this` binding.
3405 *
3406 * @private
3407 * @param {Array|Object|string} collection The collection to iterate over.
3408 * @param {Function} iteratee The function invoked per iteration.
3409 * @returns {Array|Object|string} Returns `collection`.
3410 */
3411 var baseEach = createBaseEach(baseForOwn);
3412
3413 /**
3414 * The base implementation of `_.forEachRight` without support for callback
3415 * shorthands and `this` binding.
3416 *
3417 * @private
3418 * @param {Array|Object|string} collection The collection to iterate over.
3419 * @param {Function} iteratee The function invoked per iteration.
3420 * @returns {Array|Object|string} Returns `collection`.
3421 */
3422 var baseEachRight = createBaseEach(baseForOwnRight, true);
3423
3424 /**
3425 * The base implementation of `_.every` without support for callback
3426 * shorthands and `this` binding.
3427 *
3428 * @private
3429 * @param {Array|Object|string} collection The collection to iterate over.
3430 * @param {Function} predicate The function invoked per iteration.
3431 * @returns {boolean} Returns `true` if all elements pass the predicate check,
3432 * else `false`
3433 */
3434 function baseEvery(collection, predicate) {
3435 var result = true;
3436 baseEach(collection, function(value, index, collection) {
3437 result = !!predicate(value, index, collection);
3438 return result;
3439 });
3440 return result;
3441 }
3442
3443 /**
3444 * The base implementation of `_.fill` without an iteratee call guard.
3445 *
3446 * @private
3447 * @param {Array} array The array to fill.
3448 * @param {*} value The value to fill `array` with.
3449 * @param {number} [start=0] The start position.
3450 * @param {number} [end=array.length] The end position.
3451 * @returns {Array} Returns `array`.
3452 */
3453 function baseFill(array, value, start, end) {
3454 var length = array.length;
3455
3456 start = start == null ? 0 : (+start || 0);
3457 if (start < 0) {
3458 start = -start > length ? 0 : (length + start);
3459 }
3460 end = (end === undefined || end > length) ? length : (+end || 0);
3461 if (end < 0) {
3462 end += length;
3463 }
3464 length = start > end ? 0 : (end >>> 0);
3465 start >>>= 0;
3466
3467 while (start < length) {
3468 array[start++] = value;
3469 }
3470 return array;
3471 }
3472
3473 /**
3474 * The base implementation of `_.filter` without support for callback
3475 * shorthands and `this` binding.
3476 *
3477 * @private
3478 * @param {Array|Object|string} collection The collection to iterate over.
3479 * @param {Function} predicate The function invoked per iteration.
3480 * @returns {Array} Returns the new filtered array.
3481 */
3482 function baseFilter(collection, predicate) {
3483 var result = [];
3484 baseEach(collection, function(value, index, collection) {
3485 if (predicate(value, index, collection)) {
3486 result.push(value);
3487 }
3488 });
3489 return result;
3490 }
3491
3492 /**
3493 * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
3494 * without support for callback shorthands and `this` binding, which iterates
3495 * over `collection` using the provided `eachFunc`.
3496 *
3497 * @private
3498 * @param {Array|Object|string} collection The collection to search.
3499 * @param {Function} predicate The function invoked per iteration.
3500 * @param {Function} eachFunc The function to iterate over `collection`.
3501 * @param {boolean} [retKey] Specify returning the key of the found element
3502 * instead of the element itself.
3503 * @returns {*} Returns the found element or its key, else `undefined`.
3504 */
3505 function baseFind(collection, predicate, eachFunc, retKey) {
3506 var result;
3507 eachFunc(collection, function(value, key, collection) {
3508 if (predicate(value, key, collection)) {
3509 result = retKey ? key : value;
3510 return false;
3511 }
3512 });
3513 return result;
3514 }
3515
3516 /**
3517 * The base implementation of `_.flatten` with added support for restricting
3518 * flattening and specifying the start index.
3519 *
3520 * @private
3521 * @param {Array} array The array to flatten.
3522 * @param {boolean} isDeep Specify a deep flatten.
3523 * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
3524 * @returns {Array} Returns the new flattened array.
3525 */
3526 function baseFlatten(array, isDeep, isStrict) {
3527 var index = -1,
3528 length = array.length,
3529 resIndex = -1,
3530 result = [];
3531
3532 while (++index < length) {
3533 var value = array[index];
3534
3535 if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
3536 if (isDeep) {
3537 // Recursively flatten arrays (susceptible to call stack limits).
3538 value = baseFlatten(value, isDeep, isStrict);
3539 }
3540 var valIndex = -1,
3541 valLength = value.length;
3542
3543 result.length += valLength;
3544 while (++valIndex < valLength) {
3545 result[++resIndex] = value[valIndex];
3546 }
3547 } else if (!isStrict) {
3548 result[++resIndex] = value;
3549 }
3550 }
3551 return result;
3552 }
3553
3554 /**
3555 * The base implementation of `baseForIn` and `baseForOwn` which iterates
3556 * over `object` properties returned by `keysFunc` invoking `iteratee` for
3557 * each property. Iteratee functions may exit iteration early by explicitly
3558 * returning `false`.
3559 *
3560 * @private
3561 * @param {Object} object The object to iterate over.
3562 * @param {Function} iteratee The function invoked per iteration.
3563 * @param {Function} keysFunc The function to get the keys of `object`.
3564 * @returns {Object} Returns `object`.
3565 */
3566 var baseFor = createBaseFor();
3567
3568 /**
3569 * This function is like `baseFor` except that it iterates over properties
3570 * in the opposite order.
3571 *
3572 * @private
3573 * @param {Object} object The object to iterate over.
3574 * @param {Function} iteratee The function invoked per iteration.
3575 * @param {Function} keysFunc The function to get the keys of `object`.
3576 * @returns {Object} Returns `object`.
3577 */
3578 var baseForRight = createBaseFor(true);
3579
3580 /**
3581 * The base implementation of `_.forIn` without support for callback
3582 * shorthands and `this` binding.
3583 *
3584 * @private
3585 * @param {Object} object The object to iterate over.
3586 * @param {Function} iteratee The function invoked per iteration.
3587 * @returns {Object} Returns `object`.
3588 */
3589 function baseForIn(object, iteratee) {
3590 return baseFor(object, iteratee, keysIn);
3591 }
3592
3593 /**
3594 * The base implementation of `_.forOwn` without support for callback
3595 * shorthands and `this` binding.
3596 *
3597 * @private
3598 * @param {Object} object The object to iterate over.
3599 * @param {Function} iteratee The function invoked per iteration.
3600 * @returns {Object} Returns `object`.
3601 */
3602 function baseForOwn(object, iteratee) {
3603 return baseFor(object, iteratee, keys);
3604 }
3605
3606 /**
3607 * The base implementation of `_.forOwnRight` without support for callback
3608 * shorthands and `this` binding.
3609 *
3610 * @private
3611 * @param {Object} object The object to iterate over.
3612 * @param {Function} iteratee The function invoked per iteration.
3613 * @returns {Object} Returns `object`.
3614 */
3615 function baseForOwnRight(object, iteratee) {
3616 return baseForRight(object, iteratee, keys);
3617 }
3618
3619 /**
3620 * The base implementation of `_.functions` which creates an array of
3621 * `object` function property names filtered from those provided.
3622 *
3623 * @private
3624 * @param {Object} object The object to inspect.
3625 * @param {Array} props The property names to filter.
3626 * @returns {Array} Returns the new array of filtered property names.
3627 */
3628 function baseFunctions(object, props) {
3629 var index = -1,
3630 length = props.length,
3631 resIndex = -1,
3632 result = [];
3633
3634 while (++index < length) {
3635 var key = props[index];
3636 if (isFunction(object[key])) {
3637 result[++resIndex] = key;
3638 }
3639 }
3640 return result;
3641 }
3642
3643 /**
3644 * The base implementation of `get` without support for string paths
3645 * and default values.
3646 *
3647 * @private
3648 * @param {Object} object The object to query.
3649 * @param {Array} path The path of the property to get.
3650 * @param {string} [pathKey] The key representation of path.
3651 * @returns {*} Returns the resolved value.
3652 */
3653 function baseGet(object, path, pathKey) {
3654 if (object == null) {
3655 return;
3656 }
3657 if (pathKey !== undefined && pathKey in toObject(object)) {
3658 path = [pathKey];
3659 }
3660 var index = -1,
3661 length = path.length;
3662
3663 while (object != null && ++index < length) {
3664 var result = object = object[path[index]];
3665 }
3666 return result;
3667 }
3668
3669 /**
3670 * The base implementation of `_.isEqual` without support for `this` binding
3671 * `customizer` functions.
3672 *
3673 * @private
3674 * @param {*} value The value to compare.
3675 * @param {*} other The other value to compare.
3676 * @param {Function} [customizer] The function to customize comparing values.
3677 * @param {boolean} [isLoose] Specify performing partial comparisons.
3678 * @param {Array} [stackA] Tracks traversed `value` objects.
3679 * @param {Array} [stackB] Tracks traversed `other` objects.
3680 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3681 */
3682 function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
3683 // Exit early for identical values.
3684 if (value === other) {
3685 // Treat `+0` vs. `-0` as not equal.
3686 return value !== 0 || (1 / value == 1 / other);
3687 }
3688 var valType = typeof value,
3689 othType = typeof other;
3690
3691 // Exit early for unlike primitive values.
3692 if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||
3693 value == null || other == null) {
3694 // Return `false` unless both values are `NaN`.
3695 return value !== value && other !== other;
3696 }
3697 return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
3698 }
3699
3700 /**
3701 * A specialized version of `baseIsEqual` for arrays and objects which performs
3702 * deep comparisons and tracks traversed objects enabling objects with circular
3703 * references to be compared.
3704 *
3705 * @private
3706 * @param {Object} object The object to compare.
3707 * @param {Object} other The other object to compare.
3708 * @param {Function} equalFunc The function to determine equivalents of values.
3709 * @param {Function} [customizer] The function to customize comparing objects.
3710 * @param {boolean} [isLoose] Specify performing partial comparisons.
3711 * @param {Array} [stackA=[]] Tracks traversed `value` objects.
3712 * @param {Array} [stackB=[]] Tracks traversed `other` objects.
3713 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3714 */
3715 function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
3716 var objIsArr = isArray(object),
3717 othIsArr = isArray(other),
3718 objTag = arrayTag,
3719 othTag = arrayTag;
3720
3721 if (!objIsArr) {
3722 objTag = objToString.call(object);
3723 if (objTag == argsTag) {
3724 objTag = objectTag;
3725 } else if (objTag != objectTag) {
3726 objIsArr = isTypedArray(object);
3727 }
3728 }
3729 if (!othIsArr) {
3730 othTag = objToString.call(other);
3731 if (othTag == argsTag) {
3732 othTag = objectTag;
3733 } else if (othTag != objectTag) {
3734 othIsArr = isTypedArray(other);
3735 }
3736 }
3737 var objIsObj = objTag == objectTag,
3738 othIsObj = othTag == objectTag,
3739 isSameTag = objTag == othTag;
3740
3741 if (isSameTag && !(objIsArr || objIsObj)) {
3742 return equalByTag(object, other, objTag);
3743 }
3744 if (!isLoose) {
3745 var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
3746 othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
3747
3748 if (valWrapped || othWrapped) {
3749 return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
3750 }
3751 }
3752 if (!isSameTag) {
3753 return false;
3754 }
3755 // Assume cyclic values are equal.
3756 // For more information on detecting circular references see https://es5.github.io/#JO.
3757 stackA || (stackA = []);
3758 stackB || (stackB = []);
3759
3760 var length = stackA.length;
3761 while (length--) {
3762 if (stackA[length] == object) {
3763 return stackB[length] == other;
3764 }
3765 }
3766 // Add `object` and `other` to the stack of traversed objects.
3767 stackA.push(object);
3768 stackB.push(other);
3769
3770 var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
3771
3772 stackA.pop();
3773 stackB.pop();
3774
3775 return result;
3776 }
3777
3778 /**
3779 * The base implementation of `_.isMatch` without support for callback
3780 * shorthands and `this` binding.
3781 *
3782 * @private
3783 * @param {Object} object The object to inspect.
3784 * @param {Array} props The source property names to match.
3785 * @param {Array} values The source values to match.
3786 * @param {Array} strictCompareFlags Strict comparison flags for source values.
3787 * @param {Function} [customizer] The function to customize comparing objects.
3788 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
3789 */
3790 function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
3791 var index = -1,
3792 length = props.length,
3793 noCustomizer = !customizer;
3794
3795 while (++index < length) {
3796 if ((noCustomizer && strictCompareFlags[index])
3797 ? values[index] !== object[props[index]]
3798 : !(props[index] in object)
3799 ) {
3800 return false;
3801 }
3802 }
3803 index = -1;
3804 while (++index < length) {
3805 var key = props[index],
3806 objValue = object[key],
3807 srcValue = values[index];
3808
3809 if (noCustomizer && strictCompareFlags[index]) {
3810 var result = objValue !== undefined || (key in object);
3811 } else {
3812 result = customizer ? customizer(objValue, srcValue, key) : undefined;
3813 if (result === undefined) {
3814 result = baseIsEqual(srcValue, objValue, customizer, true);
3815 }
3816 }
3817 if (!result) {
3818 return false;
3819 }
3820 }
3821 return true;
3822 }
3823
3824 /**
3825 * The base implementation of `_.map` without support for callback shorthands
3826 * and `this` binding.
3827 *
3828 * @private
3829 * @param {Array|Object|string} collection The collection to iterate over.
3830 * @param {Function} iteratee The function invoked per iteration.
3831 * @returns {Array} Returns the new mapped array.
3832 */
3833 function baseMap(collection, iteratee) {
3834 var index = -1,
3835 length = getLength(collection),
3836 result = isLength(length) ? Array(length) : [];
3837
3838 baseEach(collection, function(value, key, collection) {
3839 result[++index] = iteratee(value, key, collection);
3840 });
3841 return result;
3842 }
3843
3844 /**
3845 * The base implementation of `_.matches` which does not clone `source`.
3846 *
3847 * @private
3848 * @param {Object} source The object of property values to match.
3849 * @returns {Function} Returns the new function.
3850 */
3851 function baseMatches(source) {
3852 var props = keys(source),
3853 length = props.length;
3854
3855 if (!length) {
3856 return constant(true);
3857 }
3858 if (length == 1) {
3859 var key = props[0],
3860 value = source[key];
3861
3862 if (isStrictComparable(value)) {
3863 return function(object) {
3864 if (object == null) {
3865 return false;
3866 }
3867 return object[key] === value && (value !== undefined || (key in toObject(object)));
3868 };
3869 }
3870 }
3871 var values = Array(length),
3872 strictCompareFlags = Array(length);
3873
3874 while (length--) {
3875 value = source[props[length]];
3876 values[length] = value;
3877 strictCompareFlags[length] = isStrictComparable(value);
3878 }
3879 return function(object) {
3880 return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);
3881 };
3882 }
3883
3884 /**
3885 * The base implementation of `_.matchesProperty` which does not which does
3886 * not clone `value`.
3887 *
3888 * @private
3889 * @param {string} path The path of the property to get.
3890 * @param {*} value The value to compare.
3891 * @returns {Function} Returns the new function.
3892 */
3893 function baseMatchesProperty(path, value) {
3894 var isArr = isArray(path),
3895 isCommon = isKey(path) && isStrictComparable(value),
3896 pathKey = (path + '');
3897
3898 path = toPath(path);
3899 return function(object) {
3900 if (object == null) {
3901 return false;
3902 }
3903 var key = pathKey;
3904 object = toObject(object);
3905 if ((isArr || !isCommon) && !(key in object)) {
3906 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
3907 if (object == null) {
3908 return false;
3909 }
3910 key = last(path);
3911 object = toObject(object);
3912 }
3913 return object[key] === value
3914 ? (value !== undefined || (key in object))
3915 : baseIsEqual(value, object[key], null, true);
3916 };
3917 }
3918
3919 /**
3920 * The base implementation of `_.merge` without support for argument juggling,
3921 * multiple sources, and `this` binding `customizer` functions.
3922 *
3923 * @private
3924 * @param {Object} object The destination object.
3925 * @param {Object} source The source object.
3926 * @param {Function} [customizer] The function to customize merging properties.
3927 * @param {Array} [stackA=[]] Tracks traversed source objects.
3928 * @param {Array} [stackB=[]] Associates values with source counterparts.
3929 * @returns {Object} Returns `object`.
3930 */
3931 function baseMerge(object, source, customizer, stackA, stackB) {
3932 if (!isObject(object)) {
3933 return object;
3934 }
3935 var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
3936 if (!isSrcArr) {
3937 var props = keys(source);
3938 push.apply(props, getSymbols(source));
3939 }
3940 arrayEach(props || source, function(srcValue, key) {
3941 if (props) {
3942 key = srcValue;
3943 srcValue = source[key];
3944 }
3945 if (isObjectLike(srcValue)) {
3946 stackA || (stackA = []);
3947 stackB || (stackB = []);
3948 baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
3949 }
3950 else {
3951 var value = object[key],
3952 result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
3953 isCommon = result === undefined;
3954
3955 if (isCommon) {
3956 result = srcValue;
3957 }
3958 if ((isSrcArr || result !== undefined) &&
3959 (isCommon || (result === result ? (result !== value) : (value === value)))) {
3960 object[key] = result;
3961 }
3962 }
3963 });
3964 return object;
3965 }
3966
3967 /**
3968 * A specialized version of `baseMerge` for arrays and objects which performs
3969 * deep merges and tracks traversed objects enabling objects with circular
3970 * references to be merged.
3971 *
3972 * @private
3973 * @param {Object} object The destination object.
3974 * @param {Object} source The source object.
3975 * @param {string} key The key of the value to merge.
3976 * @param {Function} mergeFunc The function to merge values.
3977 * @param {Function} [customizer] The function to customize merging properties.
3978 * @param {Array} [stackA=[]] Tracks traversed source objects.
3979 * @param {Array} [stackB=[]] Associates values with source counterparts.
3980 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3981 */
3982 function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
3983 var length = stackA.length,
3984 srcValue = source[key];
3985
3986 while (length--) {
3987 if (stackA[length] == srcValue) {
3988 object[key] = stackB[length];
3989 return;
3990 }
3991 }
3992 var value = object[key],
3993 result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
3994 isCommon = result === undefined;
3995
3996 if (isCommon) {
3997 result = srcValue;
3998 if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
3999 result = isArray(value)
4000 ? value
4001 : (getLength(value) ? arrayCopy(value) : []);
4002 }
4003 else if (isPlainObject(srcValue) || isArguments(srcValue)) {
4004 result = isArguments(value)
4005 ? toPlainObject(value)
4006 : (isPlainObject(value) ? value : {});
4007 }
4008 else {
4009 isCommon = false;
4010 }
4011 }
4012 // Add the source value to the stack of traversed objects and associate
4013 // it with its merged value.
4014 stackA.push(srcValue);
4015 stackB.push(result);
4016
4017 if (isCommon) {
4018 // Recursively merge objects and arrays (susceptible to call stack limits).
4019 object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
4020 } else if (result === result ? (result !== value) : (value === value)) {
4021 object[key] = result;
4022 }
4023 }
4024
4025 /**
4026 * The base implementation of `_.property` without support for deep paths.
4027 *
4028 * @private
4029 * @param {string} key The key of the property to get.
4030 * @returns {Function} Returns the new function.
4031 */
4032 function baseProperty(key) {
4033 return function(object) {
4034 return object == null ? undefined : object[key];
4035 };
4036 }
4037
4038 /**
4039 * A specialized version of `baseProperty` which supports deep paths.
4040 *
4041 * @private
4042 * @param {Array|string} path The path of the property to get.
4043 * @returns {Function} Returns the new function.
4044 */
4045 function basePropertyDeep(path) {
4046 var pathKey = (path + '');
4047 path = toPath(path);
4048 return function(object) {
4049 return baseGet(object, path, pathKey);
4050 };
4051 }
4052
4053 /**
4054 * The base implementation of `_.pullAt` without support for individual
4055 * index arguments and capturing the removed elements.
4056 *
4057 * @private
4058 * @param {Array} array The array to modify.
4059 * @param {number[]} indexes The indexes of elements to remove.
4060 * @returns {Array} Returns `array`.
4061 */
4062 function basePullAt(array, indexes) {
4063 var length = indexes.length;
4064 while (length--) {
4065 var index = parseFloat(indexes[length]);
4066 if (index != previous && isIndex(index)) {
4067 var previous = index;
4068 splice.call(array, index, 1);
4069 }
4070 }
4071 return array;
4072 }
4073
4074 /**
4075 * The base implementation of `_.random` without support for argument juggling
4076 * and returning floating-point numbers.
4077 *
4078 * @private
4079 * @param {number} min The minimum possible value.
4080 * @param {number} max The maximum possible value.
4081 * @returns {number} Returns the random number.
4082 */
4083 function baseRandom(min, max) {
4084 return min + floor(nativeRandom() * (max - min + 1));
4085 }
4086
4087 /**
4088 * The base implementation of `_.reduce` and `_.reduceRight` without support
4089 * for callback shorthands and `this` binding, which iterates over `collection`
4090 * using the provided `eachFunc`.
4091 *
4092 * @private
4093 * @param {Array|Object|string} collection The collection to iterate over.
4094 * @param {Function} iteratee The function invoked per iteration.
4095 * @param {*} accumulator The initial value.
4096 * @param {boolean} initFromCollection Specify using the first or last element
4097 * of `collection` as the initial value.
4098 * @param {Function} eachFunc The function to iterate over `collection`.
4099 * @returns {*} Returns the accumulated value.
4100 */
4101 function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
4102 eachFunc(collection, function(value, index, collection) {
4103 accumulator = initFromCollection
4104 ? (initFromCollection = false, value)
4105 : iteratee(accumulator, value, index, collection);
4106 });
4107 return accumulator;
4108 }
4109
4110 /**
4111 * The base implementation of `setData` without support for hot loop detection.
4112 *
4113 * @private
4114 * @param {Function} func The function to associate metadata with.
4115 * @param {*} data The metadata.
4116 * @returns {Function} Returns `func`.
4117 */
4118 var baseSetData = !metaMap ? identity : function(func, data) {
4119 metaMap.set(func, data);
4120 return func;
4121 };
4122
4123 /**
4124 * The base implementation of `_.slice` without an iteratee call guard.
4125 *
4126 * @private
4127 * @param {Array} array The array to slice.
4128 * @param {number} [start=0] The start position.
4129 * @param {number} [end=array.length] The end position.
4130 * @returns {Array} Returns the slice of `array`.
4131 */
4132 function baseSlice(array, start, end) {
4133 var index = -1,
4134 length = array.length;
4135
4136 start = start == null ? 0 : (+start || 0);
4137 if (start < 0) {
4138 start = -start > length ? 0 : (length + start);
4139 }
4140 end = (end === undefined || end > length) ? length : (+end || 0);
4141 if (end < 0) {
4142 end += length;
4143 }
4144 length = start > end ? 0 : ((end - start) >>> 0);
4145 start >>>= 0;
4146
4147 var result = Array(length);
4148 while (++index < length) {
4149 result[index] = array[index + start];
4150 }
4151 return result;
4152 }
4153
4154 /**
4155 * The base implementation of `_.some` without support for callback shorthands
4156 * and `this` binding.
4157 *
4158 * @private
4159 * @param {Array|Object|string} collection The collection to iterate over.
4160 * @param {Function} predicate The function invoked per iteration.
4161 * @returns {boolean} Returns `true` if any element passes the predicate check,
4162 * else `false`.
4163 */
4164 function baseSome(collection, predicate) {
4165 var result;
4166
4167 baseEach(collection, function(value, index, collection) {
4168 result = predicate(value, index, collection);
4169 return !result;
4170 });
4171 return !!result;
4172 }
4173
4174 /**
4175 * The base implementation of `_.sortBy` which uses `comparer` to define
4176 * the sort order of `array` and replaces criteria objects with their
4177 * corresponding values.
4178 *
4179 * @private
4180 * @param {Array} array The array to sort.
4181 * @param {Function} comparer The function to define sort order.
4182 * @returns {Array} Returns `array`.
4183 */
4184 function baseSortBy(array, comparer) {
4185 var length = array.length;
4186
4187 array.sort(comparer);
4188 while (length--) {
4189 array[length] = array[length].value;
4190 }
4191 return array;
4192 }
4193
4194 /**
4195 * The base implementation of `_.sortByOrder` without param guards.
4196 *
4197 * @private
4198 * @param {Array|Object|string} collection The collection to iterate over.
4199 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
4200 * @param {boolean[]} orders The sort orders of `iteratees`.
4201 * @returns {Array} Returns the new sorted array.
4202 */
4203 function baseSortByOrder(collection, iteratees, orders) {
4204 var callback = getCallback(),
4205 index = -1;
4206
4207 iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });
4208
4209 var result = baseMap(collection, function(value) {
4210 var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
4211 return { 'criteria': criteria, 'index': ++index, 'value': value };
4212 });
4213
4214 return baseSortBy(result, function(object, other) {
4215 return compareMultiple(object, other, orders);
4216 });
4217 }
4218
4219 /**
4220 * The base implementation of `_.sum` without support for callback shorthands
4221 * and `this` binding.
4222 *
4223 * @private
4224 * @param {Array|Object|string} collection The collection to iterate over.
4225 * @param {Function} iteratee The function invoked per iteration.
4226 * @returns {number} Returns the sum.
4227 */
4228 function baseSum(collection, iteratee) {
4229 var result = 0;
4230 baseEach(collection, function(value, index, collection) {
4231 result += +iteratee(value, index, collection) || 0;
4232 });
4233 return result;
4234 }
4235
4236 /**
4237 * The base implementation of `_.uniq` without support for callback shorthands
4238 * and `this` binding.
4239 *
4240 * @private
4241 * @param {Array} array The array to inspect.
4242 * @param {Function} [iteratee] The function invoked per iteration.
4243 * @returns {Array} Returns the new duplicate-value-free array.
4244 */
4245 function baseUniq(array, iteratee) {
4246 var index = -1,
4247 indexOf = getIndexOf(),
4248 length = array.length,
4249 isCommon = indexOf == baseIndexOf,
4250 isLarge = isCommon && length >= 200,
4251 seen = isLarge ? createCache() : null,
4252 result = [];
4253
4254 if (seen) {
4255 indexOf = cacheIndexOf;
4256 isCommon = false;
4257 } else {
4258 isLarge = false;
4259 seen = iteratee ? [] : result;
4260 }
4261 outer:
4262 while (++index < length) {
4263 var value = array[index],
4264 computed = iteratee ? iteratee(value, index, array) : value;
4265
4266 if (isCommon && value === value) {
4267 var seenIndex = seen.length;
4268 while (seenIndex--) {
4269 if (seen[seenIndex] === computed) {
4270 continue outer;
4271 }
4272 }
4273 if (iteratee) {
4274 seen.push(computed);
4275 }
4276 result.push(value);
4277 }
4278 else if (indexOf(seen, computed, 0) < 0) {
4279 if (iteratee || isLarge) {
4280 seen.push(computed);
4281 }
4282 result.push(value);
4283 }
4284 }
4285 return result;
4286 }
4287
4288 /**
4289 * The base implementation of `_.values` and `_.valuesIn` which creates an
4290 * array of `object` property values corresponding to the property names
4291 * of `props`.
4292 *
4293 * @private
4294 * @param {Object} object The object to query.
4295 * @param {Array} props The property names to get values for.
4296 * @returns {Object} Returns the array of property values.
4297 */
4298 function baseValues(object, props) {
4299 var index = -1,
4300 length = props.length,
4301 result = Array(length);
4302
4303 while (++index < length) {
4304 result[index] = object[props[index]];
4305 }
4306 return result;
4307 }
4308
4309 /**
4310 * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
4311 * and `_.takeWhile` without support for callback shorthands and `this` binding.
4312 *
4313 * @private
4314 * @param {Array} array The array to query.
4315 * @param {Function} predicate The function invoked per iteration.
4316 * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
4317 * @param {boolean} [fromRight] Specify iterating from right to left.
4318 * @returns {Array} Returns the slice of `array`.
4319 */
4320 function baseWhile(array, predicate, isDrop, fromRight) {
4321 var length = array.length,
4322 index = fromRight ? length : -1;
4323
4324 while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
4325 return isDrop
4326 ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
4327 : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
4328 }
4329
4330 /**
4331 * The base implementation of `wrapperValue` which returns the result of
4332 * performing a sequence of actions on the unwrapped `value`, where each
4333 * successive action is supplied the return value of the previous.
4334 *
4335 * @private
4336 * @param {*} value The unwrapped value.
4337 * @param {Array} actions Actions to peform to resolve the unwrapped value.
4338 * @returns {*} Returns the resolved value.
4339 */
4340 function baseWrapperValue(value, actions) {
4341 var result = value;
4342 if (result instanceof LazyWrapper) {
4343 result = result.value();
4344 }
4345 var index = -1,
4346 length = actions.length;
4347
4348 while (++index < length) {
4349 var args = [result],
4350 action = actions[index];
4351
4352 push.apply(args, action.args);
4353 result = action.func.apply(action.thisArg, args);
4354 }
4355 return result;
4356 }
4357
4358 /**
4359 * Performs a binary search of `array` to determine the index at which `value`
4360 * should be inserted into `array` in order to maintain its sort order.
4361 *
4362 * @private
4363 * @param {Array} array The sorted array to inspect.
4364 * @param {*} value The value to evaluate.
4365 * @param {boolean} [retHighest] Specify returning the highest qualified index.
4366 * @returns {number} Returns the index at which `value` should be inserted
4367 * into `array`.
4368 */
4369 function binaryIndex(array, value, retHighest) {
4370 var low = 0,
4371 high = array ? array.length : low;
4372
4373 if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
4374 while (low < high) {
4375 var mid = (low + high) >>> 1,
4376 computed = array[mid];
4377
4378 if (retHighest ? (computed <= value) : (computed < value)) {
4379 low = mid + 1;
4380 } else {
4381 high = mid;
4382 }
4383 }
4384 return high;
4385 }
4386 return binaryIndexBy(array, value, identity, retHighest);
4387 }
4388
4389 /**
4390 * This function is like `binaryIndex` except that it invokes `iteratee` for
4391 * `value` and each element of `array` to compute their sort ranking. The
4392 * iteratee is invoked with one argument; (value).
4393 *
4394 * @private
4395 * @param {Array} array The sorted array to inspect.
4396 * @param {*} value The value to evaluate.
4397 * @param {Function} iteratee The function invoked per iteration.
4398 * @param {boolean} [retHighest] Specify returning the highest qualified index.
4399 * @returns {number} Returns the index at which `value` should be inserted
4400 * into `array`.
4401 */
4402 function binaryIndexBy(array, value, iteratee, retHighest) {
4403 value = iteratee(value);
4404
4405 var low = 0,
4406 high = array ? array.length : 0,
4407 valIsNaN = value !== value,
4408 valIsUndef = value === undefined;
4409
4410 while (low < high) {
4411 var mid = floor((low + high) / 2),
4412 computed = iteratee(array[mid]),
4413 isReflexive = computed === computed;
4414
4415 if (valIsNaN) {
4416 var setLow = isReflexive || retHighest;
4417 } else if (valIsUndef) {
4418 setLow = isReflexive && (retHighest || computed !== undefined);
4419 } else {
4420 setLow = retHighest ? (computed <= value) : (computed < value);
4421 }
4422 if (setLow) {
4423 low = mid + 1;
4424 } else {
4425 high = mid;
4426 }
4427 }
4428 return nativeMin(high, MAX_ARRAY_INDEX);
4429 }
4430
4431 /**
4432 * A specialized version of `baseCallback` which only supports `this` binding
4433 * and specifying the number of arguments to provide to `func`.
4434 *
4435 * @private
4436 * @param {Function} func The function to bind.
4437 * @param {*} thisArg The `this` binding of `func`.
4438 * @param {number} [argCount] The number of arguments to provide to `func`.
4439 * @returns {Function} Returns the callback.
4440 */
4441 function bindCallback(func, thisArg, argCount) {
4442 if (typeof func != 'function') {
4443 return identity;
4444 }
4445 if (thisArg === undefined) {
4446 return func;
4447 }
4448 switch (argCount) {
4449 case 1: return function(value) {
4450 return func.call(thisArg, value);
4451 };
4452 case 3: return function(value, index, collection) {
4453 return func.call(thisArg, value, index, collection);
4454 };
4455 case 4: return function(accumulator, value, index, collection) {
4456 return func.call(thisArg, accumulator, value, index, collection);
4457 };
4458 case 5: return function(value, other, key, object, source) {
4459 return func.call(thisArg, value, other, key, object, source);
4460 };
4461 }
4462 return function() {
4463 return func.apply(thisArg, arguments);
4464 };
4465 }
4466
4467 /**
4468 * Creates a clone of the given array buffer.
4469 *
4470 * @private
4471 * @param {ArrayBuffer} buffer The array buffer to clone.
4472 * @returns {ArrayBuffer} Returns the cloned array buffer.
4473 */
4474 function bufferClone(buffer) {
4475 return bufferSlice.call(buffer, 0);
4476 }
4477 if (!bufferSlice) {
4478 // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.
4479 bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {
4480 var byteLength = buffer.byteLength,
4481 floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,
4482 offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,
4483 result = new ArrayBuffer(byteLength);
4484
4485 if (floatLength) {
4486 var view = new Float64Array(result, 0, floatLength);
4487 view.set(new Float64Array(buffer, 0, floatLength));
4488 }
4489 if (byteLength != offset) {
4490 view = new Uint8Array(result, offset);
4491 view.set(new Uint8Array(buffer, offset));
4492 }
4493 return result;
4494 };
4495 }
4496
4497 /**
4498 * Creates an array that is the composition of partially applied arguments,
4499 * placeholders, and provided arguments into a single array of arguments.
4500 *
4501 * @private
4502 * @param {Array|Object} args The provided arguments.
4503 * @param {Array} partials The arguments to prepend to those provided.
4504 * @param {Array} holders The `partials` placeholder indexes.
4505 * @returns {Array} Returns the new array of composed arguments.
4506 */
4507 function composeArgs(args, partials, holders) {
4508 var holdersLength = holders.length,
4509 argsIndex = -1,
4510 argsLength = nativeMax(args.length - holdersLength, 0),
4511 leftIndex = -1,
4512 leftLength = partials.length,
4513 result = Array(argsLength + leftLength);
4514
4515 while (++leftIndex < leftLength) {
4516 result[leftIndex] = partials[leftIndex];
4517 }
4518 while (++argsIndex < holdersLength) {
4519 result[holders[argsIndex]] = args[argsIndex];
4520 }
4521 while (argsLength--) {
4522 result[leftIndex++] = args[argsIndex++];
4523 }
4524 return result;
4525 }
4526
4527 /**
4528 * This function is like `composeArgs` except that the arguments composition
4529 * is tailored for `_.partialRight`.
4530 *
4531 * @private
4532 * @param {Array|Object} args The provided arguments.
4533 * @param {Array} partials The arguments to append to those provided.
4534 * @param {Array} holders The `partials` placeholder indexes.
4535 * @returns {Array} Returns the new array of composed arguments.
4536 */
4537 function composeArgsRight(args, partials, holders) {
4538 var holdersIndex = -1,
4539 holdersLength = holders.length,
4540 argsIndex = -1,
4541 argsLength = nativeMax(args.length - holdersLength, 0),
4542 rightIndex = -1,
4543 rightLength = partials.length,
4544 result = Array(argsLength + rightLength);
4545
4546 while (++argsIndex < argsLength) {
4547 result[argsIndex] = args[argsIndex];
4548 }
4549 var pad = argsIndex;
4550 while (++rightIndex < rightLength) {
4551 result[pad + rightIndex] = partials[rightIndex];
4552 }
4553 while (++holdersIndex < holdersLength) {
4554 result[pad + holders[holdersIndex]] = args[argsIndex++];
4555 }
4556 return result;
4557 }
4558
4559 /**
4560 * Creates a function that aggregates a collection, creating an accumulator
4561 * object composed from the results of running each element in the collection
4562 * through an iteratee.
4563 *
4564 * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,
4565 * and `_.partition`.
4566 *
4567 * @private
4568 * @param {Function} setter The function to set keys and values of the accumulator object.
4569 * @param {Function} [initializer] The function to initialize the accumulator object.
4570 * @returns {Function} Returns the new aggregator function.
4571 */
4572 function createAggregator(setter, initializer) {
4573 return function(collection, iteratee, thisArg) {
4574 var result = initializer ? initializer() : {};
4575 iteratee = getCallback(iteratee, thisArg, 3);
4576
4577 if (isArray(collection)) {
4578 var index = -1,
4579 length = collection.length;
4580
4581 while (++index < length) {
4582 var value = collection[index];
4583 setter(result, value, iteratee(value, index, collection), collection);
4584 }
4585 } else {
4586 baseEach(collection, function(value, key, collection) {
4587 setter(result, value, iteratee(value, key, collection), collection);
4588 });
4589 }
4590 return result;
4591 };
4592 }
4593
4594 /**
4595 * Creates a function that assigns properties of source object(s) to a given
4596 * destination object.
4597 *
4598 * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.
4599 *
4600 * @private
4601 * @param {Function} assigner The function to assign values.
4602 * @returns {Function} Returns the new assigner function.
4603 */
4604 function createAssigner(assigner) {
4605 return restParam(function(object, sources) {
4606 var index = -1,
4607 length = object == null ? 0 : sources.length,
4608 customizer = length > 2 && sources[length - 2],
4609 guard = length > 2 && sources[2],
4610 thisArg = length > 1 && sources[length - 1];
4611
4612 if (typeof customizer == 'function') {
4613 customizer = bindCallback(customizer, thisArg, 5);
4614 length -= 2;
4615 } else {
4616 customizer = typeof thisArg == 'function' ? thisArg : null;
4617 length -= (customizer ? 1 : 0);
4618 }
4619 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
4620 customizer = length < 3 ? null : customizer;
4621 length = 1;
4622 }
4623 while (++index < length) {
4624 var source = sources[index];
4625 if (source) {
4626 assigner(object, source, customizer);
4627 }
4628 }
4629 return object;
4630 });
4631 }
4632
4633 /**
4634 * Creates a `baseEach` or `baseEachRight` function.
4635 *
4636 * @private
4637 * @param {Function} eachFunc The function to iterate over a collection.
4638 * @param {boolean} [fromRight] Specify iterating from right to left.
4639 * @returns {Function} Returns the new base function.
4640 */
4641 function createBaseEach(eachFunc, fromRight) {
4642 return function(collection, iteratee) {
4643 var length = collection ? getLength(collection) : 0;
4644 if (!isLength(length)) {
4645 return eachFunc(collection, iteratee);
4646 }
4647 var index = fromRight ? length : -1,
4648 iterable = toObject(collection);
4649
4650 while ((fromRight ? index-- : ++index < length)) {
4651 if (iteratee(iterable[index], index, iterable) === false) {
4652 break;
4653 }
4654 }
4655 return collection;
4656 };
4657 }
4658
4659 /**
4660 * Creates a base function for `_.forIn` or `_.forInRight`.
4661 *
4662 * @private
4663 * @param {boolean} [fromRight] Specify iterating from right to left.
4664 * @returns {Function} Returns the new base function.
4665 */
4666 function createBaseFor(fromRight) {
4667 return function(object, iteratee, keysFunc) {
4668 var iterable = toObject(object),
4669 props = keysFunc(object),
4670 length = props.length,
4671 index = fromRight ? length : -1;
4672
4673 while ((fromRight ? index-- : ++index < length)) {
4674 var key = props[index];
4675 if (iteratee(iterable[key], key, iterable) === false) {
4676 break;
4677 }
4678 }
4679 return object;
4680 };
4681 }
4682
4683 /**
4684 * Creates a function that wraps `func` and invokes it with the `this`
4685 * binding of `thisArg`.
4686 *
4687 * @private
4688 * @param {Function} func The function to bind.
4689 * @param {*} [thisArg] The `this` binding of `func`.
4690 * @returns {Function} Returns the new bound function.
4691 */
4692 function createBindWrapper(func, thisArg) {
4693 var Ctor = createCtorWrapper(func);
4694
4695 function wrapper() {
4696 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
4697 return fn.apply(thisArg, arguments);
4698 }
4699 return wrapper;
4700 }
4701
4702 /**
4703 * Creates a `Set` cache object to optimize linear searches of large arrays.
4704 *
4705 * @private
4706 * @param {Array} [values] The values to cache.
4707 * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
4708 */
4709 var createCache = !(nativeCreate && Set) ? constant(null) : function(values) {
4710 return new SetCache(values);
4711 };
4712
4713 /**
4714 * Creates a function that produces compound words out of the words in a
4715 * given string.
4716 *
4717 * @private
4718 * @param {Function} callback The function to combine each word.
4719 * @returns {Function} Returns the new compounder function.
4720 */
4721 function createCompounder(callback) {
4722 return function(string) {
4723 var index = -1,
4724 array = words(deburr(string)),
4725 length = array.length,
4726 result = '';
4727
4728 while (++index < length) {
4729 result = callback(result, array[index], index);
4730 }
4731 return result;
4732 };
4733 }
4734
4735 /**
4736 * Creates a function that produces an instance of `Ctor` regardless of
4737 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
4738 *
4739 * @private
4740 * @param {Function} Ctor The constructor to wrap.
4741 * @returns {Function} Returns the new wrapped function.
4742 */
4743 function createCtorWrapper(Ctor) {
4744 return function() {
4745 var thisBinding = baseCreate(Ctor.prototype),
4746 result = Ctor.apply(thisBinding, arguments);
4747
4748 // Mimic the constructor's `return` behavior.
4749 // See https://es5.github.io/#x13.2.2 for more details.
4750 return isObject(result) ? result : thisBinding;
4751 };
4752 }
4753
4754 /**
4755 * Creates a `_.curry` or `_.curryRight` function.
4756 *
4757 * @private
4758 * @param {boolean} flag The curry bit flag.
4759 * @returns {Function} Returns the new curry function.
4760 */
4761 function createCurry(flag) {
4762 function curryFunc(func, arity, guard) {
4763 if (guard && isIterateeCall(func, arity, guard)) {
4764 arity = null;
4765 }
4766 var result = createWrapper(func, flag, null, null, null, null, null, arity);
4767 result.placeholder = curryFunc.placeholder;
4768 return result;
4769 }
4770 return curryFunc;
4771 }
4772
4773 /**
4774 * Creates a `_.max` or `_.min` function.
4775 *
4776 * @private
4777 * @param {Function} arrayFunc The function to get the extremum value from an array.
4778 * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,
4779 * extremum value.
4780 * @returns {Function} Returns the new extremum function.
4781 */
4782 function createExtremum(arrayFunc, isMin) {
4783 return function(collection, iteratee, thisArg) {
4784 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
4785 iteratee = null;
4786 }
4787 var func = getCallback(),
4788 noIteratee = iteratee == null;
4789
4790 if (!(func === baseCallback && noIteratee)) {
4791 noIteratee = false;
4792 iteratee = func(iteratee, thisArg, 3);
4793 }
4794 if (noIteratee) {
4795 var isArr = isArray(collection);
4796 if (!isArr && isString(collection)) {
4797 iteratee = charAtCallback;
4798 } else {
4799 return arrayFunc(isArr ? collection : toIterable(collection));
4800 }
4801 }
4802 return extremumBy(collection, iteratee, isMin);
4803 };
4804 }
4805
4806 /**
4807 * Creates a `_.find` or `_.findLast` function.
4808 *
4809 * @private
4810 * @param {Function} eachFunc The function to iterate over a collection.
4811 * @param {boolean} [fromRight] Specify iterating from right to left.
4812 * @returns {Function} Returns the new find function.
4813 */
4814 function createFind(eachFunc, fromRight) {
4815 return function(collection, predicate, thisArg) {
4816 predicate = getCallback(predicate, thisArg, 3);
4817 if (isArray(collection)) {
4818 var index = baseFindIndex(collection, predicate, fromRight);
4819 return index > -1 ? collection[index] : undefined;
4820 }
4821 return baseFind(collection, predicate, eachFunc);
4822 }
4823 }
4824
4825 /**
4826 * Creates a `_.findIndex` or `_.findLastIndex` function.
4827 *
4828 * @private
4829 * @param {boolean} [fromRight] Specify iterating from right to left.
4830 * @returns {Function} Returns the new find function.
4831 */
4832 function createFindIndex(fromRight) {
4833 return function(array, predicate, thisArg) {
4834 if (!(array && array.length)) {
4835 return -1;
4836 }
4837 predicate = getCallback(predicate, thisArg, 3);
4838 return baseFindIndex(array, predicate, fromRight);
4839 };
4840 }
4841
4842 /**
4843 * Creates a `_.findKey` or `_.findLastKey` function.
4844 *
4845 * @private
4846 * @param {Function} objectFunc The function to iterate over an object.
4847 * @returns {Function} Returns the new find function.
4848 */
4849 function createFindKey(objectFunc) {
4850 return function(object, predicate, thisArg) {
4851 predicate = getCallback(predicate, thisArg, 3);
4852 return baseFind(object, predicate, objectFunc, true);
4853 };
4854 }
4855
4856 /**
4857 * Creates a `_.flow` or `_.flowRight` function.
4858 *
4859 * @private
4860 * @param {boolean} [fromRight] Specify iterating from right to left.
4861 * @returns {Function} Returns the new flow function.
4862 */
4863 function createFlow(fromRight) {
4864 return function() {
4865 var length = arguments.length;
4866 if (!length) {
4867 return function() { return arguments[0]; };
4868 }
4869 var wrapper,
4870 index = fromRight ? length : -1,
4871 leftIndex = 0,
4872 funcs = Array(length);
4873
4874 while ((fromRight ? index-- : ++index < length)) {
4875 var func = funcs[leftIndex++] = arguments[index];
4876 if (typeof func != 'function') {
4877 throw new TypeError(FUNC_ERROR_TEXT);
4878 }
4879 var funcName = wrapper ? '' : getFuncName(func);
4880 wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;
4881 }
4882 index = wrapper ? -1 : length;
4883 while (++index < length) {
4884 func = funcs[index];
4885 funcName = getFuncName(func);
4886
4887 var data = funcName == 'wrapper' ? getData(func) : null;
4888 if (data && isLaziable(data[0])) {
4889 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
4890 } else {
4891 wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
4892 }
4893 }
4894 return function() {
4895 var args = arguments;
4896 if (wrapper && args.length == 1 && isArray(args[0])) {
4897 return wrapper.plant(args[0]).value();
4898 }
4899 var index = 0,
4900 result = funcs[index].apply(this, args);
4901
4902 while (++index < length) {
4903 result = funcs[index].call(this, result);
4904 }
4905 return result;
4906 };
4907 };
4908 }
4909
4910 /**
4911 * Creates a function for `_.forEach` or `_.forEachRight`.
4912 *
4913 * @private
4914 * @param {Function} arrayFunc The function to iterate over an array.
4915 * @param {Function} eachFunc The function to iterate over a collection.
4916 * @returns {Function} Returns the new each function.
4917 */
4918 function createForEach(arrayFunc, eachFunc) {
4919 return function(collection, iteratee, thisArg) {
4920 return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
4921 ? arrayFunc(collection, iteratee)
4922 : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
4923 };
4924 }
4925
4926 /**
4927 * Creates a function for `_.forIn` or `_.forInRight`.
4928 *
4929 * @private
4930 * @param {Function} objectFunc The function to iterate over an object.
4931 * @returns {Function} Returns the new each function.
4932 */
4933 function createForIn(objectFunc) {
4934 return function(object, iteratee, thisArg) {
4935 if (typeof iteratee != 'function' || thisArg !== undefined) {
4936 iteratee = bindCallback(iteratee, thisArg, 3);
4937 }
4938 return objectFunc(object, iteratee, keysIn);
4939 };
4940 }
4941
4942 /**
4943 * Creates a function for `_.forOwn` or `_.forOwnRight`.
4944 *
4945 * @private
4946 * @param {Function} objectFunc The function to iterate over an object.
4947 * @returns {Function} Returns the new each function.
4948 */
4949 function createForOwn(objectFunc) {
4950 return function(object, iteratee, thisArg) {
4951 if (typeof iteratee != 'function' || thisArg !== undefined) {
4952 iteratee = bindCallback(iteratee, thisArg, 3);
4953 }
4954 return objectFunc(object, iteratee);
4955 };
4956 }
4957
4958 /**
4959 * Creates a function for `_.padLeft` or `_.padRight`.
4960 *
4961 * @private
4962 * @param {boolean} [fromRight] Specify padding from the right.
4963 * @returns {Function} Returns the new pad function.
4964 */
4965 function createPadDir(fromRight) {
4966 return function(string, length, chars) {
4967 string = baseToString(string);
4968 return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));
4969 };
4970 }
4971
4972 /**
4973 * Creates a `_.partial` or `_.partialRight` function.
4974 *
4975 * @private
4976 * @param {boolean} flag The partial bit flag.
4977 * @returns {Function} Returns the new partial function.
4978 */
4979 function createPartial(flag) {
4980 var partialFunc = restParam(function(func, partials) {
4981 var holders = replaceHolders(partials, partialFunc.placeholder);
4982 return createWrapper(func, flag, null, partials, holders);
4983 });
4984 return partialFunc;
4985 }
4986
4987 /**
4988 * Creates a function for `_.reduce` or `_.reduceRight`.
4989 *
4990 * @private
4991 * @param {Function} arrayFunc The function to iterate over an array.
4992 * @param {Function} eachFunc The function to iterate over a collection.
4993 * @returns {Function} Returns the new each function.
4994 */
4995 function createReduce(arrayFunc, eachFunc) {
4996 return function(collection, iteratee, accumulator, thisArg) {
4997 var initFromArray = arguments.length < 3;
4998 return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
4999 ? arrayFunc(collection, iteratee, accumulator, initFromArray)
5000 : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
5001 };
5002 }
5003
5004 /**
5005 * Creates a function that wraps `func` and invokes it with optional `this`
5006 * binding of, partial application, and currying.
5007 *
5008 * @private
5009 * @param {Function|string} func The function or method name to reference.
5010 * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
5011 * @param {*} [thisArg] The `this` binding of `func`.
5012 * @param {Array} [partials] The arguments to prepend to those provided to the new function.
5013 * @param {Array} [holders] The `partials` placeholder indexes.
5014 * @param {Array} [partialsRight] The arguments to append to those provided to the new function.
5015 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
5016 * @param {Array} [argPos] The argument positions of the new function.
5017 * @param {number} [ary] The arity cap of `func`.
5018 * @param {number} [arity] The arity of `func`.
5019 * @returns {Function} Returns the new wrapped function.
5020 */
5021 function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
5022 var isAry = bitmask & ARY_FLAG,
5023 isBind = bitmask & BIND_FLAG,
5024 isBindKey = bitmask & BIND_KEY_FLAG,
5025 isCurry = bitmask & CURRY_FLAG,
5026 isCurryBound = bitmask & CURRY_BOUND_FLAG,
5027 isCurryRight = bitmask & CURRY_RIGHT_FLAG;
5028
5029 var Ctor = !isBindKey && createCtorWrapper(func),
5030 key = func;
5031
5032 function wrapper() {
5033 // Avoid `arguments` object use disqualifying optimizations by
5034 // converting it to an array before providing it to other functions.
5035 var length = arguments.length,
5036 index = length,
5037 args = Array(length);
5038
5039 while (index--) {
5040 args[index] = arguments[index];
5041 }
5042 if (partials) {
5043 args = composeArgs(args, partials, holders);
5044 }
5045 if (partialsRight) {
5046 args = composeArgsRight(args, partialsRight, holdersRight);
5047 }
5048 if (isCurry || isCurryRight) {
5049 var placeholder = wrapper.placeholder,
5050 argsHolders = replaceHolders(args, placeholder);
5051
5052 length -= argsHolders.length;
5053 if (length < arity) {
5054 var newArgPos = argPos ? arrayCopy(argPos) : null,
5055 newArity = nativeMax(arity - length, 0),
5056 newsHolders = isCurry ? argsHolders : null,
5057 newHoldersRight = isCurry ? null : argsHolders,
5058 newPartials = isCurry ? args : null,
5059 newPartialsRight = isCurry ? null : args;
5060
5061 bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
5062 bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
5063
5064 if (!isCurryBound) {
5065 bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
5066 }
5067 var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
5068 result = createHybridWrapper.apply(undefined, newData);
5069
5070 if (isLaziable(func)) {
5071 setData(result, newData);
5072 }
5073 result.placeholder = placeholder;
5074 return result;
5075 }
5076 }
5077 var thisBinding = isBind ? thisArg : this;
5078 if (isBindKey) {
5079 func = thisBinding[key];
5080 }
5081 if (argPos) {
5082 args = reorder(args, argPos);
5083 }
5084 if (isAry && ary < args.length) {
5085 args.length = ary;
5086 }
5087 var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func;
5088 return fn.apply(thisBinding, args);
5089 }
5090 return wrapper;
5091 }
5092
5093 /**
5094 * Creates the padding required for `string` based on the given `length`.
5095 * The `chars` string is truncated if the number of characters exceeds `length`.
5096 *
5097 * @private
5098 * @param {string} string The string to create padding for.
5099 * @param {number} [length=0] The padding length.
5100 * @param {string} [chars=' '] The string used as padding.
5101 * @returns {string} Returns the pad for `string`.
5102 */
5103 function createPadding(string, length, chars) {
5104 var strLength = string.length;
5105 length = +length;
5106
5107 if (strLength >= length || !nativeIsFinite(length)) {
5108 return '';
5109 }
5110 var padLength = length - strLength;
5111 chars = chars == null ? ' ' : (chars + '');
5112 return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);
5113 }
5114
5115 /**
5116 * Creates a function that wraps `func` and invokes it with the optional `this`
5117 * binding of `thisArg` and the `partials` prepended to those provided to
5118 * the wrapper.
5119 *
5120 * @private
5121 * @param {Function} func The function to partially apply arguments to.
5122 * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
5123 * @param {*} thisArg The `this` binding of `func`.
5124 * @param {Array} partials The arguments to prepend to those provided to the new function.
5125 * @returns {Function} Returns the new bound function.
5126 */
5127 function createPartialWrapper(func, bitmask, thisArg, partials) {
5128 var isBind = bitmask & BIND_FLAG,
5129 Ctor = createCtorWrapper(func);
5130
5131 function wrapper() {
5132 // Avoid `arguments` object use disqualifying optimizations by
5133 // converting it to an array before providing it `func`.
5134 var argsIndex = -1,
5135 argsLength = arguments.length,
5136 leftIndex = -1,
5137 leftLength = partials.length,
5138 args = Array(argsLength + leftLength);
5139
5140 while (++leftIndex < leftLength) {
5141 args[leftIndex] = partials[leftIndex];
5142 }
5143 while (argsLength--) {
5144 args[leftIndex++] = arguments[++argsIndex];
5145 }
5146 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5147 return fn.apply(isBind ? thisArg : this, args);
5148 }
5149 return wrapper;
5150 }
5151
5152 /**
5153 * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
5154 *
5155 * @private
5156 * @param {boolean} [retHighest] Specify returning the highest qualified index.
5157 * @returns {Function} Returns the new index function.
5158 */
5159 function createSortedIndex(retHighest) {
5160 return function(array, value, iteratee, thisArg) {
5161 var func = getCallback(iteratee);
5162 return (func === baseCallback && iteratee == null)
5163 ? binaryIndex(array, value, retHighest)
5164 : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);
5165 };
5166 }
5167
5168 /**
5169 * Creates a function that either curries or invokes `func` with optional
5170 * `this` binding and partially applied arguments.
5171 *
5172 * @private
5173 * @param {Function|string} func The function or method name to reference.
5174 * @param {number} bitmask The bitmask of flags.
5175 * The bitmask may be composed of the following flags:
5176 * 1 - `_.bind`
5177 * 2 - `_.bindKey`
5178 * 4 - `_.curry` or `_.curryRight` of a bound function
5179 * 8 - `_.curry`
5180 * 16 - `_.curryRight`
5181 * 32 - `_.partial`
5182 * 64 - `_.partialRight`
5183 * 128 - `_.rearg`
5184 * 256 - `_.ary`
5185 * @param {*} [thisArg] The `this` binding of `func`.
5186 * @param {Array} [partials] The arguments to be partially applied.
5187 * @param {Array} [holders] The `partials` placeholder indexes.
5188 * @param {Array} [argPos] The argument positions of the new function.
5189 * @param {number} [ary] The arity cap of `func`.
5190 * @param {number} [arity] The arity of `func`.
5191 * @returns {Function} Returns the new wrapped function.
5192 */
5193 function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
5194 var isBindKey = bitmask & BIND_KEY_FLAG;
5195 if (!isBindKey && typeof func != 'function') {
5196 throw new TypeError(FUNC_ERROR_TEXT);
5197 }
5198 var length = partials ? partials.length : 0;
5199 if (!length) {
5200 bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
5201 partials = holders = null;
5202 }
5203 length -= (holders ? holders.length : 0);
5204 if (bitmask & PARTIAL_RIGHT_FLAG) {
5205 var partialsRight = partials,
5206 holdersRight = holders;
5207
5208 partials = holders = null;
5209 }
5210 var data = isBindKey ? null : getData(func),
5211 newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
5212
5213 if (data) {
5214 mergeData(newData, data);
5215 bitmask = newData[1];
5216 arity = newData[9];
5217 }
5218 newData[9] = arity == null
5219 ? (isBindKey ? 0 : func.length)
5220 : (nativeMax(arity - length, 0) || 0);
5221
5222 if (bitmask == BIND_FLAG) {
5223 var result = createBindWrapper(newData[0], newData[2]);
5224 } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
5225 result = createPartialWrapper.apply(undefined, newData);
5226 } else {
5227 result = createHybridWrapper.apply(undefined, newData);
5228 }
5229 var setter = data ? baseSetData : setData;
5230 return setter(result, newData);
5231 }
5232
5233 /**
5234 * A specialized version of `baseIsEqualDeep` for arrays with support for
5235 * partial deep comparisons.
5236 *
5237 * @private
5238 * @param {Array} array The array to compare.
5239 * @param {Array} other The other array to compare.
5240 * @param {Function} equalFunc The function to determine equivalents of values.
5241 * @param {Function} [customizer] The function to customize comparing arrays.
5242 * @param {boolean} [isLoose] Specify performing partial comparisons.
5243 * @param {Array} [stackA] Tracks traversed `value` objects.
5244 * @param {Array} [stackB] Tracks traversed `other` objects.
5245 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5246 */
5247 function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
5248 var index = -1,
5249 arrLength = array.length,
5250 othLength = other.length,
5251 result = true;
5252
5253 if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
5254 return false;
5255 }
5256 // Deep compare the contents, ignoring non-numeric properties.
5257 while (result && ++index < arrLength) {
5258 var arrValue = array[index],
5259 othValue = other[index];
5260
5261 result = undefined;
5262 if (customizer) {
5263 result = isLoose
5264 ? customizer(othValue, arrValue, index)
5265 : customizer(arrValue, othValue, index);
5266 }
5267 if (result === undefined) {
5268 // Recursively compare arrays (susceptible to call stack limits).
5269 if (isLoose) {
5270 var othIndex = othLength;
5271 while (othIndex--) {
5272 othValue = other[othIndex];
5273 result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
5274 if (result) {
5275 break;
5276 }
5277 }
5278 } else {
5279 result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
5280 }
5281 }
5282 }
5283 return !!result;
5284 }
5285
5286 /**
5287 * A specialized version of `baseIsEqualDeep` for comparing objects of
5288 * the same `toStringTag`.
5289 *
5290 * **Note:** This function only supports comparing values with tags of
5291 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5292 *
5293 * @private
5294 * @param {Object} value The object to compare.
5295 * @param {Object} other The other object to compare.
5296 * @param {string} tag The `toStringTag` of the objects to compare.
5297 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5298 */
5299 function equalByTag(object, other, tag) {
5300 switch (tag) {
5301 case boolTag:
5302 case dateTag:
5303 // Coerce dates and booleans to numbers, dates to milliseconds and booleans
5304 // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
5305 return +object == +other;
5306
5307 case errorTag:
5308 return object.name == other.name && object.message == other.message;
5309
5310 case numberTag:
5311 // Treat `NaN` vs. `NaN` as equal.
5312 return (object != +object)
5313 ? other != +other
5314 // But, treat `-0` vs. `+0` as not equal.
5315 : (object == 0 ? ((1 / object) == (1 / other)) : object == +other);
5316
5317 case regexpTag:
5318 case stringTag:
5319 // Coerce regexes to strings and treat strings primitives and string
5320 // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
5321 return object == (other + '');
5322 }
5323 return false;
5324 }
5325
5326 /**
5327 * A specialized version of `baseIsEqualDeep` for objects with support for
5328 * partial deep comparisons.
5329 *
5330 * @private
5331 * @param {Object} object The object to compare.
5332 * @param {Object} other The other object to compare.
5333 * @param {Function} equalFunc The function to determine equivalents of values.
5334 * @param {Function} [customizer] The function to customize comparing values.
5335 * @param {boolean} [isLoose] Specify performing partial comparisons.
5336 * @param {Array} [stackA] Tracks traversed `value` objects.
5337 * @param {Array} [stackB] Tracks traversed `other` objects.
5338 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5339 */
5340 function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
5341 var objProps = keys(object),
5342 objLength = objProps.length,
5343 othProps = keys(other),
5344 othLength = othProps.length;
5345
5346 if (objLength != othLength && !isLoose) {
5347 return false;
5348 }
5349 var skipCtor = isLoose,
5350 index = -1;
5351
5352 while (++index < objLength) {
5353 var key = objProps[index],
5354 result = isLoose ? key in other : hasOwnProperty.call(other, key);
5355
5356 if (result) {
5357 var objValue = object[key],
5358 othValue = other[key];
5359
5360 result = undefined;
5361 if (customizer) {
5362 result = isLoose
5363 ? customizer(othValue, objValue, key)
5364 : customizer(objValue, othValue, key);
5365 }
5366 if (result === undefined) {
5367 // Recursively compare objects (susceptible to call stack limits).
5368 result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
5369 }
5370 }
5371 if (!result) {
5372 return false;
5373 }
5374 skipCtor || (skipCtor = key == 'constructor');
5375 }
5376 if (!skipCtor) {
5377 var objCtor = object.constructor,
5378 othCtor = other.constructor;
5379
5380 // Non `Object` object instances with different constructors are not equal.
5381 if (objCtor != othCtor &&
5382 ('constructor' in object && 'constructor' in other) &&
5383 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
5384 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
5385 return false;
5386 }
5387 }
5388 return true;
5389 }
5390
5391 /**
5392 * Gets the extremum value of `collection` invoking `iteratee` for each value
5393 * in `collection` to generate the criterion by which the value is ranked.
5394 * The `iteratee` is invoked with three arguments: (value, index, collection).
5395 *
5396 * @private
5397 * @param {Array|Object|string} collection The collection to iterate over.
5398 * @param {Function} iteratee The function invoked per iteration.
5399 * @param {boolean} [isMin] Specify returning the minimum, instead of the
5400 * maximum, extremum value.
5401 * @returns {*} Returns the extremum value.
5402 */
5403 function extremumBy(collection, iteratee, isMin) {
5404 var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,
5405 computed = exValue,
5406 result = computed;
5407
5408 baseEach(collection, function(value, index, collection) {
5409 var current = iteratee(value, index, collection);
5410 if ((isMin ? (current < computed) : (current > computed)) ||
5411 (current === exValue && current === result)) {
5412 computed = current;
5413 result = value;
5414 }
5415 });
5416 return result;
5417 }
5418
5419 /**
5420 * Gets the appropriate "callback" function. If the `_.callback` method is
5421 * customized this function returns the custom method, otherwise it returns
5422 * the `baseCallback` function. If arguments are provided the chosen function
5423 * is invoked with them and its result is returned.
5424 *
5425 * @private
5426 * @returns {Function} Returns the chosen function or its result.
5427 */
5428 function getCallback(func, thisArg, argCount) {
5429 var result = lodash.callback || callback;
5430 result = result === callback ? baseCallback : result;
5431 return argCount ? result(func, thisArg, argCount) : result;
5432 }
5433
5434 /**
5435 * Gets metadata for `func`.
5436 *
5437 * @private
5438 * @param {Function} func The function to query.
5439 * @returns {*} Returns the metadata for `func`.
5440 */
5441 var getData = !metaMap ? noop : function(func) {
5442 return metaMap.get(func);
5443 };
5444
5445 /**
5446 * Gets the name of `func`.
5447 *
5448 * @private
5449 * @param {Function} func The function to query.
5450 * @returns {string} Returns the function name.
5451 */
5452 var getFuncName = (function() {
5453 if (!support.funcNames) {
5454 return constant('');
5455 }
5456 if (constant.name == 'constant') {
5457 return baseProperty('name');
5458 }
5459 return function(func) {
5460 var result = func.name,
5461 array = realNames[result],
5462 length = array ? array.length : 0;
5463
5464 while (length--) {
5465 var data = array[length],
5466 otherFunc = data.func;
5467
5468 if (otherFunc == null || otherFunc == func) {
5469 return data.name;
5470 }
5471 }
5472 return result;
5473 };
5474 }());
5475
5476 /**
5477 * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
5478 * customized this function returns the custom method, otherwise it returns
5479 * the `baseIndexOf` function. If arguments are provided the chosen function
5480 * is invoked with them and its result is returned.
5481 *
5482 * @private
5483 * @returns {Function|number} Returns the chosen function or its result.
5484 */
5485 function getIndexOf(collection, target, fromIndex) {
5486 var result = lodash.indexOf || indexOf;
5487 result = result === indexOf ? baseIndexOf : result;
5488 return collection ? result(collection, target, fromIndex) : result;
5489 }
5490
5491 /**
5492 * Gets the "length" property value of `object`.
5493 *
5494 * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
5495 * in Safari on iOS 8.1 ARM64.
5496 *
5497 * @private
5498 * @param {Object} object The object to query.
5499 * @returns {*} Returns the "length" value.
5500 */
5501 var getLength = baseProperty('length');
5502
5503 /**
5504 * Creates an array of the own symbols of `object`.
5505 *
5506 * @private
5507 * @param {Object} object The object to query.
5508 * @returns {Array} Returns the array of symbols.
5509 */
5510 var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) {
5511 return getOwnPropertySymbols(toObject(object));
5512 };
5513
5514 /**
5515 * Gets the view, applying any `transforms` to the `start` and `end` positions.
5516 *
5517 * @private
5518 * @param {number} start The start of the view.
5519 * @param {number} end The end of the view.
5520 * @param {Array} [transforms] The transformations to apply to the view.
5521 * @returns {Object} Returns an object containing the `start` and `end`
5522 * positions of the view.
5523 */
5524 function getView(start, end, transforms) {
5525 var index = -1,
5526 length = transforms ? transforms.length : 0;
5527
5528 while (++index < length) {
5529 var data = transforms[index],
5530 size = data.size;
5531
5532 switch (data.type) {
5533 case 'drop': start += size; break;
5534 case 'dropRight': end -= size; break;
5535 case 'take': end = nativeMin(end, start + size); break;
5536 case 'takeRight': start = nativeMax(start, end - size); break;
5537 }
5538 }
5539 return { 'start': start, 'end': end };
5540 }
5541
5542 /**
5543 * Initializes an array clone.
5544 *
5545 * @private
5546 * @param {Array} array The array to clone.
5547 * @returns {Array} Returns the initialized clone.
5548 */
5549 function initCloneArray(array) {
5550 var length = array.length,
5551 result = new array.constructor(length);
5552
5553 // Add array properties assigned by `RegExp#exec`.
5554 if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
5555 result.index = array.index;
5556 result.input = array.input;
5557 }
5558 return result;
5559 }
5560
5561 /**
5562 * Initializes an object clone.
5563 *
5564 * @private
5565 * @param {Object} object The object to clone.
5566 * @returns {Object} Returns the initialized clone.
5567 */
5568 function initCloneObject(object) {
5569 var Ctor = object.constructor;
5570 if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
5571 Ctor = Object;
5572 }
5573 return new Ctor;
5574 }
5575
5576 /**
5577 * Initializes an object clone based on its `toStringTag`.
5578 *
5579 * **Note:** This function only supports cloning values with tags of
5580 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5581 *
5582 * @private
5583 * @param {Object} object The object to clone.
5584 * @param {string} tag The `toStringTag` of the object to clone.
5585 * @param {boolean} [isDeep] Specify a deep clone.
5586 * @returns {Object} Returns the initialized clone.
5587 */
5588 function initCloneByTag(object, tag, isDeep) {
5589 var Ctor = object.constructor;
5590 switch (tag) {
5591 case arrayBufferTag:
5592 return bufferClone(object);
5593
5594 case boolTag:
5595 case dateTag:
5596 return new Ctor(+object);
5597
5598 case float32Tag: case float64Tag:
5599 case int8Tag: case int16Tag: case int32Tag:
5600 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
5601 var buffer = object.buffer;
5602 return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
5603
5604 case numberTag:
5605 case stringTag:
5606 return new Ctor(object);
5607
5608 case regexpTag:
5609 var result = new Ctor(object.source, reFlags.exec(object));
5610 result.lastIndex = object.lastIndex;
5611 }
5612 return result;
5613 }
5614
5615 /**
5616 * Invokes the method at `path` on `object`.
5617 *
5618 * @private
5619 * @param {Object} object The object to query.
5620 * @param {Array|string} path The path of the method to invoke.
5621 * @param {Array} args The arguments to invoke the method with.
5622 * @returns {*} Returns the result of the invoked method.
5623 */
5624 function invokePath(object, path, args) {
5625 if (object != null && !isKey(path, object)) {
5626 path = toPath(path);
5627 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
5628 path = last(path);
5629 }
5630 var func = object == null ? object : object[path];
5631 return func == null ? undefined : func.apply(object, args);
5632 }
5633
5634 /**
5635 * Checks if `value` is a valid array-like index.
5636 *
5637 * @private
5638 * @param {*} value The value to check.
5639 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
5640 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
5641 */
5642 function isIndex(value, length) {
5643 value = +value;
5644 length = length == null ? MAX_SAFE_INTEGER : length;
5645 return value > -1 && value % 1 == 0 && value < length;
5646 }
5647
5648 /**
5649 * Checks if the provided arguments are from an iteratee call.
5650 *
5651 * @private
5652 * @param {*} value The potential iteratee value argument.
5653 * @param {*} index The potential iteratee index or key argument.
5654 * @param {*} object The potential iteratee object argument.
5655 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
5656 */
5657 function isIterateeCall(value, index, object) {
5658 if (!isObject(object)) {
5659 return false;
5660 }
5661 var type = typeof index;
5662 if (type == 'number') {
5663 var length = getLength(object),
5664 prereq = isLength(length) && isIndex(index, length);
5665 } else {
5666 prereq = type == 'string' && index in object;
5667 }
5668 if (prereq) {
5669 var other = object[index];
5670 return value === value ? (value === other) : (other !== other);
5671 }
5672 return false;
5673 }
5674
5675 /**
5676 * Checks if `value` is a property name and not a property path.
5677 *
5678 * @private
5679 * @param {*} value The value to check.
5680 * @param {Object} [object] The object to query keys on.
5681 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
5682 */
5683 function isKey(value, object) {
5684 var type = typeof value;
5685 if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
5686 return true;
5687 }
5688 if (isArray(value)) {
5689 return false;
5690 }
5691 var result = !reIsDeepProp.test(value);
5692 return result || (object != null && value in toObject(object));
5693 }
5694
5695 /**
5696 * Checks if `func` has a lazy counterpart.
5697 *
5698 * @private
5699 * @param {Function} func The function to check.
5700 * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
5701 */
5702 function isLaziable(func) {
5703 var funcName = getFuncName(func);
5704 return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;
5705 }
5706
5707 /**
5708 * Checks if `value` is a valid array-like length.
5709 *
5710 * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
5711 *
5712 * @private
5713 * @param {*} value The value to check.
5714 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
5715 */
5716 function isLength(value) {
5717 return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
5718 }
5719
5720 /**
5721 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
5722 *
5723 * @private
5724 * @param {*} value The value to check.
5725 * @returns {boolean} Returns `true` if `value` if suitable for strict
5726 * equality comparisons, else `false`.
5727 */
5728 function isStrictComparable(value) {
5729 return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));
5730 }
5731
5732 /**
5733 * Merges the function metadata of `source` into `data`.
5734 *
5735 * Merging metadata reduces the number of wrappers required to invoke a function.
5736 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
5737 * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
5738 * augment function arguments, making the order in which they are executed important,
5739 * preventing the merging of metadata. However, we make an exception for a safe
5740 * common case where curried functions have `_.ary` and or `_.rearg` applied.
5741 *
5742 * @private
5743 * @param {Array} data The destination metadata.
5744 * @param {Array} source The source metadata.
5745 * @returns {Array} Returns `data`.
5746 */
5747 function mergeData(data, source) {
5748 var bitmask = data[1],
5749 srcBitmask = source[1],
5750 newBitmask = bitmask | srcBitmask,
5751 isCommon = newBitmask < ARY_FLAG;
5752
5753 var isCombo =
5754 (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
5755 (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
5756 (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
5757
5758 // Exit early if metadata can't be merged.
5759 if (!(isCommon || isCombo)) {
5760 return data;
5761 }
5762 // Use source `thisArg` if available.
5763 if (srcBitmask & BIND_FLAG) {
5764 data[2] = source[2];
5765 // Set when currying a bound function.
5766 newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
5767 }
5768 // Compose partial arguments.
5769 var value = source[3];
5770 if (value) {
5771 var partials = data[3];
5772 data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);
5773 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);
5774 }
5775 // Compose partial right arguments.
5776 value = source[5];
5777 if (value) {
5778 partials = data[5];
5779 data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);
5780 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);
5781 }
5782 // Use source `argPos` if available.
5783 value = source[7];
5784 if (value) {
5785 data[7] = arrayCopy(value);
5786 }
5787 // Use source `ary` if it's smaller.
5788 if (srcBitmask & ARY_FLAG) {
5789 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
5790 }
5791 // Use source `arity` if one is not provided.
5792 if (data[9] == null) {
5793 data[9] = source[9];
5794 }
5795 // Use source `func` and merge bitmasks.
5796 data[0] = source[0];
5797 data[1] = newBitmask;
5798
5799 return data;
5800 }
5801
5802 /**
5803 * A specialized version of `_.pick` that picks `object` properties specified
5804 * by `props`.
5805 *
5806 * @private
5807 * @param {Object} object The source object.
5808 * @param {string[]} props The property names to pick.
5809 * @returns {Object} Returns the new object.
5810 */
5811 function pickByArray(object, props) {
5812 object = toObject(object);
5813
5814 var index = -1,
5815 length = props.length,
5816 result = {};
5817
5818 while (++index < length) {
5819 var key = props[index];
5820 if (key in object) {
5821 result[key] = object[key];
5822 }
5823 }
5824 return result;
5825 }
5826
5827 /**
5828 * A specialized version of `_.pick` that picks `object` properties `predicate`
5829 * returns truthy for.
5830 *
5831 * @private
5832 * @param {Object} object The source object.
5833 * @param {Function} predicate The function invoked per iteration.
5834 * @returns {Object} Returns the new object.
5835 */
5836 function pickByCallback(object, predicate) {
5837 var result = {};
5838 baseForIn(object, function(value, key, object) {
5839 if (predicate(value, key, object)) {
5840 result[key] = value;
5841 }
5842 });
5843 return result;
5844 }
5845
5846 /**
5847 * Reorder `array` according to the specified indexes where the element at
5848 * the first index is assigned as the first element, the element at
5849 * the second index is assigned as the second element, and so on.
5850 *
5851 * @private
5852 * @param {Array} array The array to reorder.
5853 * @param {Array} indexes The arranged array indexes.
5854 * @returns {Array} Returns `array`.
5855 */
5856 function reorder(array, indexes) {
5857 var arrLength = array.length,
5858 length = nativeMin(indexes.length, arrLength),
5859 oldArray = arrayCopy(array);
5860
5861 while (length--) {
5862 var index = indexes[length];
5863 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
5864 }
5865 return array;
5866 }
5867
5868 /**
5869 * Sets metadata for `func`.
5870 *
5871 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
5872 * period of time, it will trip its breaker and transition to an identity function
5873 * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)
5874 * for more details.
5875 *
5876 * @private
5877 * @param {Function} func The function to associate metadata with.
5878 * @param {*} data The metadata.
5879 * @returns {Function} Returns `func`.
5880 */
5881 var setData = (function() {
5882 var count = 0,
5883 lastCalled = 0;
5884
5885 return function(key, value) {
5886 var stamp = now(),
5887 remaining = HOT_SPAN - (stamp - lastCalled);
5888
5889 lastCalled = stamp;
5890 if (remaining > 0) {
5891 if (++count >= HOT_COUNT) {
5892 return key;
5893 }
5894 } else {
5895 count = 0;
5896 }
5897 return baseSetData(key, value);
5898 };
5899 }());
5900
5901 /**
5902 * A fallback implementation of `_.isPlainObject` which checks if `value`
5903 * is an object created by the `Object` constructor or has a `[[Prototype]]`
5904 * of `null`.
5905 *
5906 * @private
5907 * @param {*} value The value to check.
5908 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
5909 */
5910 function shimIsPlainObject(value) {
5911 var Ctor,
5912 support = lodash.support;
5913
5914 // Exit early for non `Object` objects.
5915 if (!(isObjectLike(value) && objToString.call(value) == objectTag) ||
5916 (!hasOwnProperty.call(value, 'constructor') &&
5917 (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
5918 return false;
5919 }
5920 // IE < 9 iterates inherited properties before own properties. If the first
5921 // iterated property is an object's own property then there are no inherited
5922 // enumerable properties.
5923 var result;
5924 // In most environments an object's own properties are iterated before
5925 // its inherited properties. If the last iterated property is an object's
5926 // own property then there are no inherited enumerable properties.
5927 baseForIn(value, function(subValue, key) {
5928 result = key;
5929 });
5930 return result === undefined || hasOwnProperty.call(value, result);
5931 }
5932
5933 /**
5934 * A fallback implementation of `Object.keys` which creates an array of the
5935 * own enumerable property names of `object`.
5936 *
5937 * @private
5938 * @param {Object} object The object to query.
5939 * @returns {Array} Returns the array of property names.
5940 */
5941 function shimKeys(object) {
5942 var props = keysIn(object),
5943 propsLength = props.length,
5944 length = propsLength && object.length,
5945 support = lodash.support;
5946
5947 var allowIndexes = length && isLength(length) &&
5948 (isArray(object) || (support.nonEnumArgs && isArguments(object)));
5949
5950 var index = -1,
5951 result = [];
5952
5953 while (++index < propsLength) {
5954 var key = props[index];
5955 if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
5956 result.push(key);
5957 }
5958 }
5959 return result;
5960 }
5961
5962 /**
5963 * Converts `value` to an array-like object if it is not one.
5964 *
5965 * @private
5966 * @param {*} value The value to process.
5967 * @returns {Array|Object} Returns the array-like object.
5968 */
5969 function toIterable(value) {
5970 if (value == null) {
5971 return [];
5972 }
5973 if (!isLength(getLength(value))) {
5974 return values(value);
5975 }
5976 return isObject(value) ? value : Object(value);
5977 }
5978
5979 /**
5980 * Converts `value` to an object if it is not one.
5981 *
5982 * @private
5983 * @param {*} value The value to process.
5984 * @returns {Object} Returns the object.
5985 */
5986 function toObject(value) {
5987 return isObject(value) ? value : Object(value);
5988 }
5989
5990 /**
5991 * Converts `value` to property path array if it is not one.
5992 *
5993 * @private
5994 * @param {*} value The value to process.
5995 * @returns {Array} Returns the property path array.
5996 */
5997 function toPath(value) {
5998 if (isArray(value)) {
5999 return value;
6000 }
6001 var result = [];
6002 baseToString(value).replace(rePropName, function(match, number, quote, string) {
6003 result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
6004 });
6005 return result;
6006 }
6007
6008 /**
6009 * Creates a clone of `wrapper`.
6010 *
6011 * @private
6012 * @param {Object} wrapper The wrapper to clone.
6013 * @returns {Object} Returns the cloned wrapper.
6014 */
6015 function wrapperClone(wrapper) {
6016 return wrapper instanceof LazyWrapper
6017 ? wrapper.clone()
6018 : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));
6019 }
6020
6021 /*------------------------------------------------------------------------*/
6022
6023 /**
6024 * Creates an array of elements split into groups the length of `size`.
6025 * If `collection` can't be split evenly, the final chunk will be the remaining
6026 * elements.
6027 *
6028 * @static
6029 * @memberOf _
6030 * @category Array
6031 * @param {Array} array The array to process.
6032 * @param {number} [size=1] The length of each chunk.
6033 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
6034 * @returns {Array} Returns the new array containing chunks.
6035 * @example
6036 *
6037 * _.chunk(['a', 'b', 'c', 'd'], 2);
6038 * // => [['a', 'b'], ['c', 'd']]
6039 *
6040 * _.chunk(['a', 'b', 'c', 'd'], 3);
6041 * // => [['a', 'b', 'c'], ['d']]
6042 */
6043 function chunk(array, size, guard) {
6044 if (guard ? isIterateeCall(array, size, guard) : size == null) {
6045 size = 1;
6046 } else {
6047 size = nativeMax(+size || 1, 1);
6048 }
6049 var index = 0,
6050 length = array ? array.length : 0,
6051 resIndex = -1,
6052 result = Array(ceil(length / size));
6053
6054 while (index < length) {
6055 result[++resIndex] = baseSlice(array, index, (index += size));
6056 }
6057 return result;
6058 }
6059
6060 /**
6061 * Creates an array with all falsey values removed. The values `false`, `null`,
6062 * `0`, `""`, `undefined`, and `NaN` are falsey.
6063 *
6064 * @static
6065 * @memberOf _
6066 * @category Array
6067 * @param {Array} array The array to compact.
6068 * @returns {Array} Returns the new array of filtered values.
6069 * @example
6070 *
6071 * _.compact([0, 1, false, 2, '', 3]);
6072 * // => [1, 2, 3]
6073 */
6074 function compact(array) {
6075 var index = -1,
6076 length = array ? array.length : 0,
6077 resIndex = -1,
6078 result = [];
6079
6080 while (++index < length) {
6081 var value = array[index];
6082 if (value) {
6083 result[++resIndex] = value;
6084 }
6085 }
6086 return result;
6087 }
6088
6089 /**
6090 * Creates an array excluding all values of the provided arrays using
6091 * `SameValueZero` for equality comparisons.
6092 *
6093 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6094 * comparisons are like strict equality comparisons, e.g. `===`, except that
6095 * `NaN` matches `NaN`.
6096 *
6097 * @static
6098 * @memberOf _
6099 * @category Array
6100 * @param {Array} array The array to inspect.
6101 * @param {...Array} [values] The arrays of values to exclude.
6102 * @returns {Array} Returns the new array of filtered values.
6103 * @example
6104 *
6105 * _.difference([1, 2, 3], [4, 2]);
6106 * // => [1, 3]
6107 */
6108 var difference = restParam(function(array, values) {
6109 return (isArray(array) || isArguments(array))
6110 ? baseDifference(array, baseFlatten(values, false, true))
6111 : [];
6112 });
6113
6114 /**
6115 * Creates a slice of `array` with `n` elements dropped from the beginning.
6116 *
6117 * @static
6118 * @memberOf _
6119 * @category Array
6120 * @param {Array} array The array to query.
6121 * @param {number} [n=1] The number of elements to drop.
6122 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
6123 * @returns {Array} Returns the slice of `array`.
6124 * @example
6125 *
6126 * _.drop([1, 2, 3]);
6127 * // => [2, 3]
6128 *
6129 * _.drop([1, 2, 3], 2);
6130 * // => [3]
6131 *
6132 * _.drop([1, 2, 3], 5);
6133 * // => []
6134 *
6135 * _.drop([1, 2, 3], 0);
6136 * // => [1, 2, 3]
6137 */
6138 function drop(array, n, guard) {
6139 var length = array ? array.length : 0;
6140 if (!length) {
6141 return [];
6142 }
6143 if (guard ? isIterateeCall(array, n, guard) : n == null) {
6144 n = 1;
6145 }
6146 return baseSlice(array, n < 0 ? 0 : n);
6147 }
6148
6149 /**
6150 * Creates a slice of `array` with `n` elements dropped from the end.
6151 *
6152 * @static
6153 * @memberOf _
6154 * @category Array
6155 * @param {Array} array The array to query.
6156 * @param {number} [n=1] The number of elements to drop.
6157 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
6158 * @returns {Array} Returns the slice of `array`.
6159 * @example
6160 *
6161 * _.dropRight([1, 2, 3]);
6162 * // => [1, 2]
6163 *
6164 * _.dropRight([1, 2, 3], 2);
6165 * // => [1]
6166 *
6167 * _.dropRight([1, 2, 3], 5);
6168 * // => []
6169 *
6170 * _.dropRight([1, 2, 3], 0);
6171 * // => [1, 2, 3]
6172 */
6173 function dropRight(array, n, guard) {
6174 var length = array ? array.length : 0;
6175 if (!length) {
6176 return [];
6177 }
6178 if (guard ? isIterateeCall(array, n, guard) : n == null) {
6179 n = 1;
6180 }
6181 n = length - (+n || 0);
6182 return baseSlice(array, 0, n < 0 ? 0 : n);
6183 }
6184
6185 /**
6186 * Creates a slice of `array` excluding elements dropped from the end.
6187 * Elements are dropped until `predicate` returns falsey. The predicate is
6188 * bound to `thisArg` and invoked with three arguments: (value, index, array).
6189 *
6190 * If a property name is provided for `predicate` the created `_.property`
6191 * style callback returns the property value of the given element.
6192 *
6193 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6194 * style callback returns `true` for elements that have a matching property
6195 * value, else `false`.
6196 *
6197 * If an object is provided for `predicate` the created `_.matches` style
6198 * callback returns `true` for elements that match the properties of the given
6199 * object, else `false`.
6200 *
6201 * @static
6202 * @memberOf _
6203 * @category Array
6204 * @param {Array} array The array to query.
6205 * @param {Function|Object|string} [predicate=_.identity] The function invoked
6206 * per iteration.
6207 * @param {*} [thisArg] The `this` binding of `predicate`.
6208 * @returns {Array} Returns the slice of `array`.
6209 * @example
6210 *
6211 * _.dropRightWhile([1, 2, 3], function(n) {
6212 * return n > 1;
6213 * });
6214 * // => [1]
6215 *
6216 * var users = [
6217 * { 'user': 'barney', 'active': true },
6218 * { 'user': 'fred', 'active': false },
6219 * { 'user': 'pebbles', 'active': false }
6220 * ];
6221 *
6222 * // using the `_.matches` callback shorthand
6223 * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
6224 * // => ['barney', 'fred']
6225 *
6226 * // using the `_.matchesProperty` callback shorthand
6227 * _.pluck(_.dropRightWhile(users, 'active', false), 'user');
6228 * // => ['barney']
6229 *
6230 * // using the `_.property` callback shorthand
6231 * _.pluck(_.dropRightWhile(users, 'active'), 'user');
6232 * // => ['barney', 'fred', 'pebbles']
6233 */
6234 function dropRightWhile(array, predicate, thisArg) {
6235 return (array && array.length)
6236 ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)
6237 : [];
6238 }
6239
6240 /**
6241 * Creates a slice of `array` excluding elements dropped from the beginning.
6242 * Elements are dropped until `predicate` returns falsey. The predicate is
6243 * bound to `thisArg` and invoked with three arguments: (value, index, array).
6244 *
6245 * If a property name is provided for `predicate` the created `_.property`
6246 * style callback returns the property value of the given element.
6247 *
6248 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6249 * style callback returns `true` for elements that have a matching property
6250 * value, else `false`.
6251 *
6252 * If an object is provided for `predicate` the created `_.matches` style
6253 * callback returns `true` for elements that have the properties of the given
6254 * object, else `false`.
6255 *
6256 * @static
6257 * @memberOf _
6258 * @category Array
6259 * @param {Array} array The array to query.
6260 * @param {Function|Object|string} [predicate=_.identity] The function invoked
6261 * per iteration.
6262 * @param {*} [thisArg] The `this` binding of `predicate`.
6263 * @returns {Array} Returns the slice of `array`.
6264 * @example
6265 *
6266 * _.dropWhile([1, 2, 3], function(n) {
6267 * return n < 3;
6268 * });
6269 * // => [3]
6270 *
6271 * var users = [
6272 * { 'user': 'barney', 'active': false },
6273 * { 'user': 'fred', 'active': false },
6274 * { 'user': 'pebbles', 'active': true }
6275 * ];
6276 *
6277 * // using the `_.matches` callback shorthand
6278 * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');
6279 * // => ['fred', 'pebbles']
6280 *
6281 * // using the `_.matchesProperty` callback shorthand
6282 * _.pluck(_.dropWhile(users, 'active', false), 'user');
6283 * // => ['pebbles']
6284 *
6285 * // using the `_.property` callback shorthand
6286 * _.pluck(_.dropWhile(users, 'active'), 'user');
6287 * // => ['barney', 'fred', 'pebbles']
6288 */
6289 function dropWhile(array, predicate, thisArg) {
6290 return (array && array.length)
6291 ? baseWhile(array, getCallback(predicate, thisArg, 3), true)
6292 : [];
6293 }
6294
6295 /**
6296 * Fills elements of `array` with `value` from `start` up to, but not
6297 * including, `end`.
6298 *
6299 * **Note:** This method mutates `array`.
6300 *
6301 * @static
6302 * @memberOf _
6303 * @category Array
6304 * @param {Array} array The array to fill.
6305 * @param {*} value The value to fill `array` with.
6306 * @param {number} [start=0] The start position.
6307 * @param {number} [end=array.length] The end position.
6308 * @returns {Array} Returns `array`.
6309 * @example
6310 *
6311 * var array = [1, 2, 3];
6312 *
6313 * _.fill(array, 'a');
6314 * console.log(array);
6315 * // => ['a', 'a', 'a']
6316 *
6317 * _.fill(Array(3), 2);
6318 * // => [2, 2, 2]
6319 *
6320 * _.fill([4, 6, 8], '*', 1, 2);
6321 * // => [4, '*', 8]
6322 */
6323 function fill(array, value, start, end) {
6324 var length = array ? array.length : 0;
6325 if (!length) {
6326 return [];
6327 }
6328 if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
6329 start = 0;
6330 end = length;
6331 }
6332 return baseFill(array, value, start, end);
6333 }
6334
6335 /**
6336 * This method is like `_.find` except that it returns the index of the first
6337 * element `predicate` returns truthy for instead of the element itself.
6338 *
6339 * If a property name is provided for `predicate` the created `_.property`
6340 * style callback returns the property value of the given element.
6341 *
6342 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6343 * style callback returns `true` for elements that have a matching property
6344 * value, else `false`.
6345 *
6346 * If an object is provided for `predicate` the created `_.matches` style
6347 * callback returns `true` for elements that have the properties of the given
6348 * object, else `false`.
6349 *
6350 * @static
6351 * @memberOf _
6352 * @category Array
6353 * @param {Array} array The array to search.
6354 * @param {Function|Object|string} [predicate=_.identity] The function invoked
6355 * per iteration.
6356 * @param {*} [thisArg] The `this` binding of `predicate`.
6357 * @returns {number} Returns the index of the found element, else `-1`.
6358 * @example
6359 *
6360 * var users = [
6361 * { 'user': 'barney', 'active': false },
6362 * { 'user': 'fred', 'active': false },
6363 * { 'user': 'pebbles', 'active': true }
6364 * ];
6365 *
6366 * _.findIndex(users, function(chr) {
6367 * return chr.user == 'barney';
6368 * });
6369 * // => 0
6370 *
6371 * // using the `_.matches` callback shorthand
6372 * _.findIndex(users, { 'user': 'fred', 'active': false });
6373 * // => 1
6374 *
6375 * // using the `_.matchesProperty` callback shorthand
6376 * _.findIndex(users, 'active', false);
6377 * // => 0
6378 *
6379 * // using the `_.property` callback shorthand
6380 * _.findIndex(users, 'active');
6381 * // => 2
6382 */
6383 var findIndex = createFindIndex();
6384
6385 /**
6386 * This method is like `_.findIndex` except that it iterates over elements
6387 * of `collection` from right to left.
6388 *
6389 * If a property name is provided for `predicate` the created `_.property`
6390 * style callback returns the property value of the given element.
6391 *
6392 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6393 * style callback returns `true` for elements that have a matching property
6394 * value, else `false`.
6395 *
6396 * If an object is provided for `predicate` the created `_.matches` style
6397 * callback returns `true` for elements that have the properties of the given
6398 * object, else `false`.
6399 *
6400 * @static
6401 * @memberOf _
6402 * @category Array
6403 * @param {Array} array The array to search.
6404 * @param {Function|Object|string} [predicate=_.identity] The function invoked
6405 * per iteration.
6406 * @param {*} [thisArg] The `this` binding of `predicate`.
6407 * @returns {number} Returns the index of the found element, else `-1`.
6408 * @example
6409 *
6410 * var users = [
6411 * { 'user': 'barney', 'active': true },
6412 * { 'user': 'fred', 'active': false },
6413 * { 'user': 'pebbles', 'active': false }
6414 * ];
6415 *
6416 * _.findLastIndex(users, function(chr) {
6417 * return chr.user == 'pebbles';
6418 * });
6419 * // => 2
6420 *
6421 * // using the `_.matches` callback shorthand
6422 * _.findLastIndex(users, { 'user': 'barney', 'active': true });
6423 * // => 0
6424 *
6425 * // using the `_.matchesProperty` callback shorthand
6426 * _.findLastIndex(users, 'active', false);
6427 * // => 2
6428 *
6429 * // using the `_.property` callback shorthand
6430 * _.findLastIndex(users, 'active');
6431 * // => 0
6432 */
6433 var findLastIndex = createFindIndex(true);
6434
6435 /**
6436 * Gets the first element of `array`.
6437 *
6438 * @static
6439 * @memberOf _
6440 * @alias head
6441 * @category Array
6442 * @param {Array} array The array to query.
6443 * @returns {*} Returns the first element of `array`.
6444 * @example
6445 *
6446 * _.first([1, 2, 3]);
6447 * // => 1
6448 *
6449 * _.first([]);
6450 * // => undefined
6451 */
6452 function first(array) {
6453 return array ? array[0] : undefined;
6454 }
6455
6456 /**
6457 * Flattens a nested array. If `isDeep` is `true` the array is recursively
6458 * flattened, otherwise it is only flattened a single level.
6459 *
6460 * @static
6461 * @memberOf _
6462 * @category Array
6463 * @param {Array} array The array to flatten.
6464 * @param {boolean} [isDeep] Specify a deep flatten.
6465 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
6466 * @returns {Array} Returns the new flattened array.
6467 * @example
6468 *
6469 * _.flatten([1, [2, 3, [4]]]);
6470 * // => [1, 2, 3, [4]]
6471 *
6472 * // using `isDeep`
6473 * _.flatten([1, [2, 3, [4]]], true);
6474 * // => [1, 2, 3, 4]
6475 */
6476 function flatten(array, isDeep, guard) {
6477 var length = array ? array.length : 0;
6478 if (guard && isIterateeCall(array, isDeep, guard)) {
6479 isDeep = false;
6480 }
6481 return length ? baseFlatten(array, isDeep) : [];
6482 }
6483
6484 /**
6485 * Recursively flattens a nested array.
6486 *
6487 * @static
6488 * @memberOf _
6489 * @category Array
6490 * @param {Array} array The array to recursively flatten.
6491 * @returns {Array} Returns the new flattened array.
6492 * @example
6493 *
6494 * _.flattenDeep([1, [2, 3, [4]]]);
6495 * // => [1, 2, 3, 4]
6496 */
6497 function flattenDeep(array) {
6498 var length = array ? array.length : 0;
6499 return length ? baseFlatten(array, true) : [];
6500 }
6501
6502 /**
6503 * Gets the index at which the first occurrence of `value` is found in `array`
6504 * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,
6505 * it is used as the offset from the end of `array`. If `array` is sorted
6506 * providing `true` for `fromIndex` performs a faster binary search.
6507 *
6508 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6509 * comparisons are like strict equality comparisons, e.g. `===`, except that
6510 * `NaN` matches `NaN`.
6511 *
6512 * @static
6513 * @memberOf _
6514 * @category Array
6515 * @param {Array} array The array to search.
6516 * @param {*} value The value to search for.
6517 * @param {boolean|number} [fromIndex=0] The index to search from or `true`
6518 * to perform a binary search on a sorted array.
6519 * @returns {number} Returns the index of the matched value, else `-1`.
6520 * @example
6521 *
6522 * _.indexOf([1, 2, 1, 2], 2);
6523 * // => 1
6524 *
6525 * // using `fromIndex`
6526 * _.indexOf([1, 2, 1, 2], 2, 2);
6527 * // => 3
6528 *
6529 * // performing a binary search
6530 * _.indexOf([1, 1, 2, 2], 2, true);
6531 * // => 2
6532 */
6533 function indexOf(array, value, fromIndex) {
6534 var length = array ? array.length : 0;
6535 if (!length) {
6536 return -1;
6537 }
6538 if (typeof fromIndex == 'number') {
6539 fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
6540 } else if (fromIndex) {
6541 var index = binaryIndex(array, value),
6542 other = array[index];
6543
6544 if (value === value ? (value === other) : (other !== other)) {
6545 return index;
6546 }
6547 return -1;
6548 }
6549 return baseIndexOf(array, value, fromIndex || 0);
6550 }
6551
6552 /**
6553 * Gets all but the last element of `array`.
6554 *
6555 * @static
6556 * @memberOf _
6557 * @category Array
6558 * @param {Array} array The array to query.
6559 * @returns {Array} Returns the slice of `array`.
6560 * @example
6561 *
6562 * _.initial([1, 2, 3]);
6563 * // => [1, 2]
6564 */
6565 function initial(array) {
6566 return dropRight(array, 1);
6567 }
6568
6569 /**
6570 * Creates an array of unique values in all provided arrays using `SameValueZero`
6571 * for equality comparisons.
6572 *
6573 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6574 * comparisons are like strict equality comparisons, e.g. `===`, except that
6575 * `NaN` matches `NaN`.
6576 *
6577 * @static
6578 * @memberOf _
6579 * @category Array
6580 * @param {...Array} [arrays] The arrays to inspect.
6581 * @returns {Array} Returns the new array of shared values.
6582 * @example
6583 * _.intersection([1, 2], [4, 2], [2, 1]);
6584 * // => [2]
6585 */
6586 function intersection() {
6587 var args = [],
6588 argsIndex = -1,
6589 argsLength = arguments.length,
6590 caches = [],
6591 indexOf = getIndexOf(),
6592 isCommon = indexOf == baseIndexOf,
6593 result = [];
6594
6595 while (++argsIndex < argsLength) {
6596 var value = arguments[argsIndex];
6597 if (isArray(value) || isArguments(value)) {
6598 args.push(value);
6599 caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null);
6600 }
6601 }
6602 argsLength = args.length;
6603 if (argsLength < 2) {
6604 return result;
6605 }
6606 var array = args[0],
6607 index = -1,
6608 length = array ? array.length : 0,
6609 seen = caches[0];
6610
6611 outer:
6612 while (++index < length) {
6613 value = array[index];
6614 if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
6615 argsIndex = argsLength;
6616 while (--argsIndex) {
6617 var cache = caches[argsIndex];
6618 if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {
6619 continue outer;
6620 }
6621 }
6622 if (seen) {
6623 seen.push(value);
6624 }
6625 result.push(value);
6626 }
6627 }
6628 return result;
6629 }
6630
6631 /**
6632 * Gets the last element of `array`.
6633 *
6634 * @static
6635 * @memberOf _
6636 * @category Array
6637 * @param {Array} array The array to query.
6638 * @returns {*} Returns the last element of `array`.
6639 * @example
6640 *
6641 * _.last([1, 2, 3]);
6642 * // => 3
6643 */
6644 function last(array) {
6645 var length = array ? array.length : 0;
6646 return length ? array[length - 1] : undefined;
6647 }
6648
6649 /**
6650 * This method is like `_.indexOf` except that it iterates over elements of
6651 * `array` from right to left.
6652 *
6653 * @static
6654 * @memberOf _
6655 * @category Array
6656 * @param {Array} array The array to search.
6657 * @param {*} value The value to search for.
6658 * @param {boolean|number} [fromIndex=array.length-1] The index to search from
6659 * or `true` to perform a binary search on a sorted array.
6660 * @returns {number} Returns the index of the matched value, else `-1`.
6661 * @example
6662 *
6663 * _.lastIndexOf([1, 2, 1, 2], 2);
6664 * // => 3
6665 *
6666 * // using `fromIndex`
6667 * _.lastIndexOf([1, 2, 1, 2], 2, 2);
6668 * // => 1
6669 *
6670 * // performing a binary search
6671 * _.lastIndexOf([1, 1, 2, 2], 2, true);
6672 * // => 3
6673 */
6674 function lastIndexOf(array, value, fromIndex) {
6675 var length = array ? array.length : 0;
6676 if (!length) {
6677 return -1;
6678 }
6679 var index = length;
6680 if (typeof fromIndex == 'number') {
6681 index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
6682 } else if (fromIndex) {
6683 index = binaryIndex(array, value, true) - 1;
6684 var other = array[index];
6685 if (value === value ? (value === other) : (other !== other)) {
6686 return index;
6687 }
6688 return -1;
6689 }
6690 if (value !== value) {
6691 return indexOfNaN(array, index, true);
6692 }
6693 while (index--) {
6694 if (array[index] === value) {
6695 return index;
6696 }
6697 }
6698 return -1;
6699 }
6700
6701 /**
6702 * Removes all provided values from `array` using `SameValueZero` for equality
6703 * comparisons.
6704 *
6705 * **Notes:**
6706 * - Unlike `_.without`, this method mutates `array`
6707 * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
6708 * comparisons are like strict equality comparisons, e.g. `===`, except
6709 * that `NaN` matches `NaN`
6710 *
6711 * @static
6712 * @memberOf _
6713 * @category Array
6714 * @param {Array} array The array to modify.
6715 * @param {...*} [values] The values to remove.
6716 * @returns {Array} Returns `array`.
6717 * @example
6718 *
6719 * var array = [1, 2, 3, 1, 2, 3];
6720 *
6721 * _.pull(array, 2, 3);
6722 * console.log(array);
6723 * // => [1, 1]
6724 */
6725 function pull() {
6726 var args = arguments,
6727 array = args[0];
6728
6729 if (!(array && array.length)) {
6730 return array;
6731 }
6732 var index = 0,
6733 indexOf = getIndexOf(),
6734 length = args.length;
6735
6736 while (++index < length) {
6737 var fromIndex = 0,
6738 value = args[index];
6739
6740 while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
6741 splice.call(array, fromIndex, 1);
6742 }
6743 }
6744 return array;
6745 }
6746
6747 /**
6748 * Removes elements from `array` corresponding to the given indexes and returns
6749 * an array of the removed elements. Indexes may be specified as an array of
6750 * indexes or as individual arguments.
6751 *
6752 * **Note:** Unlike `_.at`, this method mutates `array`.
6753 *
6754 * @static
6755 * @memberOf _
6756 * @category Array
6757 * @param {Array} array The array to modify.
6758 * @param {...(number|number[])} [indexes] The indexes of elements to remove,
6759 * specified as individual indexes or arrays of indexes.
6760 * @returns {Array} Returns the new array of removed elements.
6761 * @example
6762 *
6763 * var array = [5, 10, 15, 20];
6764 * var evens = _.pullAt(array, 1, 3);
6765 *
6766 * console.log(array);
6767 * // => [5, 15]
6768 *
6769 * console.log(evens);
6770 * // => [10, 20]
6771 */
6772 var pullAt = restParam(function(array, indexes) {
6773 array || (array = []);
6774 indexes = baseFlatten(indexes);
6775
6776 var result = baseAt(array, indexes);
6777 basePullAt(array, indexes.sort(baseCompareAscending));
6778 return result;
6779 });
6780
6781 /**
6782 * Removes all elements from `array` that `predicate` returns truthy for
6783 * and returns an array of the removed elements. The predicate is bound to
6784 * `thisArg` and invoked with three arguments: (value, index, array).
6785 *
6786 * If a property name is provided for `predicate` the created `_.property`
6787 * style callback returns the property value of the given element.
6788 *
6789 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6790 * style callback returns `true` for elements that have a matching property
6791 * value, else `false`.
6792 *
6793 * If an object is provided for `predicate` the created `_.matches` style
6794 * callback returns `true` for elements that have the properties of the given
6795 * object, else `false`.
6796 *
6797 * **Note:** Unlike `_.filter`, this method mutates `array`.
6798 *
6799 * @static
6800 * @memberOf _
6801 * @category Array
6802 * @param {Array} array The array to modify.
6803 * @param {Function|Object|string} [predicate=_.identity] The function invoked
6804 * per iteration.
6805 * @param {*} [thisArg] The `this` binding of `predicate`.
6806 * @returns {Array} Returns the new array of removed elements.
6807 * @example
6808 *
6809 * var array = [1, 2, 3, 4];
6810 * var evens = _.remove(array, function(n) {
6811 * return n % 2 == 0;
6812 * });
6813 *
6814 * console.log(array);
6815 * // => [1, 3]
6816 *
6817 * console.log(evens);
6818 * // => [2, 4]
6819 */
6820 function remove(array, predicate, thisArg) {
6821 var result = [];
6822 if (!(array && array.length)) {
6823 return result;
6824 }
6825 var index = -1,
6826 indexes = [],
6827 length = array.length;
6828
6829 predicate = getCallback(predicate, thisArg, 3);
6830 while (++index < length) {
6831 var value = array[index];
6832 if (predicate(value, index, array)) {
6833 result.push(value);
6834 indexes.push(index);
6835 }
6836 }
6837 basePullAt(array, indexes);
6838 return result;
6839 }
6840
6841 /**
6842 * Gets all but the first element of `array`.
6843 *
6844 * @static
6845 * @memberOf _
6846 * @alias tail
6847 * @category Array
6848 * @param {Array} array The array to query.
6849 * @returns {Array} Returns the slice of `array`.
6850 * @example
6851 *
6852 * _.rest([1, 2, 3]);
6853 * // => [2, 3]
6854 */
6855 function rest(array) {
6856 return drop(array, 1);
6857 }
6858
6859 /**
6860 * Creates a slice of `array` from `start` up to, but not including, `end`.
6861 *
6862 * **Note:** This method is used instead of `Array#slice` to support node
6863 * lists in IE < 9 and to ensure dense arrays are returned.
6864 *
6865 * @static
6866 * @memberOf _
6867 * @category Array
6868 * @param {Array} array The array to slice.
6869 * @param {number} [start=0] The start position.
6870 * @param {number} [end=array.length] The end position.
6871 * @returns {Array} Returns the slice of `array`.
6872 */
6873 function slice(array, start, end) {
6874 var length = array ? array.length : 0;
6875 if (!length) {
6876 return [];
6877 }
6878 if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
6879 start = 0;
6880 end = length;
6881 }
6882 return baseSlice(array, start, end);
6883 }
6884
6885 /**
6886 * Uses a binary search to determine the lowest index at which `value` should
6887 * be inserted into `array` in order to maintain its sort order. If an iteratee
6888 * function is provided it is invoked for `value` and each element of `array`
6889 * to compute their sort ranking. The iteratee is bound to `thisArg` and
6890 * invoked with one argument; (value).
6891 *
6892 * If a property name is provided for `iteratee` the created `_.property`
6893 * style callback returns the property value of the given element.
6894 *
6895 * If a value is also provided for `thisArg` the created `_.matchesProperty`
6896 * style callback returns `true` for elements that have a matching property
6897 * value, else `false`.
6898 *
6899 * If an object is provided for `iteratee` the created `_.matches` style
6900 * callback returns `true` for elements that have the properties of the given
6901 * object, else `false`.
6902 *
6903 * @static
6904 * @memberOf _
6905 * @category Array
6906 * @param {Array} array The sorted array to inspect.
6907 * @param {*} value The value to evaluate.
6908 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
6909 * per iteration.
6910 * @param {*} [thisArg] The `this` binding of `iteratee`.
6911 * @returns {number} Returns the index at which `value` should be inserted
6912 * into `array`.
6913 * @example
6914 *
6915 * _.sortedIndex([30, 50], 40);
6916 * // => 1
6917 *
6918 * _.sortedIndex([4, 4, 5, 5], 5);
6919 * // => 2
6920 *
6921 * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };
6922 *
6923 * // using an iteratee function
6924 * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {
6925 * return this.data[word];
6926 * }, dict);
6927 * // => 1
6928 *
6929 * // using the `_.property` callback shorthand
6930 * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
6931 * // => 1
6932 */
6933 var sortedIndex = createSortedIndex();
6934
6935 /**
6936 * This method is like `_.sortedIndex` except that it returns the highest
6937 * index at which `value` should be inserted into `array` in order to
6938 * maintain its sort order.
6939 *
6940 * @static
6941 * @memberOf _
6942 * @category Array
6943 * @param {Array} array The sorted array to inspect.
6944 * @param {*} value The value to evaluate.
6945 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
6946 * per iteration.
6947 * @param {*} [thisArg] The `this` binding of `iteratee`.
6948 * @returns {number} Returns the index at which `value` should be inserted
6949 * into `array`.
6950 * @example
6951 *
6952 * _.sortedLastIndex([4, 4, 5, 5], 5);
6953 * // => 4
6954 */
6955 var sortedLastIndex = createSortedIndex(true);
6956
6957 /**
6958 * Creates a slice of `array` with `n` elements taken from the beginning.
6959 *
6960 * @static
6961 * @memberOf _
6962 * @category Array
6963 * @param {Array} array The array to query.
6964 * @param {number} [n=1] The number of elements to take.
6965 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
6966 * @returns {Array} Returns the slice of `array`.
6967 * @example
6968 *
6969 * _.take([1, 2, 3]);
6970 * // => [1]
6971 *
6972 * _.take([1, 2, 3], 2);
6973 * // => [1, 2]
6974 *
6975 * _.take([1, 2, 3], 5);
6976 * // => [1, 2, 3]
6977 *
6978 * _.take([1, 2, 3], 0);
6979 * // => []
6980 */
6981 function take(array, n, guard) {
6982 var length = array ? array.length : 0;
6983 if (!length) {
6984 return [];
6985 }
6986 if (guard ? isIterateeCall(array, n, guard) : n == null) {
6987 n = 1;
6988 }
6989 return baseSlice(array, 0, n < 0 ? 0 : n);
6990 }
6991
6992 /**
6993 * Creates a slice of `array` with `n` elements taken from the end.
6994 *
6995 * @static
6996 * @memberOf _
6997 * @category Array
6998 * @param {Array} array The array to query.
6999 * @param {number} [n=1] The number of elements to take.
7000 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
7001 * @returns {Array} Returns the slice of `array`.
7002 * @example
7003 *
7004 * _.takeRight([1, 2, 3]);
7005 * // => [3]
7006 *
7007 * _.takeRight([1, 2, 3], 2);
7008 * // => [2, 3]
7009 *
7010 * _.takeRight([1, 2, 3], 5);
7011 * // => [1, 2, 3]
7012 *
7013 * _.takeRight([1, 2, 3], 0);
7014 * // => []
7015 */
7016 function takeRight(array, n, guard) {
7017 var length = array ? array.length : 0;
7018 if (!length) {
7019 return [];
7020 }
7021 if (guard ? isIterateeCall(array, n, guard) : n == null) {
7022 n = 1;
7023 }
7024 n = length - (+n || 0);
7025 return baseSlice(array, n < 0 ? 0 : n);
7026 }
7027
7028 /**
7029 * Creates a slice of `array` with elements taken from the end. Elements are
7030 * taken until `predicate` returns falsey. The predicate is bound to `thisArg`
7031 * and invoked with three arguments: (value, index, array).
7032 *
7033 * If a property name is provided for `predicate` the created `_.property`
7034 * style callback returns the property value of the given element.
7035 *
7036 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7037 * style callback returns `true` for elements that have a matching property
7038 * value, else `false`.
7039 *
7040 * If an object is provided for `predicate` the created `_.matches` style
7041 * callback returns `true` for elements that have the properties of the given
7042 * object, else `false`.
7043 *
7044 * @static
7045 * @memberOf _
7046 * @category Array
7047 * @param {Array} array The array to query.
7048 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7049 * per iteration.
7050 * @param {*} [thisArg] The `this` binding of `predicate`.
7051 * @returns {Array} Returns the slice of `array`.
7052 * @example
7053 *
7054 * _.takeRightWhile([1, 2, 3], function(n) {
7055 * return n > 1;
7056 * });
7057 * // => [2, 3]
7058 *
7059 * var users = [
7060 * { 'user': 'barney', 'active': true },
7061 * { 'user': 'fred', 'active': false },
7062 * { 'user': 'pebbles', 'active': false }
7063 * ];
7064 *
7065 * // using the `_.matches` callback shorthand
7066 * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
7067 * // => ['pebbles']
7068 *
7069 * // using the `_.matchesProperty` callback shorthand
7070 * _.pluck(_.takeRightWhile(users, 'active', false), 'user');
7071 * // => ['fred', 'pebbles']
7072 *
7073 * // using the `_.property` callback shorthand
7074 * _.pluck(_.takeRightWhile(users, 'active'), 'user');
7075 * // => []
7076 */
7077 function takeRightWhile(array, predicate, thisArg) {
7078 return (array && array.length)
7079 ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)
7080 : [];
7081 }
7082
7083 /**
7084 * Creates a slice of `array` with elements taken from the beginning. Elements
7085 * are taken until `predicate` returns falsey. The predicate is bound to
7086 * `thisArg` and invoked with three arguments: (value, index, array).
7087 *
7088 * If a property name is provided for `predicate` the created `_.property`
7089 * style callback returns the property value of the given element.
7090 *
7091 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7092 * style callback returns `true` for elements that have a matching property
7093 * value, else `false`.
7094 *
7095 * If an object is provided for `predicate` the created `_.matches` style
7096 * callback returns `true` for elements that have the properties of the given
7097 * object, else `false`.
7098 *
7099 * @static
7100 * @memberOf _
7101 * @category Array
7102 * @param {Array} array The array to query.
7103 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7104 * per iteration.
7105 * @param {*} [thisArg] The `this` binding of `predicate`.
7106 * @returns {Array} Returns the slice of `array`.
7107 * @example
7108 *
7109 * _.takeWhile([1, 2, 3], function(n) {
7110 * return n < 3;
7111 * });
7112 * // => [1, 2]
7113 *
7114 * var users = [
7115 * { 'user': 'barney', 'active': false },
7116 * { 'user': 'fred', 'active': false},
7117 * { 'user': 'pebbles', 'active': true }
7118 * ];
7119 *
7120 * // using the `_.matches` callback shorthand
7121 * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');
7122 * // => ['barney']
7123 *
7124 * // using the `_.matchesProperty` callback shorthand
7125 * _.pluck(_.takeWhile(users, 'active', false), 'user');
7126 * // => ['barney', 'fred']
7127 *
7128 * // using the `_.property` callback shorthand
7129 * _.pluck(_.takeWhile(users, 'active'), 'user');
7130 * // => []
7131 */
7132 function takeWhile(array, predicate, thisArg) {
7133 return (array && array.length)
7134 ? baseWhile(array, getCallback(predicate, thisArg, 3))
7135 : [];
7136 }
7137
7138 /**
7139 * Creates an array of unique values, in order, of the provided arrays using
7140 * `SameValueZero` for equality comparisons.
7141 *
7142 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
7143 * comparisons are like strict equality comparisons, e.g. `===`, except that
7144 * `NaN` matches `NaN`.
7145 *
7146 * @static
7147 * @memberOf _
7148 * @category Array
7149 * @param {...Array} [arrays] The arrays to inspect.
7150 * @returns {Array} Returns the new array of combined values.
7151 * @example
7152 *
7153 * _.union([1, 2], [4, 2], [2, 1]);
7154 * // => [1, 2, 4]
7155 */
7156 var union = restParam(function(arrays) {
7157 return baseUniq(baseFlatten(arrays, false, true));
7158 });
7159
7160 /**
7161 * Creates a duplicate-free version of an array, using `SameValueZero` for
7162 * equality comparisons, in which only the first occurence of each element
7163 * is kept. Providing `true` for `isSorted` performs a faster search algorithm
7164 * for sorted arrays. If an iteratee function is provided it is invoked for
7165 * each element in the array to generate the criterion by which uniqueness
7166 * is computed. The `iteratee` is bound to `thisArg` and invoked with three
7167 * arguments: (value, index, array).
7168 *
7169 * If a property name is provided for `iteratee` the created `_.property`
7170 * style callback returns the property value of the given element.
7171 *
7172 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7173 * style callback returns `true` for elements that have a matching property
7174 * value, else `false`.
7175 *
7176 * If an object is provided for `iteratee` the created `_.matches` style
7177 * callback returns `true` for elements that have the properties of the given
7178 * object, else `false`.
7179 *
7180 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
7181 * comparisons are like strict equality comparisons, e.g. `===`, except that
7182 * `NaN` matches `NaN`.
7183 *
7184 * @static
7185 * @memberOf _
7186 * @alias unique
7187 * @category Array
7188 * @param {Array} array The array to inspect.
7189 * @param {boolean} [isSorted] Specify the array is sorted.
7190 * @param {Function|Object|string} [iteratee] The function invoked per iteration.
7191 * @param {*} [thisArg] The `this` binding of `iteratee`.
7192 * @returns {Array} Returns the new duplicate-value-free array.
7193 * @example
7194 *
7195 * _.uniq([2, 1, 2]);
7196 * // => [2, 1]
7197 *
7198 * // using `isSorted`
7199 * _.uniq([1, 1, 2], true);
7200 * // => [1, 2]
7201 *
7202 * // using an iteratee function
7203 * _.uniq([1, 2.5, 1.5, 2], function(n) {
7204 * return this.floor(n);
7205 * }, Math);
7206 * // => [1, 2.5]
7207 *
7208 * // using the `_.property` callback shorthand
7209 * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
7210 * // => [{ 'x': 1 }, { 'x': 2 }]
7211 */
7212 function uniq(array, isSorted, iteratee, thisArg) {
7213 var length = array ? array.length : 0;
7214 if (!length) {
7215 return [];
7216 }
7217 if (isSorted != null && typeof isSorted != 'boolean') {
7218 thisArg = iteratee;
7219 iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;
7220 isSorted = false;
7221 }
7222 var func = getCallback();
7223 if (!(func === baseCallback && iteratee == null)) {
7224 iteratee = func(iteratee, thisArg, 3);
7225 }
7226 return (isSorted && getIndexOf() == baseIndexOf)
7227 ? sortedUniq(array, iteratee)
7228 : baseUniq(array, iteratee);
7229 }
7230
7231 /**
7232 * This method is like `_.zip` except that it accepts an array of grouped
7233 * elements and creates an array regrouping the elements to their pre-`_.zip`
7234 * configuration.
7235 *
7236 * @static
7237 * @memberOf _
7238 * @category Array
7239 * @param {Array} array The array of grouped elements to process.
7240 * @returns {Array} Returns the new array of regrouped elements.
7241 * @example
7242 *
7243 * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
7244 * // => [['fred', 30, true], ['barney', 40, false]]
7245 *
7246 * _.unzip(zipped);
7247 * // => [['fred', 'barney'], [30, 40], [true, false]]
7248 */
7249 function unzip(array) {
7250 var index = -1,
7251 length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0,
7252 result = Array(length);
7253
7254 while (++index < length) {
7255 result[index] = arrayMap(array, baseProperty(index));
7256 }
7257 return result;
7258 }
7259
7260 /**
7261 * Creates an array excluding all provided values using `SameValueZero` for
7262 * equality comparisons.
7263 *
7264 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
7265 * comparisons are like strict equality comparisons, e.g. `===`, except that
7266 * `NaN` matches `NaN`.
7267 *
7268 * @static
7269 * @memberOf _
7270 * @category Array
7271 * @param {Array} array The array to filter.
7272 * @param {...*} [values] The values to exclude.
7273 * @returns {Array} Returns the new array of filtered values.
7274 * @example
7275 *
7276 * _.without([1, 2, 1, 3], 1, 2);
7277 * // => [3]
7278 */
7279 var without = restParam(function(array, values) {
7280 return (isArray(array) || isArguments(array))
7281 ? baseDifference(array, values)
7282 : [];
7283 });
7284
7285 /**
7286 * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
7287 * of the provided arrays.
7288 *
7289 * @static
7290 * @memberOf _
7291 * @category Array
7292 * @param {...Array} [arrays] The arrays to inspect.
7293 * @returns {Array} Returns the new array of values.
7294 * @example
7295 *
7296 * _.xor([1, 2], [4, 2]);
7297 * // => [1, 4]
7298 */
7299 function xor() {
7300 var index = -1,
7301 length = arguments.length;
7302
7303 while (++index < length) {
7304 var array = arguments[index];
7305 if (isArray(array) || isArguments(array)) {
7306 var result = result
7307 ? baseDifference(result, array).concat(baseDifference(array, result))
7308 : array;
7309 }
7310 }
7311 return result ? baseUniq(result) : [];
7312 }
7313
7314 /**
7315 * Creates an array of grouped elements, the first of which contains the first
7316 * elements of the given arrays, the second of which contains the second elements
7317 * of the given arrays, and so on.
7318 *
7319 * @static
7320 * @memberOf _
7321 * @category Array
7322 * @param {...Array} [arrays] The arrays to process.
7323 * @returns {Array} Returns the new array of grouped elements.
7324 * @example
7325 *
7326 * _.zip(['fred', 'barney'], [30, 40], [true, false]);
7327 * // => [['fred', 30, true], ['barney', 40, false]]
7328 */
7329 var zip = restParam(unzip);
7330
7331 /**
7332 * The inverse of `_.pairs`; this method returns an object composed from arrays
7333 * of property names and values. Provide either a single two dimensional array,
7334 * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
7335 * and one of corresponding values.
7336 *
7337 * @static
7338 * @memberOf _
7339 * @alias object
7340 * @category Array
7341 * @param {Array} props The property names.
7342 * @param {Array} [values=[]] The property values.
7343 * @returns {Object} Returns the new object.
7344 * @example
7345 *
7346 * _.zipObject([['fred', 30], ['barney', 40]]);
7347 * // => { 'fred': 30, 'barney': 40 }
7348 *
7349 * _.zipObject(['fred', 'barney'], [30, 40]);
7350 * // => { 'fred': 30, 'barney': 40 }
7351 */
7352 function zipObject(props, values) {
7353 var index = -1,
7354 length = props ? props.length : 0,
7355 result = {};
7356
7357 if (length && !values && !isArray(props[0])) {
7358 values = [];
7359 }
7360 while (++index < length) {
7361 var key = props[index];
7362 if (values) {
7363 result[key] = values[index];
7364 } else if (key) {
7365 result[key[0]] = key[1];
7366 }
7367 }
7368 return result;
7369 }
7370
7371 /*------------------------------------------------------------------------*/
7372
7373 /**
7374 * Creates a `lodash` object that wraps `value` with explicit method
7375 * chaining enabled.
7376 *
7377 * @static
7378 * @memberOf _
7379 * @category Chain
7380 * @param {*} value The value to wrap.
7381 * @returns {Object} Returns the new `lodash` wrapper instance.
7382 * @example
7383 *
7384 * var users = [
7385 * { 'user': 'barney', 'age': 36 },
7386 * { 'user': 'fred', 'age': 40 },
7387 * { 'user': 'pebbles', 'age': 1 }
7388 * ];
7389 *
7390 * var youngest = _.chain(users)
7391 * .sortBy('age')
7392 * .map(function(chr) {
7393 * return chr.user + ' is ' + chr.age;
7394 * })
7395 * .first()
7396 * .value();
7397 * // => 'pebbles is 1'
7398 */
7399 function chain(value) {
7400 var result = lodash(value);
7401 result.__chain__ = true;
7402 return result;
7403 }
7404
7405 /**
7406 * This method invokes `interceptor` and returns `value`. The interceptor is
7407 * bound to `thisArg` and invoked with one argument; (value). The purpose of
7408 * this method is to "tap into" a method chain in order to perform operations
7409 * on intermediate results within the chain.
7410 *
7411 * @static
7412 * @memberOf _
7413 * @category Chain
7414 * @param {*} value The value to provide to `interceptor`.
7415 * @param {Function} interceptor The function to invoke.
7416 * @param {*} [thisArg] The `this` binding of `interceptor`.
7417 * @returns {*} Returns `value`.
7418 * @example
7419 *
7420 * _([1, 2, 3])
7421 * .tap(function(array) {
7422 * array.pop();
7423 * })
7424 * .reverse()
7425 * .value();
7426 * // => [2, 1]
7427 */
7428 function tap(value, interceptor, thisArg) {
7429 interceptor.call(thisArg, value);
7430 return value;
7431 }
7432
7433 /**
7434 * This method is like `_.tap` except that it returns the result of `interceptor`.
7435 *
7436 * @static
7437 * @memberOf _
7438 * @category Chain
7439 * @param {*} value The value to provide to `interceptor`.
7440 * @param {Function} interceptor The function to invoke.
7441 * @param {*} [thisArg] The `this` binding of `interceptor`.
7442 * @returns {*} Returns the result of `interceptor`.
7443 * @example
7444 *
7445 * _(' abc ')
7446 * .chain()
7447 * .trim()
7448 * .thru(function(value) {
7449 * return [value];
7450 * })
7451 * .value();
7452 * // => ['abc']
7453 */
7454 function thru(value, interceptor, thisArg) {
7455 return interceptor.call(thisArg, value);
7456 }
7457
7458 /**
7459 * Enables explicit method chaining on the wrapper object.
7460 *
7461 * @name chain
7462 * @memberOf _
7463 * @category Chain
7464 * @returns {Object} Returns the new `lodash` wrapper instance.
7465 * @example
7466 *
7467 * var users = [
7468 * { 'user': 'barney', 'age': 36 },
7469 * { 'user': 'fred', 'age': 40 }
7470 * ];
7471 *
7472 * // without explicit chaining
7473 * _(users).first();
7474 * // => { 'user': 'barney', 'age': 36 }
7475 *
7476 * // with explicit chaining
7477 * _(users).chain()
7478 * .first()
7479 * .pick('user')
7480 * .value();
7481 * // => { 'user': 'barney' }
7482 */
7483 function wrapperChain() {
7484 return chain(this);
7485 }
7486
7487 /**
7488 * Executes the chained sequence and returns the wrapped result.
7489 *
7490 * @name commit
7491 * @memberOf _
7492 * @category Chain
7493 * @returns {Object} Returns the new `lodash` wrapper instance.
7494 * @example
7495 *
7496 * var array = [1, 2];
7497 * var wrapper = _(array).push(3);
7498 *
7499 * console.log(array);
7500 * // => [1, 2]
7501 *
7502 * wrapper = wrapper.commit();
7503 * console.log(array);
7504 * // => [1, 2, 3]
7505 *
7506 * wrapper.last();
7507 * // => 3
7508 *
7509 * console.log(array);
7510 * // => [1, 2, 3]
7511 */
7512 function wrapperCommit() {
7513 return new LodashWrapper(this.value(), this.__chain__);
7514 }
7515
7516 /**
7517 * Creates a clone of the chained sequence planting `value` as the wrapped value.
7518 *
7519 * @name plant
7520 * @memberOf _
7521 * @category Chain
7522 * @returns {Object} Returns the new `lodash` wrapper instance.
7523 * @example
7524 *
7525 * var array = [1, 2];
7526 * var wrapper = _(array).map(function(value) {
7527 * return Math.pow(value, 2);
7528 * });
7529 *
7530 * var other = [3, 4];
7531 * var otherWrapper = wrapper.plant(other);
7532 *
7533 * otherWrapper.value();
7534 * // => [9, 16]
7535 *
7536 * wrapper.value();
7537 * // => [1, 4]
7538 */
7539 function wrapperPlant(value) {
7540 var result,
7541 parent = this;
7542
7543 while (parent instanceof baseLodash) {
7544 var clone = wrapperClone(parent);
7545 if (result) {
7546 previous.__wrapped__ = clone;
7547 } else {
7548 result = clone;
7549 }
7550 var previous = clone;
7551 parent = parent.__wrapped__;
7552 }
7553 previous.__wrapped__ = value;
7554 return result;
7555 }
7556
7557 /**
7558 * Reverses the wrapped array so the first element becomes the last, the
7559 * second element becomes the second to last, and so on.
7560 *
7561 * **Note:** This method mutates the wrapped array.
7562 *
7563 * @name reverse
7564 * @memberOf _
7565 * @category Chain
7566 * @returns {Object} Returns the new reversed `lodash` wrapper instance.
7567 * @example
7568 *
7569 * var array = [1, 2, 3];
7570 *
7571 * _(array).reverse().value()
7572 * // => [3, 2, 1]
7573 *
7574 * console.log(array);
7575 * // => [3, 2, 1]
7576 */
7577 function wrapperReverse() {
7578 var value = this.__wrapped__;
7579 if (value instanceof LazyWrapper) {
7580 if (this.__actions__.length) {
7581 value = new LazyWrapper(this);
7582 }
7583 return new LodashWrapper(value.reverse(), this.__chain__);
7584 }
7585 return this.thru(function(value) {
7586 return value.reverse();
7587 });
7588 }
7589
7590 /**
7591 * Produces the result of coercing the unwrapped value to a string.
7592 *
7593 * @name toString
7594 * @memberOf _
7595 * @category Chain
7596 * @returns {string} Returns the coerced string value.
7597 * @example
7598 *
7599 * _([1, 2, 3]).toString();
7600 * // => '1,2,3'
7601 */
7602 function wrapperToString() {
7603 return (this.value() + '');
7604 }
7605
7606 /**
7607 * Executes the chained sequence to extract the unwrapped value.
7608 *
7609 * @name value
7610 * @memberOf _
7611 * @alias run, toJSON, valueOf
7612 * @category Chain
7613 * @returns {*} Returns the resolved unwrapped value.
7614 * @example
7615 *
7616 * _([1, 2, 3]).value();
7617 * // => [1, 2, 3]
7618 */
7619 function wrapperValue() {
7620 return baseWrapperValue(this.__wrapped__, this.__actions__);
7621 }
7622
7623 /*------------------------------------------------------------------------*/
7624
7625 /**
7626 * Creates an array of elements corresponding to the given keys, or indexes,
7627 * of `collection`. Keys may be specified as individual arguments or as arrays
7628 * of keys.
7629 *
7630 * @static
7631 * @memberOf _
7632 * @category Collection
7633 * @param {Array|Object|string} collection The collection to iterate over.
7634 * @param {...(number|number[]|string|string[])} [props] The property names
7635 * or indexes of elements to pick, specified individually or in arrays.
7636 * @returns {Array} Returns the new array of picked elements.
7637 * @example
7638 *
7639 * _.at(['a', 'b', 'c'], [0, 2]);
7640 * // => ['a', 'c']
7641 *
7642 * _.at(['barney', 'fred', 'pebbles'], 0, 2);
7643 * // => ['barney', 'pebbles']
7644 */
7645 var at = restParam(function(collection, props) {
7646 var length = collection ? getLength(collection) : 0;
7647 if (isLength(length)) {
7648 collection = toIterable(collection);
7649 }
7650 return baseAt(collection, baseFlatten(props));
7651 });
7652
7653 /**
7654 * Creates an object composed of keys generated from the results of running
7655 * each element of `collection` through `iteratee`. The corresponding value
7656 * of each key is the number of times the key was returned by `iteratee`.
7657 * The `iteratee` is bound to `thisArg` and invoked with three arguments:
7658 * (value, index|key, collection).
7659 *
7660 * If a property name is provided for `iteratee` the created `_.property`
7661 * style callback returns the property value of the given element.
7662 *
7663 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7664 * style callback returns `true` for elements that have a matching property
7665 * value, else `false`.
7666 *
7667 * If an object is provided for `iteratee` the created `_.matches` style
7668 * callback returns `true` for elements that have the properties of the given
7669 * object, else `false`.
7670 *
7671 * @static
7672 * @memberOf _
7673 * @category Collection
7674 * @param {Array|Object|string} collection The collection to iterate over.
7675 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
7676 * per iteration.
7677 * @param {*} [thisArg] The `this` binding of `iteratee`.
7678 * @returns {Object} Returns the composed aggregate object.
7679 * @example
7680 *
7681 * _.countBy([4.3, 6.1, 6.4], function(n) {
7682 * return Math.floor(n);
7683 * });
7684 * // => { '4': 1, '6': 2 }
7685 *
7686 * _.countBy([4.3, 6.1, 6.4], function(n) {
7687 * return this.floor(n);
7688 * }, Math);
7689 * // => { '4': 1, '6': 2 }
7690 *
7691 * _.countBy(['one', 'two', 'three'], 'length');
7692 * // => { '3': 2, '5': 1 }
7693 */
7694 var countBy = createAggregator(function(result, value, key) {
7695 hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
7696 });
7697
7698 /**
7699 * Checks if `predicate` returns truthy for **all** elements of `collection`.
7700 * The predicate is bound to `thisArg` and invoked with three arguments:
7701 * (value, index|key, collection).
7702 *
7703 * If a property name is provided for `predicate` the created `_.property`
7704 * style callback returns the property value of the given element.
7705 *
7706 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7707 * style callback returns `true` for elements that have a matching property
7708 * value, else `false`.
7709 *
7710 * If an object is provided for `predicate` the created `_.matches` style
7711 * callback returns `true` for elements that have the properties of the given
7712 * object, else `false`.
7713 *
7714 * @static
7715 * @memberOf _
7716 * @alias all
7717 * @category Collection
7718 * @param {Array|Object|string} collection The collection to iterate over.
7719 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7720 * per iteration.
7721 * @param {*} [thisArg] The `this` binding of `predicate`.
7722 * @returns {boolean} Returns `true` if all elements pass the predicate check,
7723 * else `false`.
7724 * @example
7725 *
7726 * _.every([true, 1, null, 'yes'], Boolean);
7727 * // => false
7728 *
7729 * var users = [
7730 * { 'user': 'barney', 'active': false },
7731 * { 'user': 'fred', 'active': false }
7732 * ];
7733 *
7734 * // using the `_.matches` callback shorthand
7735 * _.every(users, { 'user': 'barney', 'active': false });
7736 * // => false
7737 *
7738 * // using the `_.matchesProperty` callback shorthand
7739 * _.every(users, 'active', false);
7740 * // => true
7741 *
7742 * // using the `_.property` callback shorthand
7743 * _.every(users, 'active');
7744 * // => false
7745 */
7746 function every(collection, predicate, thisArg) {
7747 var func = isArray(collection) ? arrayEvery : baseEvery;
7748 if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
7749 predicate = null;
7750 }
7751 if (typeof predicate != 'function' || thisArg !== undefined) {
7752 predicate = getCallback(predicate, thisArg, 3);
7753 }
7754 return func(collection, predicate);
7755 }
7756
7757 /**
7758 * Iterates over elements of `collection`, returning an array of all elements
7759 * `predicate` returns truthy for. The predicate is bound to `thisArg` and
7760 * invoked with three arguments: (value, index|key, collection).
7761 *
7762 * If a property name is provided for `predicate` the created `_.property`
7763 * style callback returns the property value of the given element.
7764 *
7765 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7766 * style callback returns `true` for elements that have a matching property
7767 * value, else `false`.
7768 *
7769 * If an object is provided for `predicate` the created `_.matches` style
7770 * callback returns `true` for elements that have the properties of the given
7771 * object, else `false`.
7772 *
7773 * @static
7774 * @memberOf _
7775 * @alias select
7776 * @category Collection
7777 * @param {Array|Object|string} collection The collection to iterate over.
7778 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7779 * per iteration.
7780 * @param {*} [thisArg] The `this` binding of `predicate`.
7781 * @returns {Array} Returns the new filtered array.
7782 * @example
7783 *
7784 * _.filter([4, 5, 6], function(n) {
7785 * return n % 2 == 0;
7786 * });
7787 * // => [4, 6]
7788 *
7789 * var users = [
7790 * { 'user': 'barney', 'age': 36, 'active': true },
7791 * { 'user': 'fred', 'age': 40, 'active': false }
7792 * ];
7793 *
7794 * // using the `_.matches` callback shorthand
7795 * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
7796 * // => ['barney']
7797 *
7798 * // using the `_.matchesProperty` callback shorthand
7799 * _.pluck(_.filter(users, 'active', false), 'user');
7800 * // => ['fred']
7801 *
7802 * // using the `_.property` callback shorthand
7803 * _.pluck(_.filter(users, 'active'), 'user');
7804 * // => ['barney']
7805 */
7806 function filter(collection, predicate, thisArg) {
7807 var func = isArray(collection) ? arrayFilter : baseFilter;
7808 predicate = getCallback(predicate, thisArg, 3);
7809 return func(collection, predicate);
7810 }
7811
7812 /**
7813 * Iterates over elements of `collection`, returning the first element
7814 * `predicate` returns truthy for. The predicate is bound to `thisArg` and
7815 * invoked with three arguments: (value, index|key, collection).
7816 *
7817 * If a property name is provided for `predicate` the created `_.property`
7818 * style callback returns the property value of the given element.
7819 *
7820 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7821 * style callback returns `true` for elements that have a matching property
7822 * value, else `false`.
7823 *
7824 * If an object is provided for `predicate` the created `_.matches` style
7825 * callback returns `true` for elements that have the properties of the given
7826 * object, else `false`.
7827 *
7828 * @static
7829 * @memberOf _
7830 * @alias detect
7831 * @category Collection
7832 * @param {Array|Object|string} collection The collection to search.
7833 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7834 * per iteration.
7835 * @param {*} [thisArg] The `this` binding of `predicate`.
7836 * @returns {*} Returns the matched element, else `undefined`.
7837 * @example
7838 *
7839 * var users = [
7840 * { 'user': 'barney', 'age': 36, 'active': true },
7841 * { 'user': 'fred', 'age': 40, 'active': false },
7842 * { 'user': 'pebbles', 'age': 1, 'active': true }
7843 * ];
7844 *
7845 * _.result(_.find(users, function(chr) {
7846 * return chr.age < 40;
7847 * }), 'user');
7848 * // => 'barney'
7849 *
7850 * // using the `_.matches` callback shorthand
7851 * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');
7852 * // => 'pebbles'
7853 *
7854 * // using the `_.matchesProperty` callback shorthand
7855 * _.result(_.find(users, 'active', false), 'user');
7856 * // => 'fred'
7857 *
7858 * // using the `_.property` callback shorthand
7859 * _.result(_.find(users, 'active'), 'user');
7860 * // => 'barney'
7861 */
7862 var find = createFind(baseEach);
7863
7864 /**
7865 * This method is like `_.find` except that it iterates over elements of
7866 * `collection` from right to left.
7867 *
7868 * @static
7869 * @memberOf _
7870 * @category Collection
7871 * @param {Array|Object|string} collection The collection to search.
7872 * @param {Function|Object|string} [predicate=_.identity] The function invoked
7873 * per iteration.
7874 * @param {*} [thisArg] The `this` binding of `predicate`.
7875 * @returns {*} Returns the matched element, else `undefined`.
7876 * @example
7877 *
7878 * _.findLast([1, 2, 3, 4], function(n) {
7879 * return n % 2 == 1;
7880 * });
7881 * // => 3
7882 */
7883 var findLast = createFind(baseEachRight, true);
7884
7885 /**
7886 * Performs a deep comparison between each element in `collection` and the
7887 * source object, returning the first element that has equivalent property
7888 * values.
7889 *
7890 * **Note:** This method supports comparing arrays, booleans, `Date` objects,
7891 * numbers, `Object` objects, regexes, and strings. Objects are compared by
7892 * their own, not inherited, enumerable properties. For comparing a single
7893 * own or inherited property value see `_.matchesProperty`.
7894 *
7895 * @static
7896 * @memberOf _
7897 * @category Collection
7898 * @param {Array|Object|string} collection The collection to search.
7899 * @param {Object} source The object of property values to match.
7900 * @returns {*} Returns the matched element, else `undefined`.
7901 * @example
7902 *
7903 * var users = [
7904 * { 'user': 'barney', 'age': 36, 'active': true },
7905 * { 'user': 'fred', 'age': 40, 'active': false }
7906 * ];
7907 *
7908 * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
7909 * // => 'barney'
7910 *
7911 * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');
7912 * // => 'fred'
7913 */
7914 function findWhere(collection, source) {
7915 return find(collection, baseMatches(source));
7916 }
7917
7918 /**
7919 * Iterates over elements of `collection` invoking `iteratee` for each element.
7920 * The `iteratee` is bound to `thisArg` and invoked with three arguments:
7921 * (value, index|key, collection). Iteratee functions may exit iteration early
7922 * by explicitly returning `false`.
7923 *
7924 * **Note:** As with other "Collections" methods, objects with a "length" property
7925 * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
7926 * may be used for object iteration.
7927 *
7928 * @static
7929 * @memberOf _
7930 * @alias each
7931 * @category Collection
7932 * @param {Array|Object|string} collection The collection to iterate over.
7933 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
7934 * @param {*} [thisArg] The `this` binding of `iteratee`.
7935 * @returns {Array|Object|string} Returns `collection`.
7936 * @example
7937 *
7938 * _([1, 2]).forEach(function(n) {
7939 * console.log(n);
7940 * }).value();
7941 * // => logs each value from left to right and returns the array
7942 *
7943 * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
7944 * console.log(n, key);
7945 * });
7946 * // => logs each value-key pair and returns the object (iteration order is not guaranteed)
7947 */
7948 var forEach = createForEach(arrayEach, baseEach);
7949
7950 /**
7951 * This method is like `_.forEach` except that it iterates over elements of
7952 * `collection` from right to left.
7953 *
7954 * @static
7955 * @memberOf _
7956 * @alias eachRight
7957 * @category Collection
7958 * @param {Array|Object|string} collection The collection to iterate over.
7959 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
7960 * @param {*} [thisArg] The `this` binding of `iteratee`.
7961 * @returns {Array|Object|string} Returns `collection`.
7962 * @example
7963 *
7964 * _([1, 2]).forEachRight(function(n) {
7965 * console.log(n);
7966 * }).value();
7967 * // => logs each value from right to left and returns the array
7968 */
7969 var forEachRight = createForEach(arrayEachRight, baseEachRight);
7970
7971 /**
7972 * Creates an object composed of keys generated from the results of running
7973 * each element of `collection` through `iteratee`. The corresponding value
7974 * of each key is an array of the elements responsible for generating the key.
7975 * The `iteratee` is bound to `thisArg` and invoked with three arguments:
7976 * (value, index|key, collection).
7977 *
7978 * If a property name is provided for `iteratee` the created `_.property`
7979 * style callback returns the property value of the given element.
7980 *
7981 * If a value is also provided for `thisArg` the created `_.matchesProperty`
7982 * style callback returns `true` for elements that have a matching property
7983 * value, else `false`.
7984 *
7985 * If an object is provided for `iteratee` the created `_.matches` style
7986 * callback returns `true` for elements that have the properties of the given
7987 * object, else `false`.
7988 *
7989 * @static
7990 * @memberOf _
7991 * @category Collection
7992 * @param {Array|Object|string} collection The collection to iterate over.
7993 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
7994 * per iteration.
7995 * @param {*} [thisArg] The `this` binding of `iteratee`.
7996 * @returns {Object} Returns the composed aggregate object.
7997 * @example
7998 *
7999 * _.groupBy([4.2, 6.1, 6.4], function(n) {
8000 * return Math.floor(n);
8001 * });
8002 * // => { '4': [4.2], '6': [6.1, 6.4] }
8003 *
8004 * _.groupBy([4.2, 6.1, 6.4], function(n) {
8005 * return this.floor(n);
8006 * }, Math);
8007 * // => { '4': [4.2], '6': [6.1, 6.4] }
8008 *
8009 * // using the `_.property` callback shorthand
8010 * _.groupBy(['one', 'two', 'three'], 'length');
8011 * // => { '3': ['one', 'two'], '5': ['three'] }
8012 */
8013 var groupBy = createAggregator(function(result, value, key) {
8014 if (hasOwnProperty.call(result, key)) {
8015 result[key].push(value);
8016 } else {
8017 result[key] = [value];
8018 }
8019 });
8020
8021 /**
8022 * Checks if `value` is in `collection` using `SameValueZero` for equality
8023 * comparisons. If `fromIndex` is negative, it is used as the offset from
8024 * the end of `collection`.
8025 *
8026 * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
8027 * comparisons are like strict equality comparisons, e.g. `===`, except that
8028 * `NaN` matches `NaN`.
8029 *
8030 * @static
8031 * @memberOf _
8032 * @alias contains, include
8033 * @category Collection
8034 * @param {Array|Object|string} collection The collection to search.
8035 * @param {*} target The value to search for.
8036 * @param {number} [fromIndex=0] The index to search from.
8037 * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
8038 * @returns {boolean} Returns `true` if a matching element is found, else `false`.
8039 * @example
8040 *
8041 * _.includes([1, 2, 3], 1);
8042 * // => true
8043 *
8044 * _.includes([1, 2, 3], 1, 2);
8045 * // => false
8046 *
8047 * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
8048 * // => true
8049 *
8050 * _.includes('pebbles', 'eb');
8051 * // => true
8052 */
8053 function includes(collection, target, fromIndex, guard) {
8054 var length = collection ? getLength(collection) : 0;
8055 if (!isLength(length)) {
8056 collection = values(collection);
8057 length = collection.length;
8058 }
8059 if (!length) {
8060 return false;
8061 }
8062 if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
8063 fromIndex = 0;
8064 } else {
8065 fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
8066 }
8067 return (typeof collection == 'string' || !isArray(collection) && isString(collection))
8068 ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1)
8069 : (getIndexOf(collection, target, fromIndex) > -1);
8070 }
8071
8072 /**
8073 * Creates an object composed of keys generated from the results of running
8074 * each element of `collection` through `iteratee`. The corresponding value
8075 * of each key is the last element responsible for generating the key. The
8076 * iteratee function is bound to `thisArg` and invoked with three arguments:
8077 * (value, index|key, collection).
8078 *
8079 * If a property name is provided for `iteratee` the created `_.property`
8080 * style callback returns the property value of the given element.
8081 *
8082 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8083 * style callback returns `true` for elements that have a matching property
8084 * value, else `false`.
8085 *
8086 * If an object is provided for `iteratee` the created `_.matches` style
8087 * callback returns `true` for elements that have the properties of the given
8088 * object, else `false`.
8089 *
8090 * @static
8091 * @memberOf _
8092 * @category Collection
8093 * @param {Array|Object|string} collection The collection to iterate over.
8094 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
8095 * per iteration.
8096 * @param {*} [thisArg] The `this` binding of `iteratee`.
8097 * @returns {Object} Returns the composed aggregate object.
8098 * @example
8099 *
8100 * var keyData = [
8101 * { 'dir': 'left', 'code': 97 },
8102 * { 'dir': 'right', 'code': 100 }
8103 * ];
8104 *
8105 * _.indexBy(keyData, 'dir');
8106 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
8107 *
8108 * _.indexBy(keyData, function(object) {
8109 * return String.fromCharCode(object.code);
8110 * });
8111 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
8112 *
8113 * _.indexBy(keyData, function(object) {
8114 * return this.fromCharCode(object.code);
8115 * }, String);
8116 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
8117 */
8118 var indexBy = createAggregator(function(result, value, key) {
8119 result[key] = value;
8120 });
8121
8122 /**
8123 * Invokes the method at `path` on each element in `collection`, returning
8124 * an array of the results of each invoked method. Any additional arguments
8125 * are provided to each invoked method. If `methodName` is a function it is
8126 * invoked for, and `this` bound to, each element in `collection`.
8127 *
8128 * @static
8129 * @memberOf _
8130 * @category Collection
8131 * @param {Array|Object|string} collection The collection to iterate over.
8132 * @param {Array|Function|string} path The path of the method to invoke or
8133 * the function invoked per iteration.
8134 * @param {...*} [args] The arguments to invoke the method with.
8135 * @returns {Array} Returns the array of results.
8136 * @example
8137 *
8138 * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
8139 * // => [[1, 5, 7], [1, 2, 3]]
8140 *
8141 * _.invoke([123, 456], String.prototype.split, '');
8142 * // => [['1', '2', '3'], ['4', '5', '6']]
8143 */
8144 var invoke = restParam(function(collection, path, args) {
8145 var index = -1,
8146 isFunc = typeof path == 'function',
8147 isProp = isKey(path),
8148 length = getLength(collection),
8149 result = isLength(length) ? Array(length) : [];
8150
8151 baseEach(collection, function(value) {
8152 var func = isFunc ? path : (isProp && value != null && value[path]);
8153 result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
8154 });
8155 return result;
8156 });
8157
8158 /**
8159 * Creates an array of values by running each element in `collection` through
8160 * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
8161 * arguments: (value, index|key, collection).
8162 *
8163 * If a property name is provided for `iteratee` the created `_.property`
8164 * style callback returns the property value of the given element.
8165 *
8166 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8167 * style callback returns `true` for elements that have a matching property
8168 * value, else `false`.
8169 *
8170 * If an object is provided for `iteratee` the created `_.matches` style
8171 * callback returns `true` for elements that have the properties of the given
8172 * object, else `false`.
8173 *
8174 * Many lodash methods are guarded to work as interatees for methods like
8175 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
8176 *
8177 * The guarded methods are:
8178 * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,
8179 * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,
8180 * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,
8181 * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`
8182 *
8183 * @static
8184 * @memberOf _
8185 * @alias collect
8186 * @category Collection
8187 * @param {Array|Object|string} collection The collection to iterate over.
8188 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
8189 * per iteration.
8190 * @param {*} [thisArg] The `this` binding of `iteratee`.
8191 * @returns {Array} Returns the new mapped array.
8192 * @example
8193 *
8194 * function timesThree(n) {
8195 * return n * 3;
8196 * }
8197 *
8198 * _.map([1, 2], timesThree);
8199 * // => [3, 6]
8200 *
8201 * _.map({ 'a': 1, 'b': 2 }, timesThree);
8202 * // => [3, 6] (iteration order is not guaranteed)
8203 *
8204 * var users = [
8205 * { 'user': 'barney' },
8206 * { 'user': 'fred' }
8207 * ];
8208 *
8209 * // using the `_.property` callback shorthand
8210 * _.map(users, 'user');
8211 * // => ['barney', 'fred']
8212 */
8213 function map(collection, iteratee, thisArg) {
8214 var func = isArray(collection) ? arrayMap : baseMap;
8215 iteratee = getCallback(iteratee, thisArg, 3);
8216 return func(collection, iteratee);
8217 }
8218
8219 /**
8220 * Creates an array of elements split into two groups, the first of which
8221 * contains elements `predicate` returns truthy for, while the second of which
8222 * contains elements `predicate` returns falsey for. The predicate is bound
8223 * to `thisArg` and invoked with three arguments: (value, index|key, collection).
8224 *
8225 * If a property name is provided for `predicate` the created `_.property`
8226 * style callback returns the property value of the given element.
8227 *
8228 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8229 * style callback returns `true` for elements that have a matching property
8230 * value, else `false`.
8231 *
8232 * If an object is provided for `predicate` the created `_.matches` style
8233 * callback returns `true` for elements that have the properties of the given
8234 * object, else `false`.
8235 *
8236 * @static
8237 * @memberOf _
8238 * @category Collection
8239 * @param {Array|Object|string} collection The collection to iterate over.
8240 * @param {Function|Object|string} [predicate=_.identity] The function invoked
8241 * per iteration.
8242 * @param {*} [thisArg] The `this` binding of `predicate`.
8243 * @returns {Array} Returns the array of grouped elements.
8244 * @example
8245 *
8246 * _.partition([1, 2, 3], function(n) {
8247 * return n % 2;
8248 * });
8249 * // => [[1, 3], [2]]
8250 *
8251 * _.partition([1.2, 2.3, 3.4], function(n) {
8252 * return this.floor(n) % 2;
8253 * }, Math);
8254 * // => [[1.2, 3.4], [2.3]]
8255 *
8256 * var users = [
8257 * { 'user': 'barney', 'age': 36, 'active': false },
8258 * { 'user': 'fred', 'age': 40, 'active': true },
8259 * { 'user': 'pebbles', 'age': 1, 'active': false }
8260 * ];
8261 *
8262 * var mapper = function(array) {
8263 * return _.pluck(array, 'user');
8264 * };
8265 *
8266 * // using the `_.matches` callback shorthand
8267 * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);
8268 * // => [['pebbles'], ['barney', 'fred']]
8269 *
8270 * // using the `_.matchesProperty` callback shorthand
8271 * _.map(_.partition(users, 'active', false), mapper);
8272 * // => [['barney', 'pebbles'], ['fred']]
8273 *
8274 * // using the `_.property` callback shorthand
8275 * _.map(_.partition(users, 'active'), mapper);
8276 * // => [['fred'], ['barney', 'pebbles']]
8277 */
8278 var partition = createAggregator(function(result, value, key) {
8279 result[key ? 0 : 1].push(value);
8280 }, function() { return [[], []]; });
8281
8282 /**
8283 * Gets the property value of `path` from all elements in `collection`.
8284 *
8285 * @static
8286 * @memberOf _
8287 * @category Collection
8288 * @param {Array|Object|string} collection The collection to iterate over.
8289 * @param {Array|string} path The path of the property to pluck.
8290 * @returns {Array} Returns the property values.
8291 * @example
8292 *
8293 * var users = [
8294 * { 'user': 'barney', 'age': 36 },
8295 * { 'user': 'fred', 'age': 40 }
8296 * ];
8297 *
8298 * _.pluck(users, 'user');
8299 * // => ['barney', 'fred']
8300 *
8301 * var userIndex = _.indexBy(users, 'user');
8302 * _.pluck(userIndex, 'age');
8303 * // => [36, 40] (iteration order is not guaranteed)
8304 */
8305 function pluck(collection, path) {
8306 return map(collection, property(path));
8307 }
8308
8309 /**
8310 * Reduces `collection` to a value which is the accumulated result of running
8311 * each element in `collection` through `iteratee`, where each successive
8312 * invocation is supplied the return value of the previous. If `accumulator`
8313 * is not provided the first element of `collection` is used as the initial
8314 * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
8315 * (accumulator, value, index|key, collection).
8316 *
8317 * Many lodash methods are guarded to work as interatees for methods like
8318 * `_.reduce`, `_.reduceRight`, and `_.transform`.
8319 *
8320 * The guarded methods are:
8321 * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`
8322 *
8323 * @static
8324 * @memberOf _
8325 * @alias foldl, inject
8326 * @category Collection
8327 * @param {Array|Object|string} collection The collection to iterate over.
8328 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
8329 * @param {*} [accumulator] The initial value.
8330 * @param {*} [thisArg] The `this` binding of `iteratee`.
8331 * @returns {*} Returns the accumulated value.
8332 * @example
8333 *
8334 * _.reduce([1, 2], function(total, n) {
8335 * return total + n;
8336 * });
8337 * // => 3
8338 *
8339 * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {
8340 * result[key] = n * 3;
8341 * return result;
8342 * }, {});
8343 * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
8344 */
8345 var reduce = createReduce(arrayReduce, baseEach);
8346
8347 /**
8348 * This method is like `_.reduce` except that it iterates over elements of
8349 * `collection` from right to left.
8350 *
8351 * @static
8352 * @memberOf _
8353 * @alias foldr
8354 * @category Collection
8355 * @param {Array|Object|string} collection The collection to iterate over.
8356 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
8357 * @param {*} [accumulator] The initial value.
8358 * @param {*} [thisArg] The `this` binding of `iteratee`.
8359 * @returns {*} Returns the accumulated value.
8360 * @example
8361 *
8362 * var array = [[0, 1], [2, 3], [4, 5]];
8363 *
8364 * _.reduceRight(array, function(flattened, other) {
8365 * return flattened.concat(other);
8366 * }, []);
8367 * // => [4, 5, 2, 3, 0, 1]
8368 */
8369 var reduceRight = createReduce(arrayReduceRight, baseEachRight);
8370
8371 /**
8372 * The opposite of `_.filter`; this method returns the elements of `collection`
8373 * that `predicate` does **not** return truthy for.
8374 *
8375 * If a property name is provided for `predicate` the created `_.property`
8376 * style callback returns the property value of the given element.
8377 *
8378 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8379 * style callback returns `true` for elements that have a matching property
8380 * value, else `false`.
8381 *
8382 * If an object is provided for `predicate` the created `_.matches` style
8383 * callback returns `true` for elements that have the properties of the given
8384 * object, else `false`.
8385 *
8386 * @static
8387 * @memberOf _
8388 * @category Collection
8389 * @param {Array|Object|string} collection The collection to iterate over.
8390 * @param {Function|Object|string} [predicate=_.identity] The function invoked
8391 * per iteration.
8392 * @param {*} [thisArg] The `this` binding of `predicate`.
8393 * @returns {Array} Returns the new filtered array.
8394 * @example
8395 *
8396 * _.reject([1, 2, 3, 4], function(n) {
8397 * return n % 2 == 0;
8398 * });
8399 * // => [1, 3]
8400 *
8401 * var users = [
8402 * { 'user': 'barney', 'age': 36, 'active': false },
8403 * { 'user': 'fred', 'age': 40, 'active': true }
8404 * ];
8405 *
8406 * // using the `_.matches` callback shorthand
8407 * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');
8408 * // => ['barney']
8409 *
8410 * // using the `_.matchesProperty` callback shorthand
8411 * _.pluck(_.reject(users, 'active', false), 'user');
8412 * // => ['fred']
8413 *
8414 * // using the `_.property` callback shorthand
8415 * _.pluck(_.reject(users, 'active'), 'user');
8416 * // => ['barney']
8417 */
8418 function reject(collection, predicate, thisArg) {
8419 var func = isArray(collection) ? arrayFilter : baseFilter;
8420 predicate = getCallback(predicate, thisArg, 3);
8421 return func(collection, function(value, index, collection) {
8422 return !predicate(value, index, collection);
8423 });
8424 }
8425
8426 /**
8427 * Gets a random element or `n` random elements from a collection.
8428 *
8429 * @static
8430 * @memberOf _
8431 * @category Collection
8432 * @param {Array|Object|string} collection The collection to sample.
8433 * @param {number} [n] The number of elements to sample.
8434 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
8435 * @returns {*} Returns the random sample(s).
8436 * @example
8437 *
8438 * _.sample([1, 2, 3, 4]);
8439 * // => 2
8440 *
8441 * _.sample([1, 2, 3, 4], 2);
8442 * // => [3, 1]
8443 */
8444 function sample(collection, n, guard) {
8445 if (guard ? isIterateeCall(collection, n, guard) : n == null) {
8446 collection = toIterable(collection);
8447 var length = collection.length;
8448 return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
8449 }
8450 var result = shuffle(collection);
8451 result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length);
8452 return result;
8453 }
8454
8455 /**
8456 * Creates an array of shuffled values, using a version of the
8457 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
8458 *
8459 * @static
8460 * @memberOf _
8461 * @category Collection
8462 * @param {Array|Object|string} collection The collection to shuffle.
8463 * @returns {Array} Returns the new shuffled array.
8464 * @example
8465 *
8466 * _.shuffle([1, 2, 3, 4]);
8467 * // => [4, 1, 3, 2]
8468 */
8469 function shuffle(collection) {
8470 collection = toIterable(collection);
8471
8472 var index = -1,
8473 length = collection.length,
8474 result = Array(length);
8475
8476 while (++index < length) {
8477 var rand = baseRandom(0, index);
8478 if (index != rand) {
8479 result[index] = result[rand];
8480 }
8481 result[rand] = collection[index];
8482 }
8483 return result;
8484 }
8485
8486 /**
8487 * Gets the size of `collection` by returning its length for array-like
8488 * values or the number of own enumerable properties for objects.
8489 *
8490 * @static
8491 * @memberOf _
8492 * @category Collection
8493 * @param {Array|Object|string} collection The collection to inspect.
8494 * @returns {number} Returns the size of `collection`.
8495 * @example
8496 *
8497 * _.size([1, 2, 3]);
8498 * // => 3
8499 *
8500 * _.size({ 'a': 1, 'b': 2 });
8501 * // => 2
8502 *
8503 * _.size('pebbles');
8504 * // => 7
8505 */
8506 function size(collection) {
8507 var length = collection ? getLength(collection) : 0;
8508 return isLength(length) ? length : keys(collection).length;
8509 }
8510
8511 /**
8512 * Checks if `predicate` returns truthy for **any** element of `collection`.
8513 * The function returns as soon as it finds a passing value and does not iterate
8514 * over the entire collection. The predicate is bound to `thisArg` and invoked
8515 * with three arguments: (value, index|key, collection).
8516 *
8517 * If a property name is provided for `predicate` the created `_.property`
8518 * style callback returns the property value of the given element.
8519 *
8520 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8521 * style callback returns `true` for elements that have a matching property
8522 * value, else `false`.
8523 *
8524 * If an object is provided for `predicate` the created `_.matches` style
8525 * callback returns `true` for elements that have the properties of the given
8526 * object, else `false`.
8527 *
8528 * @static
8529 * @memberOf _
8530 * @alias any
8531 * @category Collection
8532 * @param {Array|Object|string} collection The collection to iterate over.
8533 * @param {Function|Object|string} [predicate=_.identity] The function invoked
8534 * per iteration.
8535 * @param {*} [thisArg] The `this` binding of `predicate`.
8536 * @returns {boolean} Returns `true` if any element passes the predicate check,
8537 * else `false`.
8538 * @example
8539 *
8540 * _.some([null, 0, 'yes', false], Boolean);
8541 * // => true
8542 *
8543 * var users = [
8544 * { 'user': 'barney', 'active': true },
8545 * { 'user': 'fred', 'active': false }
8546 * ];
8547 *
8548 * // using the `_.matches` callback shorthand
8549 * _.some(users, { 'user': 'barney', 'active': false });
8550 * // => false
8551 *
8552 * // using the `_.matchesProperty` callback shorthand
8553 * _.some(users, 'active', false);
8554 * // => true
8555 *
8556 * // using the `_.property` callback shorthand
8557 * _.some(users, 'active');
8558 * // => true
8559 */
8560 function some(collection, predicate, thisArg) {
8561 var func = isArray(collection) ? arraySome : baseSome;
8562 if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
8563 predicate = null;
8564 }
8565 if (typeof predicate != 'function' || thisArg !== undefined) {
8566 predicate = getCallback(predicate, thisArg, 3);
8567 }
8568 return func(collection, predicate);
8569 }
8570
8571 /**
8572 * Creates an array of elements, sorted in ascending order by the results of
8573 * running each element in a collection through `iteratee`. This method performs
8574 * a stable sort, that is, it preserves the original sort order of equal elements.
8575 * The `iteratee` is bound to `thisArg` and invoked with three arguments:
8576 * (value, index|key, collection).
8577 *
8578 * If a property name is provided for `iteratee` the created `_.property`
8579 * style callback returns the property value of the given element.
8580 *
8581 * If a value is also provided for `thisArg` the created `_.matchesProperty`
8582 * style callback returns `true` for elements that have a matching property
8583 * value, else `false`.
8584 *
8585 * If an object is provided for `iteratee` the created `_.matches` style
8586 * callback returns `true` for elements that have the properties of the given
8587 * object, else `false`.
8588 *
8589 * @static
8590 * @memberOf _
8591 * @category Collection
8592 * @param {Array|Object|string} collection The collection to iterate over.
8593 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
8594 * per iteration.
8595 * @param {*} [thisArg] The `this` binding of `iteratee`.
8596 * @returns {Array} Returns the new sorted array.
8597 * @example
8598 *
8599 * _.sortBy([1, 2, 3], function(n) {
8600 * return Math.sin(n);
8601 * });
8602 * // => [3, 1, 2]
8603 *
8604 * _.sortBy([1, 2, 3], function(n) {
8605 * return this.sin(n);
8606 * }, Math);
8607 * // => [3, 1, 2]
8608 *
8609 * var users = [
8610 * { 'user': 'fred' },
8611 * { 'user': 'pebbles' },
8612 * { 'user': 'barney' }
8613 * ];
8614 *
8615 * // using the `_.property` callback shorthand
8616 * _.pluck(_.sortBy(users, 'user'), 'user');
8617 * // => ['barney', 'fred', 'pebbles']
8618 */
8619 function sortBy(collection, iteratee, thisArg) {
8620 if (collection == null) {
8621 return [];
8622 }
8623 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
8624 iteratee = null;
8625 }
8626 var index = -1;
8627 iteratee = getCallback(iteratee, thisArg, 3);
8628
8629 var result = baseMap(collection, function(value, key, collection) {
8630 return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
8631 });
8632 return baseSortBy(result, compareAscending);
8633 }
8634
8635 /**
8636 * This method is like `_.sortBy` except that it can sort by multiple iteratees
8637 * or property names.
8638 *
8639 * If a property name is provided for an iteratee the created `_.property`
8640 * style callback returns the property value of the given element.
8641 *
8642 * If an object is provided for an iteratee the created `_.matches` style
8643 * callback returns `true` for elements that have the properties of the given
8644 * object, else `false`.
8645 *
8646 * @static
8647 * @memberOf _
8648 * @category Collection
8649 * @param {Array|Object|string} collection The collection to iterate over.
8650 * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
8651 * The iteratees to sort by, specified as individual values or arrays of values.
8652 * @returns {Array} Returns the new sorted array.
8653 * @example
8654 *
8655 * var users = [
8656 * { 'user': 'fred', 'age': 48 },
8657 * { 'user': 'barney', 'age': 36 },
8658 * { 'user': 'fred', 'age': 42 },
8659 * { 'user': 'barney', 'age': 34 }
8660 * ];
8661 *
8662 * _.map(_.sortByAll(users, ['user', 'age']), _.values);
8663 * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
8664 *
8665 * _.map(_.sortByAll(users, 'user', function(chr) {
8666 * return Math.floor(chr.age / 10);
8667 * }), _.values);
8668 * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
8669 */
8670 var sortByAll = restParam(function(collection, iteratees) {
8671 if (collection == null) {
8672 return [];
8673 }
8674 var guard = iteratees[2];
8675 if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
8676 iteratees.length = 1;
8677 }
8678 return baseSortByOrder(collection, baseFlatten(iteratees), []);
8679 });
8680
8681 /**
8682 * This method is like `_.sortByAll` except that it allows specifying the
8683 * sort orders of the iteratees to sort by. A truthy value in `orders` will
8684 * sort the corresponding property name in ascending order while a falsey
8685 * value will sort it in descending order.
8686 *
8687 * If a property name is provided for an iteratee the created `_.property`
8688 * style callback returns the property value of the given element.
8689 *
8690 * If an object is provided for an iteratee the created `_.matches` style
8691 * callback returns `true` for elements that have the properties of the given
8692 * object, else `false`.
8693 *
8694 * @static
8695 * @memberOf _
8696 * @category Collection
8697 * @param {Array|Object|string} collection The collection to iterate over.
8698 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
8699 * @param {boolean[]} orders The sort orders of `iteratees`.
8700 * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
8701 * @returns {Array} Returns the new sorted array.
8702 * @example
8703 *
8704 * var users = [
8705 * { 'user': 'fred', 'age': 48 },
8706 * { 'user': 'barney', 'age': 34 },
8707 * { 'user': 'fred', 'age': 42 },
8708 * { 'user': 'barney', 'age': 36 }
8709 * ];
8710 *
8711 * // sort by `user` in ascending order and by `age` in descending order
8712 * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values);
8713 * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
8714 */
8715 function sortByOrder(collection, iteratees, orders, guard) {
8716 if (collection == null) {
8717 return [];
8718 }
8719 if (guard && isIterateeCall(iteratees, orders, guard)) {
8720 orders = null;
8721 }
8722 if (!isArray(iteratees)) {
8723 iteratees = iteratees == null ? [] : [iteratees];
8724 }
8725 if (!isArray(orders)) {
8726 orders = orders == null ? [] : [orders];
8727 }
8728 return baseSortByOrder(collection, iteratees, orders);
8729 }
8730
8731 /**
8732 * Performs a deep comparison between each element in `collection` and the
8733 * source object, returning an array of all elements that have equivalent
8734 * property values.
8735 *
8736 * **Note:** This method supports comparing arrays, booleans, `Date` objects,
8737 * numbers, `Object` objects, regexes, and strings. Objects are compared by
8738 * their own, not inherited, enumerable properties. For comparing a single
8739 * own or inherited property value see `_.matchesProperty`.
8740 *
8741 * @static
8742 * @memberOf _
8743 * @category Collection
8744 * @param {Array|Object|string} collection The collection to search.
8745 * @param {Object} source The object of property values to match.
8746 * @returns {Array} Returns the new filtered array.
8747 * @example
8748 *
8749 * var users = [
8750 * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },
8751 * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }
8752 * ];
8753 *
8754 * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');
8755 * // => ['barney']
8756 *
8757 * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');
8758 * // => ['fred']
8759 */
8760 function where(collection, source) {
8761 return filter(collection, baseMatches(source));
8762 }
8763
8764 /*------------------------------------------------------------------------*/
8765
8766 /**
8767 * Gets the number of milliseconds that have elapsed since the Unix epoch
8768 * (1 January 1970 00:00:00 UTC).
8769 *
8770 * @static
8771 * @memberOf _
8772 * @category Date
8773 * @example
8774 *
8775 * _.defer(function(stamp) {
8776 * console.log(_.now() - stamp);
8777 * }, _.now());
8778 * // => logs the number of milliseconds it took for the deferred function to be invoked
8779 */
8780 var now = nativeNow || function() {
8781 return new Date().getTime();
8782 };
8783
8784 /*------------------------------------------------------------------------*/
8785
8786 /**
8787 * The opposite of `_.before`; this method creates a function that invokes
8788 * `func` once it is called `n` or more times.
8789 *
8790 * @static
8791 * @memberOf _
8792 * @category Function
8793 * @param {number} n The number of calls before `func` is invoked.
8794 * @param {Function} func The function to restrict.
8795 * @returns {Function} Returns the new restricted function.
8796 * @example
8797 *
8798 * var saves = ['profile', 'settings'];
8799 *
8800 * var done = _.after(saves.length, function() {
8801 * console.log('done saving!');
8802 * });
8803 *
8804 * _.forEach(saves, function(type) {
8805 * asyncSave({ 'type': type, 'complete': done });
8806 * });
8807 * // => logs 'done saving!' after the two async saves have completed
8808 */
8809 function after(n, func) {
8810 if (typeof func != 'function') {
8811 if (typeof n == 'function') {
8812 var temp = n;
8813 n = func;
8814 func = temp;
8815 } else {
8816 throw new TypeError(FUNC_ERROR_TEXT);
8817 }
8818 }
8819 n = nativeIsFinite(n = +n) ? n : 0;
8820 return function() {
8821 if (--n < 1) {
8822 return func.apply(this, arguments);
8823 }
8824 };
8825 }
8826
8827 /**
8828 * Creates a function that accepts up to `n` arguments ignoring any
8829 * additional arguments.
8830 *
8831 * @static
8832 * @memberOf _
8833 * @category Function
8834 * @param {Function} func The function to cap arguments for.
8835 * @param {number} [n=func.length] The arity cap.
8836 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
8837 * @returns {Function} Returns the new function.
8838 * @example
8839 *
8840 * _.map(['6', '8', '10'], _.ary(parseInt, 1));
8841 * // => [6, 8, 10]
8842 */
8843 function ary(func, n, guard) {
8844 if (guard && isIterateeCall(func, n, guard)) {
8845 n = null;
8846 }
8847 n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);
8848 return createWrapper(func, ARY_FLAG, null, null, null, null, n);
8849 }
8850
8851 /**
8852 * Creates a function that invokes `func`, with the `this` binding and arguments
8853 * of the created function, while it is called less than `n` times. Subsequent
8854 * calls to the created function return the result of the last `func` invocation.
8855 *
8856 * @static
8857 * @memberOf _
8858 * @category Function
8859 * @param {number} n The number of calls at which `func` is no longer invoked.
8860 * @param {Function} func The function to restrict.
8861 * @returns {Function} Returns the new restricted function.
8862 * @example
8863 *
8864 * jQuery('#add').on('click', _.before(5, addContactToList));
8865 * // => allows adding up to 4 contacts to the list
8866 */
8867 function before(n, func) {
8868 var result;
8869 if (typeof func != 'function') {
8870 if (typeof n == 'function') {
8871 var temp = n;
8872 n = func;
8873 func = temp;
8874 } else {
8875 throw new TypeError(FUNC_ERROR_TEXT);
8876 }
8877 }
8878 return function() {
8879 if (--n > 0) {
8880 result = func.apply(this, arguments);
8881 }
8882 if (n <= 1) {
8883 func = null;
8884 }
8885 return result;
8886 };
8887 }
8888
8889 /**
8890 * Creates a function that invokes `func` with the `this` binding of `thisArg`
8891 * and prepends any additional `_.bind` arguments to those provided to the
8892 * bound function.
8893 *
8894 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
8895 * may be used as a placeholder for partially applied arguments.
8896 *
8897 * **Note:** Unlike native `Function#bind` this method does not set the "length"
8898 * property of bound functions.
8899 *
8900 * @static
8901 * @memberOf _
8902 * @category Function
8903 * @param {Function} func The function to bind.
8904 * @param {*} thisArg The `this` binding of `func`.
8905 * @param {...*} [partials] The arguments to be partially applied.
8906 * @returns {Function} Returns the new bound function.
8907 * @example
8908 *
8909 * var greet = function(greeting, punctuation) {
8910 * return greeting + ' ' + this.user + punctuation;
8911 * };
8912 *
8913 * var object = { 'user': 'fred' };
8914 *
8915 * var bound = _.bind(greet, object, 'hi');
8916 * bound('!');
8917 * // => 'hi fred!'
8918 *
8919 * // using placeholders
8920 * var bound = _.bind(greet, object, _, '!');
8921 * bound('hi');
8922 * // => 'hi fred!'
8923 */
8924 var bind = restParam(function(func, thisArg, partials) {
8925 var bitmask = BIND_FLAG;
8926 if (partials.length) {
8927 var holders = replaceHolders(partials, bind.placeholder);
8928 bitmask |= PARTIAL_FLAG;
8929 }
8930 return createWrapper(func, bitmask, thisArg, partials, holders);
8931 });
8932
8933 /**
8934 * Binds methods of an object to the object itself, overwriting the existing
8935 * method. Method names may be specified as individual arguments or as arrays
8936 * of method names. If no method names are provided all enumerable function
8937 * properties, own and inherited, of `object` are bound.
8938 *
8939 * **Note:** This method does not set the "length" property of bound functions.
8940 *
8941 * @static
8942 * @memberOf _
8943 * @category Function
8944 * @param {Object} object The object to bind and assign the bound methods to.
8945 * @param {...(string|string[])} [methodNames] The object method names to bind,
8946 * specified as individual method names or arrays of method names.
8947 * @returns {Object} Returns `object`.
8948 * @example
8949 *
8950 * var view = {
8951 * 'label': 'docs',
8952 * 'onClick': function() {
8953 * console.log('clicked ' + this.label);
8954 * }
8955 * };
8956 *
8957 * _.bindAll(view);
8958 * jQuery('#docs').on('click', view.onClick);
8959 * // => logs 'clicked docs' when the element is clicked
8960 */
8961 var bindAll = restParam(function(object, methodNames) {
8962 methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
8963
8964 var index = -1,
8965 length = methodNames.length;
8966
8967 while (++index < length) {
8968 var key = methodNames[index];
8969 object[key] = createWrapper(object[key], BIND_FLAG, object);
8970 }
8971 return object;
8972 });
8973
8974 /**
8975 * Creates a function that invokes the method at `object[key]` and prepends
8976 * any additional `_.bindKey` arguments to those provided to the bound function.
8977 *
8978 * This method differs from `_.bind` by allowing bound functions to reference
8979 * methods that may be redefined or don't yet exist.
8980 * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
8981 * for more details.
8982 *
8983 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
8984 * builds, may be used as a placeholder for partially applied arguments.
8985 *
8986 * @static
8987 * @memberOf _
8988 * @category Function
8989 * @param {Object} object The object the method belongs to.
8990 * @param {string} key The key of the method.
8991 * @param {...*} [partials] The arguments to be partially applied.
8992 * @returns {Function} Returns the new bound function.
8993 * @example
8994 *
8995 * var object = {
8996 * 'user': 'fred',
8997 * 'greet': function(greeting, punctuation) {
8998 * return greeting + ' ' + this.user + punctuation;
8999 * }
9000 * };
9001 *
9002 * var bound = _.bindKey(object, 'greet', 'hi');
9003 * bound('!');
9004 * // => 'hi fred!'
9005 *
9006 * object.greet = function(greeting, punctuation) {
9007 * return greeting + 'ya ' + this.user + punctuation;
9008 * };
9009 *
9010 * bound('!');
9011 * // => 'hiya fred!'
9012 *
9013 * // using placeholders
9014 * var bound = _.bindKey(object, 'greet', _, '!');
9015 * bound('hi');
9016 * // => 'hiya fred!'
9017 */
9018 var bindKey = restParam(function(object, key, partials) {
9019 var bitmask = BIND_FLAG | BIND_KEY_FLAG;
9020 if (partials.length) {
9021 var holders = replaceHolders(partials, bindKey.placeholder);
9022 bitmask |= PARTIAL_FLAG;
9023 }
9024 return createWrapper(key, bitmask, object, partials, holders);
9025 });
9026
9027 /**
9028 * Creates a function that accepts one or more arguments of `func` that when
9029 * called either invokes `func` returning its result, if all `func` arguments
9030 * have been provided, or returns a function that accepts one or more of the
9031 * remaining `func` arguments, and so on. The arity of `func` may be specified
9032 * if `func.length` is not sufficient.
9033 *
9034 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
9035 * may be used as a placeholder for provided arguments.
9036 *
9037 * **Note:** This method does not set the "length" property of curried functions.
9038 *
9039 * @static
9040 * @memberOf _
9041 * @category Function
9042 * @param {Function} func The function to curry.
9043 * @param {number} [arity=func.length] The arity of `func`.
9044 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
9045 * @returns {Function} Returns the new curried function.
9046 * @example
9047 *
9048 * var abc = function(a, b, c) {
9049 * return [a, b, c];
9050 * };
9051 *
9052 * var curried = _.curry(abc);
9053 *
9054 * curried(1)(2)(3);
9055 * // => [1, 2, 3]
9056 *
9057 * curried(1, 2)(3);
9058 * // => [1, 2, 3]
9059 *
9060 * curried(1, 2, 3);
9061 * // => [1, 2, 3]
9062 *
9063 * // using placeholders
9064 * curried(1)(_, 3)(2);
9065 * // => [1, 2, 3]
9066 */
9067 var curry = createCurry(CURRY_FLAG);
9068
9069 /**
9070 * This method is like `_.curry` except that arguments are applied to `func`
9071 * in the manner of `_.partialRight` instead of `_.partial`.
9072 *
9073 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
9074 * builds, may be used as a placeholder for provided arguments.
9075 *
9076 * **Note:** This method does not set the "length" property of curried functions.
9077 *
9078 * @static
9079 * @memberOf _
9080 * @category Function
9081 * @param {Function} func The function to curry.
9082 * @param {number} [arity=func.length] The arity of `func`.
9083 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
9084 * @returns {Function} Returns the new curried function.
9085 * @example
9086 *
9087 * var abc = function(a, b, c) {
9088 * return [a, b, c];
9089 * };
9090 *
9091 * var curried = _.curryRight(abc);
9092 *
9093 * curried(3)(2)(1);
9094 * // => [1, 2, 3]
9095 *
9096 * curried(2, 3)(1);
9097 * // => [1, 2, 3]
9098 *
9099 * curried(1, 2, 3);
9100 * // => [1, 2, 3]
9101 *
9102 * // using placeholders
9103 * curried(3)(1, _)(2);
9104 * // => [1, 2, 3]
9105 */
9106 var curryRight = createCurry(CURRY_RIGHT_FLAG);
9107
9108 /**
9109 * Creates a function that delays invoking `func` until after `wait` milliseconds
9110 * have elapsed since the last time it was invoked. The created function comes
9111 * with a `cancel` method to cancel delayed invocations. Provide an options
9112 * object to indicate that `func` should be invoked on the leading and/or
9113 * trailing edge of the `wait` timeout. Subsequent calls to the debounced
9114 * function return the result of the last `func` invocation.
9115 *
9116 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
9117 * on the trailing edge of the timeout only if the the debounced function is
9118 * invoked more than once during the `wait` timeout.
9119 *
9120 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
9121 * for details over the differences between `_.debounce` and `_.throttle`.
9122 *
9123 * @static
9124 * @memberOf _
9125 * @category Function
9126 * @param {Function} func The function to debounce.
9127 * @param {number} [wait=0] The number of milliseconds to delay.
9128 * @param {Object} [options] The options object.
9129 * @param {boolean} [options.leading=false] Specify invoking on the leading
9130 * edge of the timeout.
9131 * @param {number} [options.maxWait] The maximum time `func` is allowed to be
9132 * delayed before it is invoked.
9133 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
9134 * edge of the timeout.
9135 * @returns {Function} Returns the new debounced function.
9136 * @example
9137 *
9138 * // avoid costly calculations while the window size is in flux
9139 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
9140 *
9141 * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
9142 * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
9143 * 'leading': true,
9144 * 'trailing': false
9145 * }));
9146 *
9147 * // ensure `batchLog` is invoked once after 1 second of debounced calls
9148 * var source = new EventSource('/stream');
9149 * jQuery(source).on('message', _.debounce(batchLog, 250, {
9150 * 'maxWait': 1000
9151 * }));
9152 *
9153 * // cancel a debounced call
9154 * var todoChanges = _.debounce(batchLog, 1000);
9155 * Object.observe(models.todo, todoChanges);
9156 *
9157 * Object.observe(models, function(changes) {
9158 * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
9159 * todoChanges.cancel();
9160 * }
9161 * }, ['delete']);
9162 *
9163 * // ...at some point `models.todo` is changed
9164 * models.todo.completed = true;
9165 *
9166 * // ...before 1 second has passed `models.todo` is deleted
9167 * // which cancels the debounced `todoChanges` call
9168 * delete models.todo;
9169 */
9170 function debounce(func, wait, options) {
9171 var args,
9172 maxTimeoutId,
9173 result,
9174 stamp,
9175 thisArg,
9176 timeoutId,
9177 trailingCall,
9178 lastCalled = 0,
9179 maxWait = false,
9180 trailing = true;
9181
9182 if (typeof func != 'function') {
9183 throw new TypeError(FUNC_ERROR_TEXT);
9184 }
9185 wait = wait < 0 ? 0 : (+wait || 0);
9186 if (options === true) {
9187 var leading = true;
9188 trailing = false;
9189 } else if (isObject(options)) {
9190 leading = options.leading;
9191 maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
9192 trailing = 'trailing' in options ? options.trailing : trailing;
9193 }
9194
9195 function cancel() {
9196 if (timeoutId) {
9197 clearTimeout(timeoutId);
9198 }
9199 if (maxTimeoutId) {
9200 clearTimeout(maxTimeoutId);
9201 }
9202 maxTimeoutId = timeoutId = trailingCall = undefined;
9203 }
9204
9205 function delayed() {
9206 var remaining = wait - (now() - stamp);
9207 if (remaining <= 0 || remaining > wait) {
9208 if (maxTimeoutId) {
9209 clearTimeout(maxTimeoutId);
9210 }
9211 var isCalled = trailingCall;
9212 maxTimeoutId = timeoutId = trailingCall = undefined;
9213 if (isCalled) {
9214 lastCalled = now();
9215 result = func.apply(thisArg, args);
9216 if (!timeoutId && !maxTimeoutId) {
9217 args = thisArg = null;
9218 }
9219 }
9220 } else {
9221 timeoutId = setTimeout(delayed, remaining);
9222 }
9223 }
9224
9225 function maxDelayed() {
9226 if (timeoutId) {
9227 clearTimeout(timeoutId);
9228 }
9229 maxTimeoutId = timeoutId = trailingCall = undefined;
9230 if (trailing || (maxWait !== wait)) {
9231 lastCalled = now();
9232 result = func.apply(thisArg, args);
9233 if (!timeoutId && !maxTimeoutId) {
9234 args = thisArg = null;
9235 }
9236 }
9237 }
9238
9239 function debounced() {
9240 args = arguments;
9241 stamp = now();
9242 thisArg = this;
9243 trailingCall = trailing && (timeoutId || !leading);
9244
9245 if (maxWait === false) {
9246 var leadingCall = leading && !timeoutId;
9247 } else {
9248 if (!maxTimeoutId && !leading) {
9249 lastCalled = stamp;
9250 }
9251 var remaining = maxWait - (stamp - lastCalled),
9252 isCalled = remaining <= 0 || remaining > maxWait;
9253
9254 if (isCalled) {
9255 if (maxTimeoutId) {
9256 maxTimeoutId = clearTimeout(maxTimeoutId);
9257 }
9258 lastCalled = stamp;
9259 result = func.apply(thisArg, args);
9260 }
9261 else if (!maxTimeoutId) {
9262 maxTimeoutId = setTimeout(maxDelayed, remaining);
9263 }
9264 }
9265 if (isCalled && timeoutId) {
9266 timeoutId = clearTimeout(timeoutId);
9267 }
9268 else if (!timeoutId && wait !== maxWait) {
9269 timeoutId = setTimeout(delayed, wait);
9270 }
9271 if (leadingCall) {
9272 isCalled = true;
9273 result = func.apply(thisArg, args);
9274 }
9275 if (isCalled && !timeoutId && !maxTimeoutId) {
9276 args = thisArg = null;
9277 }
9278 return result;
9279 }
9280 debounced.cancel = cancel;
9281 return debounced;
9282 }
9283
9284 /**
9285 * Defers invoking the `func` until the current call stack has cleared. Any
9286 * additional arguments are provided to `func` when it is invoked.
9287 *
9288 * @static
9289 * @memberOf _
9290 * @category Function
9291 * @param {Function} func The function to defer.
9292 * @param {...*} [args] The arguments to invoke the function with.
9293 * @returns {number} Returns the timer id.
9294 * @example
9295 *
9296 * _.defer(function(text) {
9297 * console.log(text);
9298 * }, 'deferred');
9299 * // logs 'deferred' after one or more milliseconds
9300 */
9301 var defer = restParam(function(func, args) {
9302 return baseDelay(func, 1, args);
9303 });
9304
9305 /**
9306 * Invokes `func` after `wait` milliseconds. Any additional arguments are
9307 * provided to `func` when it is invoked.
9308 *
9309 * @static
9310 * @memberOf _
9311 * @category Function
9312 * @param {Function} func The function to delay.
9313 * @param {number} wait The number of milliseconds to delay invocation.
9314 * @param {...*} [args] The arguments to invoke the function with.
9315 * @returns {number} Returns the timer id.
9316 * @example
9317 *
9318 * _.delay(function(text) {
9319 * console.log(text);
9320 * }, 1000, 'later');
9321 * // => logs 'later' after one second
9322 */
9323 var delay = restParam(function(func, wait, args) {
9324 return baseDelay(func, wait, args);
9325 });
9326
9327 /**
9328 * Creates a function that returns the result of invoking the provided
9329 * functions with the `this` binding of the created function, where each
9330 * successive invocation is supplied the return value of the previous.
9331 *
9332 * @static
9333 * @memberOf _
9334 * @category Function
9335 * @param {...Function} [funcs] Functions to invoke.
9336 * @returns {Function} Returns the new function.
9337 * @example
9338 *
9339 * function square(n) {
9340 * return n * n;
9341 * }
9342 *
9343 * var addSquare = _.flow(_.add, square);
9344 * addSquare(1, 2);
9345 * // => 9
9346 */
9347 var flow = createFlow();
9348
9349 /**
9350 * This method is like `_.flow` except that it creates a function that
9351 * invokes the provided functions from right to left.
9352 *
9353 * @static
9354 * @memberOf _
9355 * @alias backflow, compose
9356 * @category Function
9357 * @param {...Function} [funcs] Functions to invoke.
9358 * @returns {Function} Returns the new function.
9359 * @example
9360 *
9361 * function square(n) {
9362 * return n * n;
9363 * }
9364 *
9365 * var addSquare = _.flowRight(square, _.add);
9366 * addSquare(1, 2);
9367 * // => 9
9368 */
9369 var flowRight = createFlow(true);
9370
9371 /**
9372 * Creates a function that memoizes the result of `func`. If `resolver` is
9373 * provided it determines the cache key for storing the result based on the
9374 * arguments provided to the memoized function. By default, the first argument
9375 * provided to the memoized function is coerced to a string and used as the
9376 * cache key. The `func` is invoked with the `this` binding of the memoized
9377 * function.
9378 *
9379 * **Note:** The cache is exposed as the `cache` property on the memoized
9380 * function. Its creation may be customized by replacing the `_.memoize.Cache`
9381 * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)
9382 * method interface of `get`, `has`, and `set`.
9383 *
9384 * @static
9385 * @memberOf _
9386 * @category Function
9387 * @param {Function} func The function to have its output memoized.
9388 * @param {Function} [resolver] The function to resolve the cache key.
9389 * @returns {Function} Returns the new memoizing function.
9390 * @example
9391 *
9392 * var upperCase = _.memoize(function(string) {
9393 * return string.toUpperCase();
9394 * });
9395 *
9396 * upperCase('fred');
9397 * // => 'FRED'
9398 *
9399 * // modifying the result cache
9400 * upperCase.cache.set('fred', 'BARNEY');
9401 * upperCase('fred');
9402 * // => 'BARNEY'
9403 *
9404 * // replacing `_.memoize.Cache`
9405 * var object = { 'user': 'fred' };
9406 * var other = { 'user': 'barney' };
9407 * var identity = _.memoize(_.identity);
9408 *
9409 * identity(object);
9410 * // => { 'user': 'fred' }
9411 * identity(other);
9412 * // => { 'user': 'fred' }
9413 *
9414 * _.memoize.Cache = WeakMap;
9415 * var identity = _.memoize(_.identity);
9416 *
9417 * identity(object);
9418 * // => { 'user': 'fred' }
9419 * identity(other);
9420 * // => { 'user': 'barney' }
9421 */
9422 function memoize(func, resolver) {
9423 if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
9424 throw new TypeError(FUNC_ERROR_TEXT);
9425 }
9426 var memoized = function() {
9427 var args = arguments,
9428 cache = memoized.cache,
9429 key = resolver ? resolver.apply(this, args) : args[0];
9430
9431 if (cache.has(key)) {
9432 return cache.get(key);
9433 }
9434 var result = func.apply(this, args);
9435 cache.set(key, result);
9436 return result;
9437 };
9438 memoized.cache = new memoize.Cache;
9439 return memoized;
9440 }
9441
9442 /**
9443 * Creates a function that negates the result of the predicate `func`. The
9444 * `func` predicate is invoked with the `this` binding and arguments of the
9445 * created function.
9446 *
9447 * @static
9448 * @memberOf _
9449 * @category Function
9450 * @param {Function} predicate The predicate to negate.
9451 * @returns {Function} Returns the new function.
9452 * @example
9453 *
9454 * function isEven(n) {
9455 * return n % 2 == 0;
9456 * }
9457 *
9458 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
9459 * // => [1, 3, 5]
9460 */
9461 function negate(predicate) {
9462 if (typeof predicate != 'function') {
9463 throw new TypeError(FUNC_ERROR_TEXT);
9464 }
9465 return function() {
9466 return !predicate.apply(this, arguments);
9467 };
9468 }
9469
9470 /**
9471 * Creates a function that is restricted to invoking `func` once. Repeat calls
9472 * to the function return the value of the first call. The `func` is invoked
9473 * with the `this` binding and arguments of the created function.
9474 *
9475 * @static
9476 * @memberOf _
9477 * @category Function
9478 * @param {Function} func The function to restrict.
9479 * @returns {Function} Returns the new restricted function.
9480 * @example
9481 *
9482 * var initialize = _.once(createApplication);
9483 * initialize();
9484 * initialize();
9485 * // `initialize` invokes `createApplication` once
9486 */
9487 function once(func) {
9488 return before(2, func);
9489 }
9490
9491 /**
9492 * Creates a function that invokes `func` with `partial` arguments prepended
9493 * to those provided to the new function. This method is like `_.bind` except
9494 * it does **not** alter the `this` binding.
9495 *
9496 * The `_.partial.placeholder` value, which defaults to `_` in monolithic
9497 * builds, may be used as a placeholder for partially applied arguments.
9498 *
9499 * **Note:** This method does not set the "length" property of partially
9500 * applied functions.
9501 *
9502 * @static
9503 * @memberOf _
9504 * @category Function
9505 * @param {Function} func The function to partially apply arguments to.
9506 * @param {...*} [partials] The arguments to be partially applied.
9507 * @returns {Function} Returns the new partially applied function.
9508 * @example
9509 *
9510 * var greet = function(greeting, name) {
9511 * return greeting + ' ' + name;
9512 * };
9513 *
9514 * var sayHelloTo = _.partial(greet, 'hello');
9515 * sayHelloTo('fred');
9516 * // => 'hello fred'
9517 *
9518 * // using placeholders
9519 * var greetFred = _.partial(greet, _, 'fred');
9520 * greetFred('hi');
9521 * // => 'hi fred'
9522 */
9523 var partial = createPartial(PARTIAL_FLAG);
9524
9525 /**
9526 * This method is like `_.partial` except that partially applied arguments
9527 * are appended to those provided to the new function.
9528 *
9529 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
9530 * builds, may be used as a placeholder for partially applied arguments.
9531 *
9532 * **Note:** This method does not set the "length" property of partially
9533 * applied functions.
9534 *
9535 * @static
9536 * @memberOf _
9537 * @category Function
9538 * @param {Function} func The function to partially apply arguments to.
9539 * @param {...*} [partials] The arguments to be partially applied.
9540 * @returns {Function} Returns the new partially applied function.
9541 * @example
9542 *
9543 * var greet = function(greeting, name) {
9544 * return greeting + ' ' + name;
9545 * };
9546 *
9547 * var greetFred = _.partialRight(greet, 'fred');
9548 * greetFred('hi');
9549 * // => 'hi fred'
9550 *
9551 * // using placeholders
9552 * var sayHelloTo = _.partialRight(greet, 'hello', _);
9553 * sayHelloTo('fred');
9554 * // => 'hello fred'
9555 */
9556 var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
9557
9558 /**
9559 * Creates a function that invokes `func` with arguments arranged according
9560 * to the specified indexes where the argument value at the first index is
9561 * provided as the first argument, the argument value at the second index is
9562 * provided as the second argument, and so on.
9563 *
9564 * @static
9565 * @memberOf _
9566 * @category Function
9567 * @param {Function} func The function to rearrange arguments for.
9568 * @param {...(number|number[])} indexes The arranged argument indexes,
9569 * specified as individual indexes or arrays of indexes.
9570 * @returns {Function} Returns the new function.
9571 * @example
9572 *
9573 * var rearged = _.rearg(function(a, b, c) {
9574 * return [a, b, c];
9575 * }, 2, 0, 1);
9576 *
9577 * rearged('b', 'c', 'a')
9578 * // => ['a', 'b', 'c']
9579 *
9580 * var map = _.rearg(_.map, [1, 0]);
9581 * map(function(n) {
9582 * return n * 3;
9583 * }, [1, 2, 3]);
9584 * // => [3, 6, 9]
9585 */
9586 var rearg = restParam(function(func, indexes) {
9587 return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes));
9588 });
9589
9590 /**
9591 * Creates a function that invokes `func` with the `this` binding of the
9592 * created function and arguments from `start` and beyond provided as an array.
9593 *
9594 * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).
9595 *
9596 * @static
9597 * @memberOf _
9598 * @category Function
9599 * @param {Function} func The function to apply a rest parameter to.
9600 * @param {number} [start=func.length-1] The start position of the rest parameter.
9601 * @returns {Function} Returns the new function.
9602 * @example
9603 *
9604 * var say = _.restParam(function(what, names) {
9605 * return what + ' ' + _.initial(names).join(', ') +
9606 * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
9607 * });
9608 *
9609 * say('hello', 'fred', 'barney', 'pebbles');
9610 * // => 'hello fred, barney, & pebbles'
9611 */
9612 function restParam(func, start) {
9613 if (typeof func != 'function') {
9614 throw new TypeError(FUNC_ERROR_TEXT);
9615 }
9616 start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
9617 return function() {
9618 var args = arguments,
9619 index = -1,
9620 length = nativeMax(args.length - start, 0),
9621 rest = Array(length);
9622
9623 while (++index < length) {
9624 rest[index] = args[start + index];
9625 }
9626 switch (start) {
9627 case 0: return func.call(this, rest);
9628 case 1: return func.call(this, args[0], rest);
9629 case 2: return func.call(this, args[0], args[1], rest);
9630 }
9631 var otherArgs = Array(start + 1);
9632 index = -1;
9633 while (++index < start) {
9634 otherArgs[index] = args[index];
9635 }
9636 otherArgs[start] = rest;
9637 return func.apply(this, otherArgs);
9638 };
9639 }
9640
9641 /**
9642 * Creates a function that invokes `func` with the `this` binding of the created
9643 * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
9644 *
9645 * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).
9646 *
9647 * @static
9648 * @memberOf _
9649 * @category Function
9650 * @param {Function} func The function to spread arguments over.
9651 * @returns {Function} Returns the new function.
9652 * @example
9653 *
9654 * var say = _.spread(function(who, what) {
9655 * return who + ' says ' + what;
9656 * });
9657 *
9658 * say(['fred', 'hello']);
9659 * // => 'fred says hello'
9660 *
9661 * // with a Promise
9662 * var numbers = Promise.all([
9663 * Promise.resolve(40),
9664 * Promise.resolve(36)
9665 * ]);
9666 *
9667 * numbers.then(_.spread(function(x, y) {
9668 * return x + y;
9669 * }));
9670 * // => a Promise of 76
9671 */
9672 function spread(func) {
9673 if (typeof func != 'function') {
9674 throw new TypeError(FUNC_ERROR_TEXT);
9675 }
9676 return function(array) {
9677 return func.apply(this, array);
9678 };
9679 }
9680
9681 /**
9682 * Creates a function that only invokes `func` at most once per every `wait`
9683 * milliseconds. The created function comes with a `cancel` method to cancel
9684 * delayed invocations. Provide an options object to indicate that `func`
9685 * should be invoked on the leading and/or trailing edge of the `wait` timeout.
9686 * Subsequent calls to the throttled function return the result of the last
9687 * `func` call.
9688 *
9689 * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
9690 * on the trailing edge of the timeout only if the the throttled function is
9691 * invoked more than once during the `wait` timeout.
9692 *
9693 * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
9694 * for details over the differences between `_.throttle` and `_.debounce`.
9695 *
9696 * @static
9697 * @memberOf _
9698 * @category Function
9699 * @param {Function} func The function to throttle.
9700 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
9701 * @param {Object} [options] The options object.
9702 * @param {boolean} [options.leading=true] Specify invoking on the leading
9703 * edge of the timeout.
9704 * @param {boolean} [options.trailing=true] Specify invoking on the trailing
9705 * edge of the timeout.
9706 * @returns {Function} Returns the new throttled function.
9707 * @example
9708 *
9709 * // avoid excessively updating the position while scrolling
9710 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
9711 *
9712 * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
9713 * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
9714 * 'trailing': false
9715 * }));
9716 *
9717 * // cancel a trailing throttled call
9718 * jQuery(window).on('popstate', throttled.cancel);
9719 */
9720 function throttle(func, wait, options) {
9721 var leading = true,
9722 trailing = true;
9723
9724 if (typeof func != 'function') {
9725 throw new TypeError(FUNC_ERROR_TEXT);
9726 }
9727 if (options === false) {
9728 leading = false;
9729 } else if (isObject(options)) {
9730 leading = 'leading' in options ? !!options.leading : leading;
9731 trailing = 'trailing' in options ? !!options.trailing : trailing;
9732 }
9733 debounceOptions.leading = leading;
9734 debounceOptions.maxWait = +wait;
9735 debounceOptions.trailing = trailing;
9736 return debounce(func, wait, debounceOptions);
9737 }
9738
9739 /**
9740 * Creates a function that provides `value` to the wrapper function as its
9741 * first argument. Any additional arguments provided to the function are
9742 * appended to those provided to the wrapper function. The wrapper is invoked
9743 * with the `this` binding of the created function.
9744 *
9745 * @static
9746 * @memberOf _
9747 * @category Function
9748 * @param {*} value The value to wrap.
9749 * @param {Function} wrapper The wrapper function.
9750 * @returns {Function} Returns the new function.
9751 * @example
9752 *
9753 * var p = _.wrap(_.escape, function(func, text) {
9754 * return '<p>' + func(text) + '</p>';
9755 * });
9756 *
9757 * p('fred, barney, & pebbles');
9758 * // => '<p>fred, barney, &amp; pebbles</p>'
9759 */
9760 function wrap(value, wrapper) {
9761 wrapper = wrapper == null ? identity : wrapper;
9762 return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []);
9763 }
9764
9765 /*------------------------------------------------------------------------*/
9766
9767 /**
9768 * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
9769 * otherwise they are assigned by reference. If `customizer` is provided it is
9770 * invoked to produce the cloned values. If `customizer` returns `undefined`
9771 * cloning is handled by the method instead. The `customizer` is bound to
9772 * `thisArg` and invoked with two argument; (value [, index|key, object]).
9773 *
9774 * **Note:** This method is loosely based on the
9775 * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
9776 * The enumerable properties of `arguments` objects and objects created by
9777 * constructors other than `Object` are cloned to plain `Object` objects. An
9778 * empty object is returned for uncloneable values such as functions, DOM nodes,
9779 * Maps, Sets, and WeakMaps.
9780 *
9781 * @static
9782 * @memberOf _
9783 * @category Lang
9784 * @param {*} value The value to clone.
9785 * @param {boolean} [isDeep] Specify a deep clone.
9786 * @param {Function} [customizer] The function to customize cloning values.
9787 * @param {*} [thisArg] The `this` binding of `customizer`.
9788 * @returns {*} Returns the cloned value.
9789 * @example
9790 *
9791 * var users = [
9792 * { 'user': 'barney' },
9793 * { 'user': 'fred' }
9794 * ];
9795 *
9796 * var shallow = _.clone(users);
9797 * shallow[0] === users[0];
9798 * // => true
9799 *
9800 * var deep = _.clone(users, true);
9801 * deep[0] === users[0];
9802 * // => false
9803 *
9804 * // using a customizer callback
9805 * var el = _.clone(document.body, function(value) {
9806 * if (_.isElement(value)) {
9807 * return value.cloneNode(false);
9808 * }
9809 * });
9810 *
9811 * el === document.body
9812 * // => false
9813 * el.nodeName
9814 * // => BODY
9815 * el.childNodes.length;
9816 * // => 0
9817 */
9818 function clone(value, isDeep, customizer, thisArg) {
9819 if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {
9820 isDeep = false;
9821 }
9822 else if (typeof isDeep == 'function') {
9823 thisArg = customizer;
9824 customizer = isDeep;
9825 isDeep = false;
9826 }
9827 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
9828 return baseClone(value, isDeep, customizer);
9829 }
9830
9831 /**
9832 * Creates a deep clone of `value`. If `customizer` is provided it is invoked
9833 * to produce the cloned values. If `customizer` returns `undefined` cloning
9834 * is handled by the method instead. The `customizer` is bound to `thisArg`
9835 * and invoked with two argument; (value [, index|key, object]).
9836 *
9837 * **Note:** This method is loosely based on the
9838 * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
9839 * The enumerable properties of `arguments` objects and objects created by
9840 * constructors other than `Object` are cloned to plain `Object` objects. An
9841 * empty object is returned for uncloneable values such as functions, DOM nodes,
9842 * Maps, Sets, and WeakMaps.
9843 *
9844 * @static
9845 * @memberOf _
9846 * @category Lang
9847 * @param {*} value The value to deep clone.
9848 * @param {Function} [customizer] The function to customize cloning values.
9849 * @param {*} [thisArg] The `this` binding of `customizer`.
9850 * @returns {*} Returns the deep cloned value.
9851 * @example
9852 *
9853 * var users = [
9854 * { 'user': 'barney' },
9855 * { 'user': 'fred' }
9856 * ];
9857 *
9858 * var deep = _.cloneDeep(users);
9859 * deep[0] === users[0];
9860 * // => false
9861 *
9862 * // using a customizer callback
9863 * var el = _.cloneDeep(document.body, function(value) {
9864 * if (_.isElement(value)) {
9865 * return value.cloneNode(true);
9866 * }
9867 * });
9868 *
9869 * el === document.body
9870 * // => false
9871 * el.nodeName
9872 * // => BODY
9873 * el.childNodes.length;
9874 * // => 20
9875 */
9876 function cloneDeep(value, customizer, thisArg) {
9877 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);
9878 return baseClone(value, true, customizer);
9879 }
9880
9881 /**
9882 * Checks if `value` is classified as an `arguments` object.
9883 *
9884 * @static
9885 * @memberOf _
9886 * @category Lang
9887 * @param {*} value The value to check.
9888 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9889 * @example
9890 *
9891 * _.isArguments(function() { return arguments; }());
9892 * // => true
9893 *
9894 * _.isArguments([1, 2, 3]);
9895 * // => false
9896 */
9897 function isArguments(value) {
9898 var length = isObjectLike(value) ? value.length : undefined;
9899 return isLength(length) && objToString.call(value) == argsTag;
9900 }
9901
9902 /**
9903 * Checks if `value` is classified as an `Array` object.
9904 *
9905 * @static
9906 * @memberOf _
9907 * @category Lang
9908 * @param {*} value The value to check.
9909 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9910 * @example
9911 *
9912 * _.isArray([1, 2, 3]);
9913 * // => true
9914 *
9915 * _.isArray(function() { return arguments; }());
9916 * // => false
9917 */
9918 var isArray = nativeIsArray || function(value) {
9919 return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
9920 };
9921
9922 /**
9923 * Checks if `value` is classified as a boolean primitive or object.
9924 *
9925 * @static
9926 * @memberOf _
9927 * @category Lang
9928 * @param {*} value The value to check.
9929 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9930 * @example
9931 *
9932 * _.isBoolean(false);
9933 * // => true
9934 *
9935 * _.isBoolean(null);
9936 * // => false
9937 */
9938 function isBoolean(value) {
9939 return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
9940 }
9941
9942 /**
9943 * Checks if `value` is classified as a `Date` object.
9944 *
9945 * @static
9946 * @memberOf _
9947 * @category Lang
9948 * @param {*} value The value to check.
9949 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9950 * @example
9951 *
9952 * _.isDate(new Date);
9953 * // => true
9954 *
9955 * _.isDate('Mon April 23 2012');
9956 * // => false
9957 */
9958 function isDate(value) {
9959 return isObjectLike(value) && objToString.call(value) == dateTag;
9960 }
9961
9962 /**
9963 * Checks if `value` is a DOM element.
9964 *
9965 * @static
9966 * @memberOf _
9967 * @category Lang
9968 * @param {*} value The value to check.
9969 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
9970 * @example
9971 *
9972 * _.isElement(document.body);
9973 * // => true
9974 *
9975 * _.isElement('<body>');
9976 * // => false
9977 */
9978 function isElement(value) {
9979 return !!value && value.nodeType === 1 && isObjectLike(value) &&
9980 (objToString.call(value).indexOf('Element') > -1);
9981 }
9982 // Fallback for environments without DOM support.
9983 if (!support.dom) {
9984 isElement = function(value) {
9985 return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
9986 };
9987 }
9988
9989 /**
9990 * Checks if `value` is empty. A value is considered empty unless it is an
9991 * `arguments` object, array, string, or jQuery-like collection with a length
9992 * greater than `0` or an object with own enumerable properties.
9993 *
9994 * @static
9995 * @memberOf _
9996 * @category Lang
9997 * @param {Array|Object|string} value The value to inspect.
9998 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
9999 * @example
10000 *
10001 * _.isEmpty(null);
10002 * // => true
10003 *
10004 * _.isEmpty(true);
10005 * // => true
10006 *
10007 * _.isEmpty(1);
10008 * // => true
10009 *
10010 * _.isEmpty([1, 2, 3]);
10011 * // => false
10012 *
10013 * _.isEmpty({ 'a': 1 });
10014 * // => false
10015 */
10016 function isEmpty(value) {
10017 if (value == null) {
10018 return true;
10019 }
10020 var length = getLength(value);
10021 if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
10022 (isObjectLike(value) && isFunction(value.splice)))) {
10023 return !length;
10024 }
10025 return !keys(value).length;
10026 }
10027
10028 /**
10029 * Performs a deep comparison between two values to determine if they are
10030 * equivalent. If `customizer` is provided it is invoked to compare values.
10031 * If `customizer` returns `undefined` comparisons are handled by the method
10032 * instead. The `customizer` is bound to `thisArg` and invoked with three
10033 * arguments: (value, other [, index|key]).
10034 *
10035 * **Note:** This method supports comparing arrays, booleans, `Date` objects,
10036 * numbers, `Object` objects, regexes, and strings. Objects are compared by
10037 * their own, not inherited, enumerable properties. Functions and DOM nodes
10038 * are **not** supported. Provide a customizer function to extend support
10039 * for comparing other values.
10040 *
10041 * @static
10042 * @memberOf _
10043 * @category Lang
10044 * @param {*} value The value to compare.
10045 * @param {*} other The other value to compare.
10046 * @param {Function} [customizer] The function to customize value comparisons.
10047 * @param {*} [thisArg] The `this` binding of `customizer`.
10048 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
10049 * @example
10050 *
10051 * var object = { 'user': 'fred' };
10052 * var other = { 'user': 'fred' };
10053 *
10054 * object == other;
10055 * // => false
10056 *
10057 * _.isEqual(object, other);
10058 * // => true
10059 *
10060 * // using a customizer callback
10061 * var array = ['hello', 'goodbye'];
10062 * var other = ['hi', 'goodbye'];
10063 *
10064 * _.isEqual(array, other, function(value, other) {
10065 * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {
10066 * return true;
10067 * }
10068 * });
10069 * // => true
10070 */
10071 function isEqual(value, other, customizer, thisArg) {
10072 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
10073 if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {
10074 return value === other;
10075 }
10076 var result = customizer ? customizer(value, other) : undefined;
10077 return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
10078 }
10079
10080 /**
10081 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
10082 * `SyntaxError`, `TypeError`, or `URIError` object.
10083 *
10084 * @static
10085 * @memberOf _
10086 * @category Lang
10087 * @param {*} value The value to check.
10088 * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
10089 * @example
10090 *
10091 * _.isError(new Error);
10092 * // => true
10093 *
10094 * _.isError(Error);
10095 * // => false
10096 */
10097 function isError(value) {
10098 return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
10099 }
10100
10101 /**
10102 * Checks if `value` is a finite primitive number.
10103 *
10104 * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).
10105 *
10106 * @static
10107 * @memberOf _
10108 * @category Lang
10109 * @param {*} value The value to check.
10110 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
10111 * @example
10112 *
10113 * _.isFinite(10);
10114 * // => true
10115 *
10116 * _.isFinite('10');
10117 * // => false
10118 *
10119 * _.isFinite(true);
10120 * // => false
10121 *
10122 * _.isFinite(Object(10));
10123 * // => false
10124 *
10125 * _.isFinite(Infinity);
10126 * // => false
10127 */
10128 var isFinite = nativeNumIsFinite || function(value) {
10129 return typeof value == 'number' && nativeIsFinite(value);
10130 };
10131
10132 /**
10133 * Checks if `value` is classified as a `Function` object.
10134 *
10135 * @static
10136 * @memberOf _
10137 * @category Lang
10138 * @param {*} value The value to check.
10139 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10140 * @example
10141 *
10142 * _.isFunction(_);
10143 * // => true
10144 *
10145 * _.isFunction(/abc/);
10146 * // => false
10147 */
10148 var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) {
10149 // The use of `Object#toString` avoids issues with the `typeof` operator
10150 // in older versions of Chrome and Safari which return 'function' for regexes
10151 // and Safari 8 equivalents which return 'object' for typed array constructors.
10152 return objToString.call(value) == funcTag;
10153 };
10154
10155 /**
10156 * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
10157 * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
10158 *
10159 * @static
10160 * @memberOf _
10161 * @category Lang
10162 * @param {*} value The value to check.
10163 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
10164 * @example
10165 *
10166 * _.isObject({});
10167 * // => true
10168 *
10169 * _.isObject([1, 2, 3]);
10170 * // => true
10171 *
10172 * _.isObject(1);
10173 * // => false
10174 */
10175 function isObject(value) {
10176 // Avoid a V8 JIT bug in Chrome 19-20.
10177 // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
10178 var type = typeof value;
10179 return type == 'function' || (!!value && type == 'object');
10180 }
10181
10182 /**
10183 * Performs a deep comparison between `object` and `source` to determine if
10184 * `object` contains equivalent property values. If `customizer` is provided
10185 * it is invoked to compare values. If `customizer` returns `undefined`
10186 * comparisons are handled by the method instead. The `customizer` is bound
10187 * to `thisArg` and invoked with three arguments: (value, other, index|key).
10188 *
10189 * **Note:** This method supports comparing properties of arrays, booleans,
10190 * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
10191 * and DOM nodes are **not** supported. Provide a customizer function to extend
10192 * support for comparing other values.
10193 *
10194 * @static
10195 * @memberOf _
10196 * @category Lang
10197 * @param {Object} object The object to inspect.
10198 * @param {Object} source The object of property values to match.
10199 * @param {Function} [customizer] The function to customize value comparisons.
10200 * @param {*} [thisArg] The `this` binding of `customizer`.
10201 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
10202 * @example
10203 *
10204 * var object = { 'user': 'fred', 'age': 40 };
10205 *
10206 * _.isMatch(object, { 'age': 40 });
10207 * // => true
10208 *
10209 * _.isMatch(object, { 'age': 36 });
10210 * // => false
10211 *
10212 * // using a customizer callback
10213 * var object = { 'greeting': 'hello' };
10214 * var source = { 'greeting': 'hi' };
10215 *
10216 * _.isMatch(object, source, function(value, other) {
10217 * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;
10218 * });
10219 * // => true
10220 */
10221 function isMatch(object, source, customizer, thisArg) {
10222 var props = keys(source),
10223 length = props.length;
10224
10225 if (!length) {
10226 return true;
10227 }
10228 if (object == null) {
10229 return false;
10230 }
10231 customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
10232 object = toObject(object);
10233 if (!customizer && length == 1) {
10234 var key = props[0],
10235 value = source[key];
10236
10237 if (isStrictComparable(value)) {
10238 return value === object[key] && (value !== undefined || (key in object));
10239 }
10240 }
10241 var values = Array(length),
10242 strictCompareFlags = Array(length);
10243
10244 while (length--) {
10245 value = values[length] = source[props[length]];
10246 strictCompareFlags[length] = isStrictComparable(value);
10247 }
10248 return baseIsMatch(object, props, values, strictCompareFlags, customizer);
10249 }
10250
10251 /**
10252 * Checks if `value` is `NaN`.
10253 *
10254 * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
10255 * which returns `true` for `undefined` and other non-numeric values.
10256 *
10257 * @static
10258 * @memberOf _
10259 * @category Lang
10260 * @param {*} value The value to check.
10261 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
10262 * @example
10263 *
10264 * _.isNaN(NaN);
10265 * // => true
10266 *
10267 * _.isNaN(new Number(NaN));
10268 * // => true
10269 *
10270 * isNaN(undefined);
10271 * // => true
10272 *
10273 * _.isNaN(undefined);
10274 * // => false
10275 */
10276 function isNaN(value) {
10277 // An `NaN` primitive is the only value that is not equal to itself.
10278 // Perform the `toStringTag` check first to avoid errors with some host objects in IE.
10279 return isNumber(value) && value != +value;
10280 }
10281
10282 /**
10283 * Checks if `value` is a native function.
10284 *
10285 * @static
10286 * @memberOf _
10287 * @category Lang
10288 * @param {*} value The value to check.
10289 * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
10290 * @example
10291 *
10292 * _.isNative(Array.prototype.push);
10293 * // => true
10294 *
10295 * _.isNative(_);
10296 * // => false
10297 */
10298 function isNative(value) {
10299 if (value == null) {
10300 return false;
10301 }
10302 if (objToString.call(value) == funcTag) {
10303 return reIsNative.test(fnToString.call(value));
10304 }
10305 return isObjectLike(value) && reIsHostCtor.test(value);
10306 }
10307
10308 /**
10309 * Checks if `value` is `null`.
10310 *
10311 * @static
10312 * @memberOf _
10313 * @category Lang
10314 * @param {*} value The value to check.
10315 * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
10316 * @example
10317 *
10318 * _.isNull(null);
10319 * // => true
10320 *
10321 * _.isNull(void 0);
10322 * // => false
10323 */
10324 function isNull(value) {
10325 return value === null;
10326 }
10327
10328 /**
10329 * Checks if `value` is classified as a `Number` primitive or object.
10330 *
10331 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
10332 * as numbers, use the `_.isFinite` method.
10333 *
10334 * @static
10335 * @memberOf _
10336 * @category Lang
10337 * @param {*} value The value to check.
10338 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10339 * @example
10340 *
10341 * _.isNumber(8.4);
10342 * // => true
10343 *
10344 * _.isNumber(NaN);
10345 * // => true
10346 *
10347 * _.isNumber('8.4');
10348 * // => false
10349 */
10350 function isNumber(value) {
10351 return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
10352 }
10353
10354 /**
10355 * Checks if `value` is a plain object, that is, an object created by the
10356 * `Object` constructor or one with a `[[Prototype]]` of `null`.
10357 *
10358 * **Note:** This method assumes objects created by the `Object` constructor
10359 * have no inherited enumerable properties.
10360 *
10361 * @static
10362 * @memberOf _
10363 * @category Lang
10364 * @param {*} value The value to check.
10365 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
10366 * @example
10367 *
10368 * function Foo() {
10369 * this.a = 1;
10370 * }
10371 *
10372 * _.isPlainObject(new Foo);
10373 * // => false
10374 *
10375 * _.isPlainObject([1, 2, 3]);
10376 * // => false
10377 *
10378 * _.isPlainObject({ 'x': 0, 'y': 0 });
10379 * // => true
10380 *
10381 * _.isPlainObject(Object.create(null));
10382 * // => true
10383 */
10384 var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
10385 if (!(value && objToString.call(value) == objectTag)) {
10386 return false;
10387 }
10388 var valueOf = value.valueOf,
10389 objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
10390
10391 return objProto
10392 ? (value == objProto || getPrototypeOf(value) == objProto)
10393 : shimIsPlainObject(value);
10394 };
10395
10396 /**
10397 * Checks if `value` is classified as a `RegExp` object.
10398 *
10399 * @static
10400 * @memberOf _
10401 * @category Lang
10402 * @param {*} value The value to check.
10403 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10404 * @example
10405 *
10406 * _.isRegExp(/abc/);
10407 * // => true
10408 *
10409 * _.isRegExp('/abc/');
10410 * // => false
10411 */
10412 function isRegExp(value) {
10413 return (isObjectLike(value) && objToString.call(value) == regexpTag) || false;
10414 }
10415
10416 /**
10417 * Checks if `value` is classified as a `String` primitive or object.
10418 *
10419 * @static
10420 * @memberOf _
10421 * @category Lang
10422 * @param {*} value The value to check.
10423 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10424 * @example
10425 *
10426 * _.isString('abc');
10427 * // => true
10428 *
10429 * _.isString(1);
10430 * // => false
10431 */
10432 function isString(value) {
10433 return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
10434 }
10435
10436 /**
10437 * Checks if `value` is classified as a typed array.
10438 *
10439 * @static
10440 * @memberOf _
10441 * @category Lang
10442 * @param {*} value The value to check.
10443 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10444 * @example
10445 *
10446 * _.isTypedArray(new Uint8Array);
10447 * // => true
10448 *
10449 * _.isTypedArray([]);
10450 * // => false
10451 */
10452 function isTypedArray(value) {
10453 return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
10454 }
10455
10456 /**
10457 * Checks if `value` is `undefined`.
10458 *
10459 * @static
10460 * @memberOf _
10461 * @category Lang
10462 * @param {*} value The value to check.
10463 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
10464 * @example
10465 *
10466 * _.isUndefined(void 0);
10467 * // => true
10468 *
10469 * _.isUndefined(null);
10470 * // => false
10471 */
10472 function isUndefined(value) {
10473 return value === undefined;
10474 }
10475
10476 /**
10477 * Converts `value` to an array.
10478 *
10479 * @static
10480 * @memberOf _
10481 * @category Lang
10482 * @param {*} value The value to convert.
10483 * @returns {Array} Returns the converted array.
10484 * @example
10485 *
10486 * (function() {
10487 * return _.toArray(arguments).slice(1);
10488 * }(1, 2, 3));
10489 * // => [2, 3]
10490 */
10491 function toArray(value) {
10492 var length = value ? getLength(value) : 0;
10493 if (!isLength(length)) {
10494 return values(value);
10495 }
10496 if (!length) {
10497 return [];
10498 }
10499 return arrayCopy(value);
10500 }
10501
10502 /**
10503 * Converts `value` to a plain object flattening inherited enumerable
10504 * properties of `value` to own properties of the plain object.
10505 *
10506 * @static
10507 * @memberOf _
10508 * @category Lang
10509 * @param {*} value The value to convert.
10510 * @returns {Object} Returns the converted plain object.
10511 * @example
10512 *
10513 * function Foo() {
10514 * this.b = 2;
10515 * }
10516 *
10517 * Foo.prototype.c = 3;
10518 *
10519 * _.assign({ 'a': 1 }, new Foo);
10520 * // => { 'a': 1, 'b': 2 }
10521 *
10522 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
10523 * // => { 'a': 1, 'b': 2, 'c': 3 }
10524 */
10525 function toPlainObject(value) {
10526 return baseCopy(value, keysIn(value));
10527 }
10528
10529 /*------------------------------------------------------------------------*/
10530
10531 /**
10532 * Assigns own enumerable properties of source object(s) to the destination
10533 * object. Subsequent sources overwrite property assignments of previous sources.
10534 * If `customizer` is provided it is invoked to produce the assigned values.
10535 * The `customizer` is bound to `thisArg` and invoked with five arguments:
10536 * (objectValue, sourceValue, key, object, source).
10537 *
10538 * **Note:** This method mutates `object` and is based on
10539 * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).
10540 *
10541 *
10542 * @static
10543 * @memberOf _
10544 * @alias extend
10545 * @category Object
10546 * @param {Object} object The destination object.
10547 * @param {...Object} [sources] The source objects.
10548 * @param {Function} [customizer] The function to customize assigned values.
10549 * @param {*} [thisArg] The `this` binding of `customizer`.
10550 * @returns {Object} Returns `object`.
10551 * @example
10552 *
10553 * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
10554 * // => { 'user': 'fred', 'age': 40 }
10555 *
10556 * // using a customizer callback
10557 * var defaults = _.partialRight(_.assign, function(value, other) {
10558 * return _.isUndefined(value) ? other : value;
10559 * });
10560 *
10561 * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
10562 * // => { 'user': 'barney', 'age': 36 }
10563 */
10564 var assign = createAssigner(function(object, source, customizer) {
10565 return customizer
10566 ? assignWith(object, source, customizer)
10567 : baseAssign(object, source);
10568 });
10569
10570 /**
10571 * Creates an object that inherits from the given `prototype` object. If a
10572 * `properties` object is provided its own enumerable properties are assigned
10573 * to the created object.
10574 *
10575 * @static
10576 * @memberOf _
10577 * @category Object
10578 * @param {Object} prototype The object to inherit from.
10579 * @param {Object} [properties] The properties to assign to the object.
10580 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
10581 * @returns {Object} Returns the new object.
10582 * @example
10583 *
10584 * function Shape() {
10585 * this.x = 0;
10586 * this.y = 0;
10587 * }
10588 *
10589 * function Circle() {
10590 * Shape.call(this);
10591 * }
10592 *
10593 * Circle.prototype = _.create(Shape.prototype, {
10594 * 'constructor': Circle
10595 * });
10596 *
10597 * var circle = new Circle;
10598 * circle instanceof Circle;
10599 * // => true
10600 *
10601 * circle instanceof Shape;
10602 * // => true
10603 */
10604 function create(prototype, properties, guard) {
10605 var result = baseCreate(prototype);
10606 if (guard && isIterateeCall(prototype, properties, guard)) {
10607 properties = null;
10608 }
10609 return properties ? baseAssign(result, properties) : result;
10610 }
10611
10612 /**
10613 * Assigns own enumerable properties of source object(s) to the destination
10614 * object for all destination properties that resolve to `undefined`. Once a
10615 * property is set, additional values of the same property are ignored.
10616 *
10617 * **Note:** This method mutates `object`.
10618 *
10619 * @static
10620 * @memberOf _
10621 * @category Object
10622 * @param {Object} object The destination object.
10623 * @param {...Object} [sources] The source objects.
10624 * @returns {Object} Returns `object`.
10625 * @example
10626 *
10627 * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
10628 * // => { 'user': 'barney', 'age': 36 }
10629 */
10630 var defaults = restParam(function(args) {
10631 var object = args[0];
10632 if (object == null) {
10633 return object;
10634 }
10635 args.push(assignDefaults);
10636 return assign.apply(undefined, args);
10637 });
10638
10639 /**
10640 * This method is like `_.find` except that it returns the key of the first
10641 * element `predicate` returns truthy for instead of the element itself.
10642 *
10643 * If a property name is provided for `predicate` the created `_.property`
10644 * style callback returns the property value of the given element.
10645 *
10646 * If a value is also provided for `thisArg` the created `_.matchesProperty`
10647 * style callback returns `true` for elements that have a matching property
10648 * value, else `false`.
10649 *
10650 * If an object is provided for `predicate` the created `_.matches` style
10651 * callback returns `true` for elements that have the properties of the given
10652 * object, else `false`.
10653 *
10654 * @static
10655 * @memberOf _
10656 * @category Object
10657 * @param {Object} object The object to search.
10658 * @param {Function|Object|string} [predicate=_.identity] The function invoked
10659 * per iteration.
10660 * @param {*} [thisArg] The `this` binding of `predicate`.
10661 * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
10662 * @example
10663 *
10664 * var users = {
10665 * 'barney': { 'age': 36, 'active': true },
10666 * 'fred': { 'age': 40, 'active': false },
10667 * 'pebbles': { 'age': 1, 'active': true }
10668 * };
10669 *
10670 * _.findKey(users, function(chr) {
10671 * return chr.age < 40;
10672 * });
10673 * // => 'barney' (iteration order is not guaranteed)
10674 *
10675 * // using the `_.matches` callback shorthand
10676 * _.findKey(users, { 'age': 1, 'active': true });
10677 * // => 'pebbles'
10678 *
10679 * // using the `_.matchesProperty` callback shorthand
10680 * _.findKey(users, 'active', false);
10681 * // => 'fred'
10682 *
10683 * // using the `_.property` callback shorthand
10684 * _.findKey(users, 'active');
10685 * // => 'barney'
10686 */
10687 var findKey = createFindKey(baseForOwn);
10688
10689 /**
10690 * This method is like `_.findKey` except that it iterates over elements of
10691 * a collection in the opposite order.
10692 *
10693 * If a property name is provided for `predicate` the created `_.property`
10694 * style callback returns the property value of the given element.
10695 *
10696 * If a value is also provided for `thisArg` the created `_.matchesProperty`
10697 * style callback returns `true` for elements that have a matching property
10698 * value, else `false`.
10699 *
10700 * If an object is provided for `predicate` the created `_.matches` style
10701 * callback returns `true` for elements that have the properties of the given
10702 * object, else `false`.
10703 *
10704 * @static
10705 * @memberOf _
10706 * @category Object
10707 * @param {Object} object The object to search.
10708 * @param {Function|Object|string} [predicate=_.identity] The function invoked
10709 * per iteration.
10710 * @param {*} [thisArg] The `this` binding of `predicate`.
10711 * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
10712 * @example
10713 *
10714 * var users = {
10715 * 'barney': { 'age': 36, 'active': true },
10716 * 'fred': { 'age': 40, 'active': false },
10717 * 'pebbles': { 'age': 1, 'active': true }
10718 * };
10719 *
10720 * _.findLastKey(users, function(chr) {
10721 * return chr.age < 40;
10722 * });
10723 * // => returns `pebbles` assuming `_.findKey` returns `barney`
10724 *
10725 * // using the `_.matches` callback shorthand
10726 * _.findLastKey(users, { 'age': 36, 'active': true });
10727 * // => 'barney'
10728 *
10729 * // using the `_.matchesProperty` callback shorthand
10730 * _.findLastKey(users, 'active', false);
10731 * // => 'fred'
10732 *
10733 * // using the `_.property` callback shorthand
10734 * _.findLastKey(users, 'active');
10735 * // => 'pebbles'
10736 */
10737 var findLastKey = createFindKey(baseForOwnRight);
10738
10739 /**
10740 * Iterates over own and inherited enumerable properties of an object invoking
10741 * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
10742 * with three arguments: (value, key, object). Iteratee functions may exit
10743 * iteration early by explicitly returning `false`.
10744 *
10745 * @static
10746 * @memberOf _
10747 * @category Object
10748 * @param {Object} object The object to iterate over.
10749 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10750 * @param {*} [thisArg] The `this` binding of `iteratee`.
10751 * @returns {Object} Returns `object`.
10752 * @example
10753 *
10754 * function Foo() {
10755 * this.a = 1;
10756 * this.b = 2;
10757 * }
10758 *
10759 * Foo.prototype.c = 3;
10760 *
10761 * _.forIn(new Foo, function(value, key) {
10762 * console.log(key);
10763 * });
10764 * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
10765 */
10766 var forIn = createForIn(baseFor);
10767
10768 /**
10769 * This method is like `_.forIn` except that it iterates over properties of
10770 * `object` in the opposite order.
10771 *
10772 * @static
10773 * @memberOf _
10774 * @category Object
10775 * @param {Object} object The object to iterate over.
10776 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10777 * @param {*} [thisArg] The `this` binding of `iteratee`.
10778 * @returns {Object} Returns `object`.
10779 * @example
10780 *
10781 * function Foo() {
10782 * this.a = 1;
10783 * this.b = 2;
10784 * }
10785 *
10786 * Foo.prototype.c = 3;
10787 *
10788 * _.forInRight(new Foo, function(value, key) {
10789 * console.log(key);
10790 * });
10791 * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
10792 */
10793 var forInRight = createForIn(baseForRight);
10794
10795 /**
10796 * Iterates over own enumerable properties of an object invoking `iteratee`
10797 * for each property. The `iteratee` is bound to `thisArg` and invoked with
10798 * three arguments: (value, key, object). Iteratee functions may exit iteration
10799 * early by explicitly returning `false`.
10800 *
10801 * @static
10802 * @memberOf _
10803 * @category Object
10804 * @param {Object} object The object to iterate over.
10805 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10806 * @param {*} [thisArg] The `this` binding of `iteratee`.
10807 * @returns {Object} Returns `object`.
10808 * @example
10809 *
10810 * function Foo() {
10811 * this.a = 1;
10812 * this.b = 2;
10813 * }
10814 *
10815 * Foo.prototype.c = 3;
10816 *
10817 * _.forOwn(new Foo, function(value, key) {
10818 * console.log(key);
10819 * });
10820 * // => logs 'a' and 'b' (iteration order is not guaranteed)
10821 */
10822 var forOwn = createForOwn(baseForOwn);
10823
10824 /**
10825 * This method is like `_.forOwn` except that it iterates over properties of
10826 * `object` in the opposite order.
10827 *
10828 * @static
10829 * @memberOf _
10830 * @category Object
10831 * @param {Object} object The object to iterate over.
10832 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10833 * @param {*} [thisArg] The `this` binding of `iteratee`.
10834 * @returns {Object} Returns `object`.
10835 * @example
10836 *
10837 * function Foo() {
10838 * this.a = 1;
10839 * this.b = 2;
10840 * }
10841 *
10842 * Foo.prototype.c = 3;
10843 *
10844 * _.forOwnRight(new Foo, function(value, key) {
10845 * console.log(key);
10846 * });
10847 * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
10848 */
10849 var forOwnRight = createForOwn(baseForOwnRight);
10850
10851 /**
10852 * Creates an array of function property names from all enumerable properties,
10853 * own and inherited, of `object`.
10854 *
10855 * @static
10856 * @memberOf _
10857 * @alias methods
10858 * @category Object
10859 * @param {Object} object The object to inspect.
10860 * @returns {Array} Returns the new array of property names.
10861 * @example
10862 *
10863 * _.functions(_);
10864 * // => ['after', 'ary', 'assign', ...]
10865 */
10866 function functions(object) {
10867 return baseFunctions(object, keysIn(object));
10868 }
10869
10870 /**
10871 * Gets the property value of `path` on `object`. If the resolved value is
10872 * `undefined` the `defaultValue` is used in its place.
10873 *
10874 * @static
10875 * @memberOf _
10876 * @category Object
10877 * @param {Object} object The object to query.
10878 * @param {Array|string} path The path of the property to get.
10879 * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
10880 * @returns {*} Returns the resolved value.
10881 * @example
10882 *
10883 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
10884 *
10885 * _.get(object, 'a[0].b.c');
10886 * // => 3
10887 *
10888 * _.get(object, ['a', '0', 'b', 'c']);
10889 * // => 3
10890 *
10891 * _.get(object, 'a.b.c', 'default');
10892 * // => 'default'
10893 */
10894 function get(object, path, defaultValue) {
10895 var result = object == null ? undefined : baseGet(object, toPath(path), path + '');
10896 return result === undefined ? defaultValue : result;
10897 }
10898
10899 /**
10900 * Checks if `path` is a direct property.
10901 *
10902 * @static
10903 * @memberOf _
10904 * @category Object
10905 * @param {Object} object The object to query.
10906 * @param {Array|string} path The path to check.
10907 * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
10908 * @example
10909 *
10910 * var object = { 'a': { 'b': { 'c': 3 } } };
10911 *
10912 * _.has(object, 'a');
10913 * // => true
10914 *
10915 * _.has(object, 'a.b.c');
10916 * // => true
10917 *
10918 * _.has(object, ['a', 'b', 'c']);
10919 * // => true
10920 */
10921 function has(object, path) {
10922 if (object == null) {
10923 return false;
10924 }
10925 var result = hasOwnProperty.call(object, path);
10926 if (!result && !isKey(path)) {
10927 path = toPath(path);
10928 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
10929 path = last(path);
10930 result = object != null && hasOwnProperty.call(object, path);
10931 }
10932 return result;
10933 }
10934
10935 /**
10936 * Creates an object composed of the inverted keys and values of `object`.
10937 * If `object` contains duplicate values, subsequent values overwrite property
10938 * assignments of previous values unless `multiValue` is `true`.
10939 *
10940 * @static
10941 * @memberOf _
10942 * @category Object
10943 * @param {Object} object The object to invert.
10944 * @param {boolean} [multiValue] Allow multiple values per key.
10945 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
10946 * @returns {Object} Returns the new inverted object.
10947 * @example
10948 *
10949 * var object = { 'a': 1, 'b': 2, 'c': 1 };
10950 *
10951 * _.invert(object);
10952 * // => { '1': 'c', '2': 'b' }
10953 *
10954 * // with `multiValue`
10955 * _.invert(object, true);
10956 * // => { '1': ['a', 'c'], '2': ['b'] }
10957 */
10958 function invert(object, multiValue, guard) {
10959 if (guard && isIterateeCall(object, multiValue, guard)) {
10960 multiValue = null;
10961 }
10962 var index = -1,
10963 props = keys(object),
10964 length = props.length,
10965 result = {};
10966
10967 while (++index < length) {
10968 var key = props[index],
10969 value = object[key];
10970
10971 if (multiValue) {
10972 if (hasOwnProperty.call(result, value)) {
10973 result[value].push(key);
10974 } else {
10975 result[value] = [key];
10976 }
10977 }
10978 else {
10979 result[value] = key;
10980 }
10981 }
10982 return result;
10983 }
10984
10985 /**
10986 * Creates an array of the own enumerable property names of `object`.
10987 *
10988 * **Note:** Non-object values are coerced to objects. See the
10989 * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys)
10990 * for more details.
10991 *
10992 * @static
10993 * @memberOf _
10994 * @category Object
10995 * @param {Object} object The object to query.
10996 * @returns {Array} Returns the array of property names.
10997 * @example
10998 *
10999 * function Foo() {
11000 * this.a = 1;
11001 * this.b = 2;
11002 * }
11003 *
11004 * Foo.prototype.c = 3;
11005 *
11006 * _.keys(new Foo);
11007 * // => ['a', 'b'] (iteration order is not guaranteed)
11008 *
11009 * _.keys('hi');
11010 * // => ['0', '1']
11011 */
11012 var keys = !nativeKeys ? shimKeys : function(object) {
11013 if (object) {
11014 var Ctor = object.constructor,
11015 length = object.length;
11016 }
11017 if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
11018 (typeof object != 'function' && isLength(length))) {
11019 return shimKeys(object);
11020 }
11021 return isObject(object) ? nativeKeys(object) : [];
11022 };
11023
11024 /**
11025 * Creates an array of the own and inherited enumerable property names of `object`.
11026 *
11027 * **Note:** Non-object values are coerced to objects.
11028 *
11029 * @static
11030 * @memberOf _
11031 * @category Object
11032 * @param {Object} object The object to query.
11033 * @returns {Array} Returns the array of property names.
11034 * @example
11035 *
11036 * function Foo() {
11037 * this.a = 1;
11038 * this.b = 2;
11039 * }
11040 *
11041 * Foo.prototype.c = 3;
11042 *
11043 * _.keysIn(new Foo);
11044 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
11045 */
11046 function keysIn(object) {
11047 if (object == null) {
11048 return [];
11049 }
11050 if (!isObject(object)) {
11051 object = Object(object);
11052 }
11053 var length = object.length;
11054 length = (length && isLength(length) &&
11055 (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0;
11056
11057 var Ctor = object.constructor,
11058 index = -1,
11059 isProto = typeof Ctor == 'function' && Ctor.prototype === object,
11060 result = Array(length),
11061 skipIndexes = length > 0;
11062
11063 while (++index < length) {
11064 result[index] = (index + '');
11065 }
11066 for (var key in object) {
11067 if (!(skipIndexes && isIndex(key, length)) &&
11068 !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
11069 result.push(key);
11070 }
11071 }
11072 return result;
11073 }
11074
11075 /**
11076 * Creates an object with the same keys as `object` and values generated by
11077 * running each own enumerable property of `object` through `iteratee`. The
11078 * iteratee function is bound to `thisArg` and invoked with three arguments:
11079 * (value, key, object).
11080 *
11081 * If a property name is provided for `iteratee` the created `_.property`
11082 * style callback returns the property value of the given element.
11083 *
11084 * If a value is also provided for `thisArg` the created `_.matchesProperty`
11085 * style callback returns `true` for elements that have a matching property
11086 * value, else `false`.
11087 *
11088 * If an object is provided for `iteratee` the created `_.matches` style
11089 * callback returns `true` for elements that have the properties of the given
11090 * object, else `false`.
11091 *
11092 * @static
11093 * @memberOf _
11094 * @category Object
11095 * @param {Object} object The object to iterate over.
11096 * @param {Function|Object|string} [iteratee=_.identity] The function invoked
11097 * per iteration.
11098 * @param {*} [thisArg] The `this` binding of `iteratee`.
11099 * @returns {Object} Returns the new mapped object.
11100 * @example
11101 *
11102 * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {
11103 * return n * 3;
11104 * });
11105 * // => { 'a': 3, 'b': 6 }
11106 *
11107 * var users = {
11108 * 'fred': { 'user': 'fred', 'age': 40 },
11109 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
11110 * };
11111 *
11112 * // using the `_.property` callback shorthand
11113 * _.mapValues(users, 'age');
11114 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
11115 */
11116 function mapValues(object, iteratee, thisArg) {
11117 var result = {};
11118 iteratee = getCallback(iteratee, thisArg, 3);
11119
11120 baseForOwn(object, function(value, key, object) {
11121 result[key] = iteratee(value, key, object);
11122 });
11123 return result;
11124 }
11125
11126 /**
11127 * Recursively merges own enumerable properties of the source object(s), that
11128 * don't resolve to `undefined` into the destination object. Subsequent sources
11129 * overwrite property assignments of previous sources. If `customizer` is
11130 * provided it is invoked to produce the merged values of the destination and
11131 * source properties. If `customizer` returns `undefined` merging is handled
11132 * by the method instead. The `customizer` is bound to `thisArg` and invoked
11133 * with five arguments: (objectValue, sourceValue, key, object, source).
11134 *
11135 * @static
11136 * @memberOf _
11137 * @category Object
11138 * @param {Object} object The destination object.
11139 * @param {...Object} [sources] The source objects.
11140 * @param {Function} [customizer] The function to customize assigned values.
11141 * @param {*} [thisArg] The `this` binding of `customizer`.
11142 * @returns {Object} Returns `object`.
11143 * @example
11144 *
11145 * var users = {
11146 * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
11147 * };
11148 *
11149 * var ages = {
11150 * 'data': [{ 'age': 36 }, { 'age': 40 }]
11151 * };
11152 *
11153 * _.merge(users, ages);
11154 * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
11155 *
11156 * // using a customizer callback
11157 * var object = {
11158 * 'fruits': ['apple'],
11159 * 'vegetables': ['beet']
11160 * };
11161 *
11162 * var other = {
11163 * 'fruits': ['banana'],
11164 * 'vegetables': ['carrot']
11165 * };
11166 *
11167 * _.merge(object, other, function(a, b) {
11168 * if (_.isArray(a)) {
11169 * return a.concat(b);
11170 * }
11171 * });
11172 * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
11173 */
11174 var merge = createAssigner(baseMerge);
11175
11176 /**
11177 * The opposite of `_.pick`; this method creates an object composed of the
11178 * own and inherited enumerable properties of `object` that are not omitted.
11179 * Property names may be specified as individual arguments or as arrays of
11180 * property names. If `predicate` is provided it is invoked for each property
11181 * of `object` omitting the properties `predicate` returns truthy for. The
11182 * predicate is bound to `thisArg` and invoked with three arguments:
11183 * (value, key, object).
11184 *
11185 * @static
11186 * @memberOf _
11187 * @category Object
11188 * @param {Object} object The source object.
11189 * @param {Function|...(string|string[])} [predicate] The function invoked per
11190 * iteration or property names to omit, specified as individual property
11191 * names or arrays of property names.
11192 * @param {*} [thisArg] The `this` binding of `predicate`.
11193 * @returns {Object} Returns the new object.
11194 * @example
11195 *
11196 * var object = { 'user': 'fred', 'age': 40 };
11197 *
11198 * _.omit(object, 'age');
11199 * // => { 'user': 'fred' }
11200 *
11201 * _.omit(object, _.isNumber);
11202 * // => { 'user': 'fred' }
11203 */
11204 var omit = restParam(function(object, props) {
11205 if (object == null) {
11206 return {};
11207 }
11208 if (typeof props[0] != 'function') {
11209 var props = arrayMap(baseFlatten(props), String);
11210 return pickByArray(object, baseDifference(keysIn(object), props));
11211 }
11212 var predicate = bindCallback(props[0], props[1], 3);
11213 return pickByCallback(object, function(value, key, object) {
11214 return !predicate(value, key, object);
11215 });
11216 });
11217
11218 /**
11219 * Creates a two dimensional array of the key-value pairs for `object`,
11220 * e.g. `[[key1, value1], [key2, value2]]`.
11221 *
11222 * @static
11223 * @memberOf _
11224 * @category Object
11225 * @param {Object} object The object to query.
11226 * @returns {Array} Returns the new array of key-value pairs.
11227 * @example
11228 *
11229 * _.pairs({ 'barney': 36, 'fred': 40 });
11230 * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
11231 */
11232 function pairs(object) {
11233 var index = -1,
11234 props = keys(object),
11235 length = props.length,
11236 result = Array(length);
11237
11238 while (++index < length) {
11239 var key = props[index];
11240 result[index] = [key, object[key]];
11241 }
11242 return result;
11243 }
11244
11245 /**
11246 * Creates an object composed of the picked `object` properties. Property
11247 * names may be specified as individual arguments or as arrays of property
11248 * names. If `predicate` is provided it is invoked for each property of `object`
11249 * picking the properties `predicate` returns truthy for. The predicate is
11250 * bound to `thisArg` and invoked with three arguments: (value, key, object).
11251 *
11252 * @static
11253 * @memberOf _
11254 * @category Object
11255 * @param {Object} object The source object.
11256 * @param {Function|...(string|string[])} [predicate] The function invoked per
11257 * iteration or property names to pick, specified as individual property
11258 * names or arrays of property names.
11259 * @param {*} [thisArg] The `this` binding of `predicate`.
11260 * @returns {Object} Returns the new object.
11261 * @example
11262 *
11263 * var object = { 'user': 'fred', 'age': 40 };
11264 *
11265 * _.pick(object, 'user');
11266 * // => { 'user': 'fred' }
11267 *
11268 * _.pick(object, _.isString);
11269 * // => { 'user': 'fred' }
11270 */
11271 var pick = restParam(function(object, props) {
11272 if (object == null) {
11273 return {};
11274 }
11275 return typeof props[0] == 'function'
11276 ? pickByCallback(object, bindCallback(props[0], props[1], 3))
11277 : pickByArray(object, baseFlatten(props));
11278 });
11279
11280 /**
11281 * This method is like `_.get` except that if the resolved value is a function
11282 * it is invoked with the `this` binding of its parent object and its result
11283 * is returned.
11284 *
11285 * @static
11286 * @memberOf _
11287 * @category Object
11288 * @param {Object} object The object to query.
11289 * @param {Array|string} path The path of the property to resolve.
11290 * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
11291 * @returns {*} Returns the resolved value.
11292 * @example
11293 *
11294 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
11295 *
11296 * _.result(object, 'a[0].b.c1');
11297 * // => 3
11298 *
11299 * _.result(object, 'a[0].b.c2');
11300 * // => 4
11301 *
11302 * _.result(object, 'a.b.c', 'default');
11303 * // => 'default'
11304 *
11305 * _.result(object, 'a.b.c', _.constant('default'));
11306 * // => 'default'
11307 */
11308 function result(object, path, defaultValue) {
11309 var result = object == null ? undefined : object[path];
11310 if (result === undefined) {
11311 if (object != null && !isKey(path, object)) {
11312 path = toPath(path);
11313 object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
11314 result = object == null ? undefined : object[last(path)];
11315 }
11316 result = result === undefined ? defaultValue : result;
11317 }
11318 return isFunction(result) ? result.call(object) : result;
11319 }
11320
11321 /**
11322 * Sets the property value of `path` on `object`. If a portion of `path`
11323 * does not exist it is created.
11324 *
11325 * @static
11326 * @memberOf _
11327 * @category Object
11328 * @param {Object} object The object to augment.
11329 * @param {Array|string} path The path of the property to set.
11330 * @param {*} value The value to set.
11331 * @returns {Object} Returns `object`.
11332 * @example
11333 *
11334 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
11335 *
11336 * _.set(object, 'a[0].b.c', 4);
11337 * console.log(object.a[0].b.c);
11338 * // => 4
11339 *
11340 * _.set(object, 'x[0].y.z', 5);
11341 * console.log(object.x[0].y.z);
11342 * // => 5
11343 */
11344 function set(object, path, value) {
11345 if (object == null) {
11346 return object;
11347 }
11348 var pathKey = (path + '');
11349 path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);
11350
11351 var index = -1,
11352 length = path.length,
11353 endIndex = length - 1,
11354 nested = object;
11355
11356 while (nested != null && ++index < length) {
11357 var key = path[index];
11358 if (isObject(nested)) {
11359 if (index == endIndex) {
11360 nested[key] = value;
11361 } else if (nested[key] == null) {
11362 nested[key] = isIndex(path[index + 1]) ? [] : {};
11363 }
11364 }
11365 nested = nested[key];
11366 }
11367 return object;
11368 }
11369
11370 /**
11371 * An alternative to `_.reduce`; this method transforms `object` to a new
11372 * `accumulator` object which is the result of running each of its own enumerable
11373 * properties through `iteratee`, with each invocation potentially mutating
11374 * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
11375 * with four arguments: (accumulator, value, key, object). Iteratee functions
11376 * may exit iteration early by explicitly returning `false`.
11377 *
11378 * @static
11379 * @memberOf _
11380 * @category Object
11381 * @param {Array|Object} object The object to iterate over.
11382 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11383 * @param {*} [accumulator] The custom accumulator value.
11384 * @param {*} [thisArg] The `this` binding of `iteratee`.
11385 * @returns {*} Returns the accumulated value.
11386 * @example
11387 *
11388 * _.transform([2, 3, 4], function(result, n) {
11389 * result.push(n *= n);
11390 * return n % 2 == 0;
11391 * });
11392 * // => [4, 9]
11393 *
11394 * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {
11395 * result[key] = n * 3;
11396 * });
11397 * // => { 'a': 3, 'b': 6 }
11398 */
11399 function transform(object, iteratee, accumulator, thisArg) {
11400 var isArr = isArray(object) || isTypedArray(object);
11401 iteratee = getCallback(iteratee, thisArg, 4);
11402
11403 if (accumulator == null) {
11404 if (isArr || isObject(object)) {
11405 var Ctor = object.constructor;
11406 if (isArr) {
11407 accumulator = isArray(object) ? new Ctor : [];
11408 } else {
11409 accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype);
11410 }
11411 } else {
11412 accumulator = {};
11413 }
11414 }
11415 (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
11416 return iteratee(accumulator, value, index, object);
11417 });
11418 return accumulator;
11419 }
11420
11421 /**
11422 * Creates an array of the own enumerable property values of `object`.
11423 *
11424 * **Note:** Non-object values are coerced to objects.
11425 *
11426 * @static
11427 * @memberOf _
11428 * @category Object
11429 * @param {Object} object The object to query.
11430 * @returns {Array} Returns the array of property values.
11431 * @example
11432 *
11433 * function Foo() {
11434 * this.a = 1;
11435 * this.b = 2;
11436 * }
11437 *
11438 * Foo.prototype.c = 3;
11439 *
11440 * _.values(new Foo);
11441 * // => [1, 2] (iteration order is not guaranteed)
11442 *
11443 * _.values('hi');
11444 * // => ['h', 'i']
11445 */
11446 function values(object) {
11447 return baseValues(object, keys(object));
11448 }
11449
11450 /**
11451 * Creates an array of the own and inherited enumerable property values
11452 * of `object`.
11453 *
11454 * **Note:** Non-object values are coerced to objects.
11455 *
11456 * @static
11457 * @memberOf _
11458 * @category Object
11459 * @param {Object} object The object to query.
11460 * @returns {Array} Returns the array of property values.
11461 * @example
11462 *
11463 * function Foo() {
11464 * this.a = 1;
11465 * this.b = 2;
11466 * }
11467 *
11468 * Foo.prototype.c = 3;
11469 *
11470 * _.valuesIn(new Foo);
11471 * // => [1, 2, 3] (iteration order is not guaranteed)
11472 */
11473 function valuesIn(object) {
11474 return baseValues(object, keysIn(object));
11475 }
11476
11477 /*------------------------------------------------------------------------*/
11478
11479 /**
11480 * Checks if `n` is between `start` and up to but not including, `end`. If
11481 * `end` is not specified it is set to `start` with `start` then set to `0`.
11482 *
11483 * @static
11484 * @memberOf _
11485 * @category Number
11486 * @param {number} n The number to check.
11487 * @param {number} [start=0] The start of the range.
11488 * @param {number} end The end of the range.
11489 * @returns {boolean} Returns `true` if `n` is in the range, else `false`.
11490 * @example
11491 *
11492 * _.inRange(3, 2, 4);
11493 * // => true
11494 *
11495 * _.inRange(4, 8);
11496 * // => true
11497 *
11498 * _.inRange(4, 2);
11499 * // => false
11500 *
11501 * _.inRange(2, 2);
11502 * // => false
11503 *
11504 * _.inRange(1.2, 2);
11505 * // => true
11506 *
11507 * _.inRange(5.2, 4);
11508 * // => false
11509 */
11510 function inRange(value, start, end) {
11511 start = +start || 0;
11512 if (typeof end === 'undefined') {
11513 end = start;
11514 start = 0;
11515 } else {
11516 end = +end || 0;
11517 }
11518 return value >= nativeMin(start, end) && value < nativeMax(start, end);
11519 }
11520
11521 /**
11522 * Produces a random number between `min` and `max` (inclusive). If only one
11523 * argument is provided a number between `0` and the given number is returned.
11524 * If `floating` is `true`, or either `min` or `max` are floats, a floating-point
11525 * number is returned instead of an integer.
11526 *
11527 * @static
11528 * @memberOf _
11529 * @category Number
11530 * @param {number} [min=0] The minimum possible value.
11531 * @param {number} [max=1] The maximum possible value.
11532 * @param {boolean} [floating] Specify returning a floating-point number.
11533 * @returns {number} Returns the random number.
11534 * @example
11535 *
11536 * _.random(0, 5);
11537 * // => an integer between 0 and 5
11538 *
11539 * _.random(5);
11540 * // => also an integer between 0 and 5
11541 *
11542 * _.random(5, true);
11543 * // => a floating-point number between 0 and 5
11544 *
11545 * _.random(1.2, 5.2);
11546 * // => a floating-point number between 1.2 and 5.2
11547 */
11548 function random(min, max, floating) {
11549 if (floating && isIterateeCall(min, max, floating)) {
11550 max = floating = null;
11551 }
11552 var noMin = min == null,
11553 noMax = max == null;
11554
11555 if (floating == null) {
11556 if (noMax && typeof min == 'boolean') {
11557 floating = min;
11558 min = 1;
11559 }
11560 else if (typeof max == 'boolean') {
11561 floating = max;
11562 noMax = true;
11563 }
11564 }
11565 if (noMin && noMax) {
11566 max = 1;
11567 noMax = false;
11568 }
11569 min = +min || 0;
11570 if (noMax) {
11571 max = min;
11572 min = 0;
11573 } else {
11574 max = +max || 0;
11575 }
11576 if (floating || min % 1 || max % 1) {
11577 var rand = nativeRandom();
11578 return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);
11579 }
11580 return baseRandom(min, max);
11581 }
11582
11583 /*------------------------------------------------------------------------*/
11584
11585 /**
11586 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
11587 *
11588 * @static
11589 * @memberOf _
11590 * @category String
11591 * @param {string} [string=''] The string to convert.
11592 * @returns {string} Returns the camel cased string.
11593 * @example
11594 *
11595 * _.camelCase('Foo Bar');
11596 * // => 'fooBar'
11597 *
11598 * _.camelCase('--foo-bar');
11599 * // => 'fooBar'
11600 *
11601 * _.camelCase('__foo_bar__');
11602 * // => 'fooBar'
11603 */
11604 var camelCase = createCompounder(function(result, word, index) {
11605 word = word.toLowerCase();
11606 return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);
11607 });
11608
11609 /**
11610 * Capitalizes the first character of `string`.
11611 *
11612 * @static
11613 * @memberOf _
11614 * @category String
11615 * @param {string} [string=''] The string to capitalize.
11616 * @returns {string} Returns the capitalized string.
11617 * @example
11618 *
11619 * _.capitalize('fred');
11620 * // => 'Fred'
11621 */
11622 function capitalize(string) {
11623 string = baseToString(string);
11624 return string && (string.charAt(0).toUpperCase() + string.slice(1));
11625 }
11626
11627 /**
11628 * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
11629 * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
11630 *
11631 * @static
11632 * @memberOf _
11633 * @category String
11634 * @param {string} [string=''] The string to deburr.
11635 * @returns {string} Returns the deburred string.
11636 * @example
11637 *
11638 * _.deburr('déjà vu');
11639 * // => 'deja vu'
11640 */
11641 function deburr(string) {
11642 string = baseToString(string);
11643 return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
11644 }
11645
11646 /**
11647 * Checks if `string` ends with the given target string.
11648 *
11649 * @static
11650 * @memberOf _
11651 * @category String
11652 * @param {string} [string=''] The string to search.
11653 * @param {string} [target] The string to search for.
11654 * @param {number} [position=string.length] The position to search from.
11655 * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.
11656 * @example
11657 *
11658 * _.endsWith('abc', 'c');
11659 * // => true
11660 *
11661 * _.endsWith('abc', 'b');
11662 * // => false
11663 *
11664 * _.endsWith('abc', 'b', 2);
11665 * // => true
11666 */
11667 function endsWith(string, target, position) {
11668 string = baseToString(string);
11669 target = (target + '');
11670
11671 var length = string.length;
11672 position = position === undefined
11673 ? length
11674 : nativeMin(position < 0 ? 0 : (+position || 0), length);
11675
11676 position -= target.length;
11677 return position >= 0 && string.indexOf(target, position) == position;
11678 }
11679
11680 /**
11681 * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
11682 * their corresponding HTML entities.
11683 *
11684 * **Note:** No other characters are escaped. To escape additional characters
11685 * use a third-party library like [_he_](https://mths.be/he).
11686 *
11687 * Though the ">" character is escaped for symmetry, characters like
11688 * ">" and "/" don't require escaping in HTML and have no special meaning
11689 * unless they're part of a tag or unquoted attribute value.
11690 * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
11691 * (under "semi-related fun fact") for more details.
11692 *
11693 * Backticks are escaped because in Internet Explorer < 9, they can break out
11694 * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
11695 * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
11696 * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
11697 * for more details.
11698 *
11699 * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
11700 * to reduce XSS vectors.
11701 *
11702 * @static
11703 * @memberOf _
11704 * @category String
11705 * @param {string} [string=''] The string to escape.
11706 * @returns {string} Returns the escaped string.
11707 * @example
11708 *
11709 * _.escape('fred, barney, & pebbles');
11710 * // => 'fred, barney, &amp; pebbles'
11711 */
11712 function escape(string) {
11713 // Reset `lastIndex` because in IE < 9 `String#replace` does not.
11714 string = baseToString(string);
11715 return (string && reHasUnescapedHtml.test(string))
11716 ? string.replace(reUnescapedHtml, escapeHtmlChar)
11717 : string;
11718 }
11719
11720 /**
11721 * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
11722 * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
11723 *
11724 * @static
11725 * @memberOf _
11726 * @category String
11727 * @param {string} [string=''] The string to escape.
11728 * @returns {string} Returns the escaped string.
11729 * @example
11730 *
11731 * _.escapeRegExp('[lodash](https://lodash.com/)');
11732 * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
11733 */
11734 function escapeRegExp(string) {
11735 string = baseToString(string);
11736 return (string && reHasRegExpChars.test(string))
11737 ? string.replace(reRegExpChars, '\\$&')
11738 : string;
11739 }
11740
11741 /**
11742 * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
11743 *
11744 * @static
11745 * @memberOf _
11746 * @category String
11747 * @param {string} [string=''] The string to convert.
11748 * @returns {string} Returns the kebab cased string.
11749 * @example
11750 *
11751 * _.kebabCase('Foo Bar');
11752 * // => 'foo-bar'
11753 *
11754 * _.kebabCase('fooBar');
11755 * // => 'foo-bar'
11756 *
11757 * _.kebabCase('__foo_bar__');
11758 * // => 'foo-bar'
11759 */
11760 var kebabCase = createCompounder(function(result, word, index) {
11761 return result + (index ? '-' : '') + word.toLowerCase();
11762 });
11763
11764 /**
11765 * Pads `string` on the left and right sides if it is shorter than `length`.
11766 * Padding characters are truncated if they can't be evenly divided by `length`.
11767 *
11768 * @static
11769 * @memberOf _
11770 * @category String
11771 * @param {string} [string=''] The string to pad.
11772 * @param {number} [length=0] The padding length.
11773 * @param {string} [chars=' '] The string used as padding.
11774 * @returns {string} Returns the padded string.
11775 * @example
11776 *
11777 * _.pad('abc', 8);
11778 * // => ' abc '
11779 *
11780 * _.pad('abc', 8, '_-');
11781 * // => '_-abc_-_'
11782 *
11783 * _.pad('abc', 3);
11784 * // => 'abc'
11785 */
11786 function pad(string, length, chars) {
11787 string = baseToString(string);
11788 length = +length;
11789
11790 var strLength = string.length;
11791 if (strLength >= length || !nativeIsFinite(length)) {
11792 return string;
11793 }
11794 var mid = (length - strLength) / 2,
11795 leftLength = floor(mid),
11796 rightLength = ceil(mid);
11797
11798 chars = createPadding('', rightLength, chars);
11799 return chars.slice(0, leftLength) + string + chars;
11800 }
11801
11802 /**
11803 * Pads `string` on the left side if it is shorter than `length`. Padding
11804 * characters are truncated if they exceed `length`.
11805 *
11806 * @static
11807 * @memberOf _
11808 * @category String
11809 * @param {string} [string=''] The string to pad.
11810 * @param {number} [length=0] The padding length.
11811 * @param {string} [chars=' '] The string used as padding.
11812 * @returns {string} Returns the padded string.
11813 * @example
11814 *
11815 * _.padLeft('abc', 6);
11816 * // => ' abc'
11817 *
11818 * _.padLeft('abc', 6, '_-');
11819 * // => '_-_abc'
11820 *
11821 * _.padLeft('abc', 3);
11822 * // => 'abc'
11823 */
11824 var padLeft = createPadDir();
11825
11826 /**
11827 * Pads `string` on the right side if it is shorter than `length`. Padding
11828 * characters are truncated if they exceed `length`.
11829 *
11830 * @static
11831 * @memberOf _
11832 * @category String
11833 * @param {string} [string=''] The string to pad.
11834 * @param {number} [length=0] The padding length.
11835 * @param {string} [chars=' '] The string used as padding.
11836 * @returns {string} Returns the padded string.
11837 * @example
11838 *
11839 * _.padRight('abc', 6);
11840 * // => 'abc '
11841 *
11842 * _.padRight('abc', 6, '_-');
11843 * // => 'abc_-_'
11844 *
11845 * _.padRight('abc', 3);
11846 * // => 'abc'
11847 */
11848 var padRight = createPadDir(true);
11849
11850 /**
11851 * Converts `string` to an integer of the specified radix. If `radix` is
11852 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
11853 * in which case a `radix` of `16` is used.
11854 *
11855 * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
11856 * of `parseInt`.
11857 *
11858 * @static
11859 * @memberOf _
11860 * @category String
11861 * @param {string} string The string to convert.
11862 * @param {number} [radix] The radix to interpret `value` by.
11863 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
11864 * @returns {number} Returns the converted integer.
11865 * @example
11866 *
11867 * _.parseInt('08');
11868 * // => 8
11869 *
11870 * _.map(['6', '08', '10'], _.parseInt);
11871 * // => [6, 8, 10]
11872 */
11873 function parseInt(string, radix, guard) {
11874 if (guard && isIterateeCall(string, radix, guard)) {
11875 radix = 0;
11876 }
11877 return nativeParseInt(string, radix);
11878 }
11879 // Fallback for environments with pre-ES5 implementations.
11880 if (nativeParseInt(whitespace + '08') != 8) {
11881 parseInt = function(string, radix, guard) {
11882 // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.
11883 // Chrome fails to trim leading <BOM> whitespace characters.
11884 // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.
11885 if (guard ? isIterateeCall(string, radix, guard) : radix == null) {
11886 radix = 0;
11887 } else if (radix) {
11888 radix = +radix;
11889 }
11890 string = trim(string);
11891 return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
11892 };
11893 }
11894
11895 /**
11896 * Repeats the given string `n` times.
11897 *
11898 * @static
11899 * @memberOf _
11900 * @category String
11901 * @param {string} [string=''] The string to repeat.
11902 * @param {number} [n=0] The number of times to repeat the string.
11903 * @returns {string} Returns the repeated string.
11904 * @example
11905 *
11906 * _.repeat('*', 3);
11907 * // => '***'
11908 *
11909 * _.repeat('abc', 2);
11910 * // => 'abcabc'
11911 *
11912 * _.repeat('abc', 0);
11913 * // => ''
11914 */
11915 function repeat(string, n) {
11916 var result = '';
11917 string = baseToString(string);
11918 n = +n;
11919 if (n < 1 || !string || !nativeIsFinite(n)) {
11920 return result;
11921 }
11922 // Leverage the exponentiation by squaring algorithm for a faster repeat.
11923 // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
11924 do {
11925 if (n % 2) {
11926 result += string;
11927 }
11928 n = floor(n / 2);
11929 string += string;
11930 } while (n);
11931
11932 return result;
11933 }
11934
11935 /**
11936 * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
11937 *
11938 * @static
11939 * @memberOf _
11940 * @category String
11941 * @param {string} [string=''] The string to convert.
11942 * @returns {string} Returns the snake cased string.
11943 * @example
11944 *
11945 * _.snakeCase('Foo Bar');
11946 * // => 'foo_bar'
11947 *
11948 * _.snakeCase('fooBar');
11949 * // => 'foo_bar'
11950 *
11951 * _.snakeCase('--foo-bar');
11952 * // => 'foo_bar'
11953 */
11954 var snakeCase = createCompounder(function(result, word, index) {
11955 return result + (index ? '_' : '') + word.toLowerCase();
11956 });
11957
11958 /**
11959 * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
11960 *
11961 * @static
11962 * @memberOf _
11963 * @category String
11964 * @param {string} [string=''] The string to convert.
11965 * @returns {string} Returns the start cased string.
11966 * @example
11967 *
11968 * _.startCase('--foo-bar');
11969 * // => 'Foo Bar'
11970 *
11971 * _.startCase('fooBar');
11972 * // => 'Foo Bar'
11973 *
11974 * _.startCase('__foo_bar__');
11975 * // => 'Foo Bar'
11976 */
11977 var startCase = createCompounder(function(result, word, index) {
11978 return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
11979 });
11980
11981 /**
11982 * Checks if `string` starts with the given target string.
11983 *
11984 * @static
11985 * @memberOf _
11986 * @category String
11987 * @param {string} [string=''] The string to search.
11988 * @param {string} [target] The string to search for.
11989 * @param {number} [position=0] The position to search from.
11990 * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.
11991 * @example
11992 *
11993 * _.startsWith('abc', 'a');
11994 * // => true
11995 *
11996 * _.startsWith('abc', 'b');
11997 * // => false
11998 *
11999 * _.startsWith('abc', 'b', 1);
12000 * // => true
12001 */
12002 function startsWith(string, target, position) {
12003 string = baseToString(string);
12004 position = position == null
12005 ? 0
12006 : nativeMin(position < 0 ? 0 : (+position || 0), string.length);
12007
12008 return string.lastIndexOf(target, position) == position;
12009 }
12010
12011 /**
12012 * Creates a compiled template function that can interpolate data properties
12013 * in "interpolate" delimiters, HTML-escape interpolated data properties in
12014 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
12015 * properties may be accessed as free variables in the template. If a setting
12016 * object is provided it takes precedence over `_.templateSettings` values.
12017 *
12018 * **Note:** In the development build `_.template` utilizes
12019 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
12020 * for easier debugging.
12021 *
12022 * For more information on precompiling templates see
12023 * [lodash's custom builds documentation](https://lodash.com/custom-builds).
12024 *
12025 * For more information on Chrome extension sandboxes see
12026 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
12027 *
12028 * @static
12029 * @memberOf _
12030 * @category String
12031 * @param {string} [string=''] The template string.
12032 * @param {Object} [options] The options object.
12033 * @param {RegExp} [options.escape] The HTML "escape" delimiter.
12034 * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
12035 * @param {Object} [options.imports] An object to import into the template as free variables.
12036 * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
12037 * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.
12038 * @param {string} [options.variable] The data object variable name.
12039 * @param- {Object} [otherOptions] Enables the legacy `options` param signature.
12040 * @returns {Function} Returns the compiled template function.
12041 * @example
12042 *
12043 * // using the "interpolate" delimiter to create a compiled template
12044 * var compiled = _.template('hello <%= user %>!');
12045 * compiled({ 'user': 'fred' });
12046 * // => 'hello fred!'
12047 *
12048 * // using the HTML "escape" delimiter to escape data property values
12049 * var compiled = _.template('<b><%- value %></b>');
12050 * compiled({ 'value': '<script>' });
12051 * // => '<b>&lt;script&gt;</b>'
12052 *
12053 * // using the "evaluate" delimiter to execute JavaScript and generate HTML
12054 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
12055 * compiled({ 'users': ['fred', 'barney'] });
12056 * // => '<li>fred</li><li>barney</li>'
12057 *
12058 * // using the internal `print` function in "evaluate" delimiters
12059 * var compiled = _.template('<% print("hello " + user); %>!');
12060 * compiled({ 'user': 'barney' });
12061 * // => 'hello barney!'
12062 *
12063 * // using the ES delimiter as an alternative to the default "interpolate" delimiter
12064 * var compiled = _.template('hello ${ user }!');
12065 * compiled({ 'user': 'pebbles' });
12066 * // => 'hello pebbles!'
12067 *
12068 * // using custom template delimiters
12069 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
12070 * var compiled = _.template('hello {{ user }}!');
12071 * compiled({ 'user': 'mustache' });
12072 * // => 'hello mustache!'
12073 *
12074 * // using backslashes to treat delimiters as plain text
12075 * var compiled = _.template('<%= "\\<%- value %\\>" %>');
12076 * compiled({ 'value': 'ignored' });
12077 * // => '<%- value %>'
12078 *
12079 * // using the `imports` option to import `jQuery` as `jq`
12080 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
12081 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
12082 * compiled({ 'users': ['fred', 'barney'] });
12083 * // => '<li>fred</li><li>barney</li>'
12084 *
12085 * // using the `sourceURL` option to specify a custom sourceURL for the template
12086 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
12087 * compiled(data);
12088 * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
12089 *
12090 * // using the `variable` option to ensure a with-statement isn't used in the compiled template
12091 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
12092 * compiled.source;
12093 * // => function(data) {
12094 * // var __t, __p = '';
12095 * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
12096 * // return __p;
12097 * // }
12098 *
12099 * // using the `source` property to inline compiled templates for meaningful
12100 * // line numbers in error messages and a stack trace
12101 * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
12102 * var JST = {\
12103 * "main": ' + _.template(mainText).source + '\
12104 * };\
12105 * ');
12106 */
12107 function template(string, options, otherOptions) {
12108 // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)
12109 // and Laura Doktorova's doT.js (https://github.com/olado/doT).
12110 var settings = lodash.templateSettings;
12111
12112 if (otherOptions && isIterateeCall(string, options, otherOptions)) {
12113 options = otherOptions = null;
12114 }
12115 string = baseToString(string);
12116 options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
12117
12118 var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
12119 importsKeys = keys(imports),
12120 importsValues = baseValues(imports, importsKeys);
12121
12122 var isEscaping,
12123 isEvaluating,
12124 index = 0,
12125 interpolate = options.interpolate || reNoMatch,
12126 source = "__p += '";
12127
12128 // Compile the regexp to match each delimiter.
12129 var reDelimiters = RegExp(
12130 (options.escape || reNoMatch).source + '|' +
12131 interpolate.source + '|' +
12132 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
12133 (options.evaluate || reNoMatch).source + '|$'
12134 , 'g');
12135
12136 // Use a sourceURL for easier debugging.
12137 var sourceURL = '//# sourceURL=' +
12138 ('sourceURL' in options
12139 ? options.sourceURL
12140 : ('lodash.templateSources[' + (++templateCounter) + ']')
12141 ) + '\n';
12142
12143 string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
12144 interpolateValue || (interpolateValue = esTemplateValue);
12145
12146 // Escape characters that can't be included in string literals.
12147 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
12148
12149 // Replace delimiters with snippets.
12150 if (escapeValue) {
12151 isEscaping = true;
12152 source += "' +\n__e(" + escapeValue + ") +\n'";
12153 }
12154 if (evaluateValue) {
12155 isEvaluating = true;
12156 source += "';\n" + evaluateValue + ";\n__p += '";
12157 }
12158 if (interpolateValue) {
12159 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
12160 }
12161 index = offset + match.length;
12162
12163 // The JS engine embedded in Adobe products requires returning the `match`
12164 // string in order to produce the correct `offset` value.
12165 return match;
12166 });
12167
12168 source += "';\n";
12169
12170 // If `variable` is not specified wrap a with-statement around the generated
12171 // code to add the data object to the top of the scope chain.
12172 var variable = options.variable;
12173 if (!variable) {
12174 source = 'with (obj) {\n' + source + '\n}\n';
12175 }
12176 // Cleanup code by stripping empty strings.
12177 source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
12178 .replace(reEmptyStringMiddle, '$1')
12179 .replace(reEmptyStringTrailing, '$1;');
12180
12181 // Frame code as the function body.
12182 source = 'function(' + (variable || 'obj') + ') {\n' +
12183 (variable
12184 ? ''
12185 : 'obj || (obj = {});\n'
12186 ) +
12187 "var __t, __p = ''" +
12188 (isEscaping
12189 ? ', __e = _.escape'
12190 : ''
12191 ) +
12192 (isEvaluating
12193 ? ', __j = Array.prototype.join;\n' +
12194 "function print() { __p += __j.call(arguments, '') }\n"
12195 : ';\n'
12196 ) +
12197 source +
12198 'return __p\n}';
12199
12200 var result = attempt(function() {
12201 return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);
12202 });
12203
12204 // Provide the compiled function's source by its `toString` method or
12205 // the `source` property as a convenience for inlining compiled templates.
12206 result.source = source;
12207 if (isError(result)) {
12208 throw result;
12209 }
12210 return result;
12211 }
12212
12213 /**
12214 * Removes leading and trailing whitespace or specified characters from `string`.
12215 *
12216 * @static
12217 * @memberOf _
12218 * @category String
12219 * @param {string} [string=''] The string to trim.
12220 * @param {string} [chars=whitespace] The characters to trim.
12221 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12222 * @returns {string} Returns the trimmed string.
12223 * @example
12224 *
12225 * _.trim(' abc ');
12226 * // => 'abc'
12227 *
12228 * _.trim('-_-abc-_-', '_-');
12229 * // => 'abc'
12230 *
12231 * _.map([' foo ', ' bar '], _.trim);
12232 * // => ['foo', 'bar']
12233 */
12234 function trim(string, chars, guard) {
12235 var value = string;
12236 string = baseToString(string);
12237 if (!string) {
12238 return string;
12239 }
12240 if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
12241 return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);
12242 }
12243 chars = (chars + '');
12244 return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);
12245 }
12246
12247 /**
12248 * Removes leading whitespace or specified characters from `string`.
12249 *
12250 * @static
12251 * @memberOf _
12252 * @category String
12253 * @param {string} [string=''] The string to trim.
12254 * @param {string} [chars=whitespace] The characters to trim.
12255 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12256 * @returns {string} Returns the trimmed string.
12257 * @example
12258 *
12259 * _.trimLeft(' abc ');
12260 * // => 'abc '
12261 *
12262 * _.trimLeft('-_-abc-_-', '_-');
12263 * // => 'abc-_-'
12264 */
12265 function trimLeft(string, chars, guard) {
12266 var value = string;
12267 string = baseToString(string);
12268 if (!string) {
12269 return string;
12270 }
12271 if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
12272 return string.slice(trimmedLeftIndex(string));
12273 }
12274 return string.slice(charsLeftIndex(string, (chars + '')));
12275 }
12276
12277 /**
12278 * Removes trailing whitespace or specified characters from `string`.
12279 *
12280 * @static
12281 * @memberOf _
12282 * @category String
12283 * @param {string} [string=''] The string to trim.
12284 * @param {string} [chars=whitespace] The characters to trim.
12285 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12286 * @returns {string} Returns the trimmed string.
12287 * @example
12288 *
12289 * _.trimRight(' abc ');
12290 * // => ' abc'
12291 *
12292 * _.trimRight('-_-abc-_-', '_-');
12293 * // => '-_-abc'
12294 */
12295 function trimRight(string, chars, guard) {
12296 var value = string;
12297 string = baseToString(string);
12298 if (!string) {
12299 return string;
12300 }
12301 if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
12302 return string.slice(0, trimmedRightIndex(string) + 1);
12303 }
12304 return string.slice(0, charsRightIndex(string, (chars + '')) + 1);
12305 }
12306
12307 /**
12308 * Truncates `string` if it is longer than the given maximum string length.
12309 * The last characters of the truncated string are replaced with the omission
12310 * string which defaults to "...".
12311 *
12312 * @static
12313 * @memberOf _
12314 * @category String
12315 * @param {string} [string=''] The string to truncate.
12316 * @param {Object|number} [options] The options object or maximum string length.
12317 * @param {number} [options.length=30] The maximum string length.
12318 * @param {string} [options.omission='...'] The string to indicate text is omitted.
12319 * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
12320 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12321 * @returns {string} Returns the truncated string.
12322 * @example
12323 *
12324 * _.trunc('hi-diddly-ho there, neighborino');
12325 * // => 'hi-diddly-ho there, neighbo...'
12326 *
12327 * _.trunc('hi-diddly-ho there, neighborino', 24);
12328 * // => 'hi-diddly-ho there, n...'
12329 *
12330 * _.trunc('hi-diddly-ho there, neighborino', {
12331 * 'length': 24,
12332 * 'separator': ' '
12333 * });
12334 * // => 'hi-diddly-ho there,...'
12335 *
12336 * _.trunc('hi-diddly-ho there, neighborino', {
12337 * 'length': 24,
12338 * 'separator': /,? +/
12339 * });
12340 * // => 'hi-diddly-ho there...'
12341 *
12342 * _.trunc('hi-diddly-ho there, neighborino', {
12343 * 'omission': ' [...]'
12344 * });
12345 * // => 'hi-diddly-ho there, neig [...]'
12346 */
12347 function trunc(string, options, guard) {
12348 if (guard && isIterateeCall(string, options, guard)) {
12349 options = null;
12350 }
12351 var length = DEFAULT_TRUNC_LENGTH,
12352 omission = DEFAULT_TRUNC_OMISSION;
12353
12354 if (options != null) {
12355 if (isObject(options)) {
12356 var separator = 'separator' in options ? options.separator : separator;
12357 length = 'length' in options ? (+options.length || 0) : length;
12358 omission = 'omission' in options ? baseToString(options.omission) : omission;
12359 } else {
12360 length = +options || 0;
12361 }
12362 }
12363 string = baseToString(string);
12364 if (length >= string.length) {
12365 return string;
12366 }
12367 var end = length - omission.length;
12368 if (end < 1) {
12369 return omission;
12370 }
12371 var result = string.slice(0, end);
12372 if (separator == null) {
12373 return result + omission;
12374 }
12375 if (isRegExp(separator)) {
12376 if (string.slice(end).search(separator)) {
12377 var match,
12378 newEnd,
12379 substring = string.slice(0, end);
12380
12381 if (!separator.global) {
12382 separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');
12383 }
12384 separator.lastIndex = 0;
12385 while ((match = separator.exec(substring))) {
12386 newEnd = match.index;
12387 }
12388 result = result.slice(0, newEnd == null ? end : newEnd);
12389 }
12390 } else if (string.indexOf(separator, end) != end) {
12391 var index = result.lastIndexOf(separator);
12392 if (index > -1) {
12393 result = result.slice(0, index);
12394 }
12395 }
12396 return result + omission;
12397 }
12398
12399 /**
12400 * The inverse of `_.escape`; this method converts the HTML entities
12401 * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their
12402 * corresponding characters.
12403 *
12404 * **Note:** No other HTML entities are unescaped. To unescape additional HTML
12405 * entities use a third-party library like [_he_](https://mths.be/he).
12406 *
12407 * @static
12408 * @memberOf _
12409 * @category String
12410 * @param {string} [string=''] The string to unescape.
12411 * @returns {string} Returns the unescaped string.
12412 * @example
12413 *
12414 * _.unescape('fred, barney, &amp; pebbles');
12415 * // => 'fred, barney, & pebbles'
12416 */
12417 function unescape(string) {
12418 string = baseToString(string);
12419 return (string && reHasEscapedHtml.test(string))
12420 ? string.replace(reEscapedHtml, unescapeHtmlChar)
12421 : string;
12422 }
12423
12424 /**
12425 * Splits `string` into an array of its words.
12426 *
12427 * @static
12428 * @memberOf _
12429 * @category String
12430 * @param {string} [string=''] The string to inspect.
12431 * @param {RegExp|string} [pattern] The pattern to match words.
12432 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12433 * @returns {Array} Returns the words of `string`.
12434 * @example
12435 *
12436 * _.words('fred, barney, & pebbles');
12437 * // => ['fred', 'barney', 'pebbles']
12438 *
12439 * _.words('fred, barney, & pebbles', /[^, ]+/g);
12440 * // => ['fred', 'barney', '&', 'pebbles']
12441 */
12442 function words(string, pattern, guard) {
12443 if (guard && isIterateeCall(string, pattern, guard)) {
12444 pattern = null;
12445 }
12446 string = baseToString(string);
12447 return string.match(pattern || reWords) || [];
12448 }
12449
12450 /*------------------------------------------------------------------------*/
12451
12452 /**
12453 * Attempts to invoke `func`, returning either the result or the caught error
12454 * object. Any additional arguments are provided to `func` when it is invoked.
12455 *
12456 * @static
12457 * @memberOf _
12458 * @category Utility
12459 * @param {Function} func The function to attempt.
12460 * @returns {*} Returns the `func` result or error object.
12461 * @example
12462 *
12463 * // avoid throwing errors for invalid selectors
12464 * var elements = _.attempt(function(selector) {
12465 * return document.querySelectorAll(selector);
12466 * }, '>_>');
12467 *
12468 * if (_.isError(elements)) {
12469 * elements = [];
12470 * }
12471 */
12472 var attempt = restParam(function(func, args) {
12473 try {
12474 return func.apply(undefined, args);
12475 } catch(e) {
12476 return isError(e) ? e : new Error(e);
12477 }
12478 });
12479
12480 /**
12481 * Creates a function that invokes `func` with the `this` binding of `thisArg`
12482 * and arguments of the created function. If `func` is a property name the
12483 * created callback returns the property value for a given element. If `func`
12484 * is an object the created callback returns `true` for elements that contain
12485 * the equivalent object properties, otherwise it returns `false`.
12486 *
12487 * @static
12488 * @memberOf _
12489 * @alias iteratee
12490 * @category Utility
12491 * @param {*} [func=_.identity] The value to convert to a callback.
12492 * @param {*} [thisArg] The `this` binding of `func`.
12493 * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
12494 * @returns {Function} Returns the callback.
12495 * @example
12496 *
12497 * var users = [
12498 * { 'user': 'barney', 'age': 36 },
12499 * { 'user': 'fred', 'age': 40 }
12500 * ];
12501 *
12502 * // wrap to create custom callback shorthands
12503 * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {
12504 * var match = /^(.+?)__([gl]t)(.+)$/.exec(func);
12505 * if (!match) {
12506 * return callback(func, thisArg);
12507 * }
12508 * return function(object) {
12509 * return match[2] == 'gt'
12510 * ? object[match[1]] > match[3]
12511 * : object[match[1]] < match[3];
12512 * };
12513 * });
12514 *
12515 * _.filter(users, 'age__gt36');
12516 * // => [{ 'user': 'fred', 'age': 40 }]
12517 */
12518 function callback(func, thisArg, guard) {
12519 if (guard && isIterateeCall(func, thisArg, guard)) {
12520 thisArg = null;
12521 }
12522 return baseCallback(func, thisArg);
12523 }
12524
12525 /**
12526 * Creates a function that returns `value`.
12527 *
12528 * @static
12529 * @memberOf _
12530 * @category Utility
12531 * @param {*} value The value to return from the new function.
12532 * @returns {Function} Returns the new function.
12533 * @example
12534 *
12535 * var object = { 'user': 'fred' };
12536 * var getter = _.constant(object);
12537 *
12538 * getter() === object;
12539 * // => true
12540 */
12541 function constant(value) {
12542 return function() {
12543 return value;
12544 };
12545 }
12546
12547 /**
12548 * This method returns the first argument provided to it.
12549 *
12550 * @static
12551 * @memberOf _
12552 * @category Utility
12553 * @param {*} value Any value.
12554 * @returns {*} Returns `value`.
12555 * @example
12556 *
12557 * var object = { 'user': 'fred' };
12558 *
12559 * _.identity(object) === object;
12560 * // => true
12561 */
12562 function identity(value) {
12563 return value;
12564 }
12565
12566 /**
12567 * Creates a function which performs a deep comparison between a given object
12568 * and `source`, returning `true` if the given object has equivalent property
12569 * values, else `false`.
12570 *
12571 * **Note:** This method supports comparing arrays, booleans, `Date` objects,
12572 * numbers, `Object` objects, regexes, and strings. Objects are compared by
12573 * their own, not inherited, enumerable properties. For comparing a single
12574 * own or inherited property value see `_.matchesProperty`.
12575 *
12576 * @static
12577 * @memberOf _
12578 * @category Utility
12579 * @param {Object} source The object of property values to match.
12580 * @returns {Function} Returns the new function.
12581 * @example
12582 *
12583 * var users = [
12584 * { 'user': 'barney', 'age': 36, 'active': true },
12585 * { 'user': 'fred', 'age': 40, 'active': false }
12586 * ];
12587 *
12588 * _.filter(users, _.matches({ 'age': 40, 'active': false }));
12589 * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
12590 */
12591 function matches(source) {
12592 return baseMatches(baseClone(source, true));
12593 }
12594
12595 /**
12596 * Creates a function which compares the property value of `path` on a given
12597 * object to `value`.
12598 *
12599 * **Note:** This method supports comparing arrays, booleans, `Date` objects,
12600 * numbers, `Object` objects, regexes, and strings. Objects are compared by
12601 * their own, not inherited, enumerable properties.
12602 *
12603 * @static
12604 * @memberOf _
12605 * @category Utility
12606 * @param {Array|string} path The path of the property to get.
12607 * @param {*} value The value to compare.
12608 * @returns {Function} Returns the new function.
12609 * @example
12610 *
12611 * var users = [
12612 * { 'user': 'barney' },
12613 * { 'user': 'fred' }
12614 * ];
12615 *
12616 * _.find(users, _.matchesProperty('user', 'fred'));
12617 * // => { 'user': 'fred' }
12618 */
12619 function matchesProperty(path, value) {
12620 return baseMatchesProperty(path, baseClone(value, true));
12621 }
12622
12623 /**
12624 * Creates a function which invokes the method at `path` on a given object.
12625 *
12626 * @static
12627 * @memberOf _
12628 * @category Utility
12629 * @param {Array|string} path The path of the method to invoke.
12630 * @returns {Function} Returns the new function.
12631 * @example
12632 *
12633 * var objects = [
12634 * { 'a': { 'b': { 'c': _.constant(2) } } },
12635 * { 'a': { 'b': { 'c': _.constant(1) } } }
12636 * ];
12637 *
12638 * _.map(objects, _.method('a.b.c'));
12639 * // => [2, 1]
12640 *
12641 * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');
12642 * // => [1, 2]
12643 */
12644 var method = restParam(function(path, args) {
12645 return function(object) {
12646 return invokePath(object, path, args);
12647 }
12648 });
12649
12650 /**
12651 * The opposite of `_.method`; this method creates a function which invokes
12652 * the method at a given path on `object`.
12653 *
12654 * @static
12655 * @memberOf _
12656 * @category Utility
12657 * @param {Object} object The object to query.
12658 * @returns {Function} Returns the new function.
12659 * @example
12660 *
12661 * var array = _.times(3, _.constant),
12662 * object = { 'a': array, 'b': array, 'c': array };
12663 *
12664 * _.map(['a[2]', 'c[0]'], _.methodOf(object));
12665 * // => [2, 0]
12666 *
12667 * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
12668 * // => [2, 0]
12669 */
12670 var methodOf = restParam(function(object, args) {
12671 return function(path) {
12672 return invokePath(object, path, args);
12673 };
12674 });
12675
12676 /**
12677 * Adds all own enumerable function properties of a source object to the
12678 * destination object. If `object` is a function then methods are added to
12679 * its prototype as well.
12680 *
12681 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
12682 * avoid conflicts caused by modifying the original.
12683 *
12684 * @static
12685 * @memberOf _
12686 * @category Utility
12687 * @param {Function|Object} [object=lodash] The destination object.
12688 * @param {Object} source The object of functions to add.
12689 * @param {Object} [options] The options object.
12690 * @param {boolean} [options.chain=true] Specify whether the functions added
12691 * are chainable.
12692 * @returns {Function|Object} Returns `object`.
12693 * @example
12694 *
12695 * function vowels(string) {
12696 * return _.filter(string, function(v) {
12697 * return /[aeiou]/i.test(v);
12698 * });
12699 * }
12700 *
12701 * // use `_.runInContext` to avoid conflicts (esp. in Node.js)
12702 * var _ = require('lodash').runInContext();
12703 *
12704 * _.mixin({ 'vowels': vowels });
12705 * _.vowels('fred');
12706 * // => ['e']
12707 *
12708 * _('fred').vowels().value();
12709 * // => ['e']
12710 *
12711 * _.mixin({ 'vowels': vowels }, { 'chain': false });
12712 * _('fred').vowels();
12713 * // => ['e']
12714 */
12715 function mixin(object, source, options) {
12716 if (options == null) {
12717 var isObj = isObject(source),
12718 props = isObj && keys(source),
12719 methodNames = props && props.length && baseFunctions(source, props);
12720
12721 if (!(methodNames ? methodNames.length : isObj)) {
12722 methodNames = false;
12723 options = source;
12724 source = object;
12725 object = this;
12726 }
12727 }
12728 if (!methodNames) {
12729 methodNames = baseFunctions(source, keys(source));
12730 }
12731 var chain = true,
12732 index = -1,
12733 isFunc = isFunction(object),
12734 length = methodNames.length;
12735
12736 if (options === false) {
12737 chain = false;
12738 } else if (isObject(options) && 'chain' in options) {
12739 chain = options.chain;
12740 }
12741 while (++index < length) {
12742 var methodName = methodNames[index],
12743 func = source[methodName];
12744
12745 object[methodName] = func;
12746 if (isFunc) {
12747 object.prototype[methodName] = (function(func) {
12748 return function() {
12749 var chainAll = this.__chain__;
12750 if (chain || chainAll) {
12751 var result = object(this.__wrapped__),
12752 actions = result.__actions__ = arrayCopy(this.__actions__);
12753
12754 actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
12755 result.__chain__ = chainAll;
12756 return result;
12757 }
12758 var args = [this.value()];
12759 push.apply(args, arguments);
12760 return func.apply(object, args);
12761 };
12762 }(func));
12763 }
12764 }
12765 return object;
12766 }
12767
12768 /**
12769 * Reverts the `_` variable to its previous value and returns a reference to
12770 * the `lodash` function.
12771 *
12772 * @static
12773 * @memberOf _
12774 * @category Utility
12775 * @returns {Function} Returns the `lodash` function.
12776 * @example
12777 *
12778 * var lodash = _.noConflict();
12779 */
12780 function noConflict() {
12781 context._ = oldDash;
12782 return this;
12783 }
12784
12785 /**
12786 * A no-operation function which returns `undefined` regardless of the
12787 * arguments it receives.
12788 *
12789 * @static
12790 * @memberOf _
12791 * @category Utility
12792 * @example
12793 *
12794 * var object = { 'user': 'fred' };
12795 *
12796 * _.noop(object) === undefined;
12797 * // => true
12798 */
12799 function noop() {
12800 // No operation performed.
12801 }
12802
12803 /**
12804 * Creates a function which returns the property value at `path` on a
12805 * given object.
12806 *
12807 * @static
12808 * @memberOf _
12809 * @category Utility
12810 * @param {Array|string} path The path of the property to get.
12811 * @returns {Function} Returns the new function.
12812 * @example
12813 *
12814 * var objects = [
12815 * { 'a': { 'b': { 'c': 2 } } },
12816 * { 'a': { 'b': { 'c': 1 } } }
12817 * ];
12818 *
12819 * _.map(objects, _.property('a.b.c'));
12820 * // => [2, 1]
12821 *
12822 * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
12823 * // => [1, 2]
12824 */
12825 function property(path) {
12826 return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
12827 }
12828
12829 /**
12830 * The opposite of `_.property`; this method creates a function which returns
12831 * the property value at a given path on `object`.
12832 *
12833 * @static
12834 * @memberOf _
12835 * @category Utility
12836 * @param {Object} object The object to query.
12837 * @returns {Function} Returns the new function.
12838 * @example
12839 *
12840 * var array = [0, 1, 2],
12841 * object = { 'a': array, 'b': array, 'c': array };
12842 *
12843 * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
12844 * // => [2, 0]
12845 *
12846 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
12847 * // => [2, 0]
12848 */
12849 function propertyOf(object) {
12850 return function(path) {
12851 return baseGet(object, toPath(path), path + '');
12852 };
12853 }
12854
12855 /**
12856 * Creates an array of numbers (positive and/or negative) progressing from
12857 * `start` up to, but not including, `end`. If `end` is not specified it is
12858 * set to `start` with `start` then set to `0`. If `end` is less than `start`
12859 * a zero-length range is created unless a negative `step` is specified.
12860 *
12861 * @static
12862 * @memberOf _
12863 * @category Utility
12864 * @param {number} [start=0] The start of the range.
12865 * @param {number} end The end of the range.
12866 * @param {number} [step=1] The value to increment or decrement by.
12867 * @returns {Array} Returns the new array of numbers.
12868 * @example
12869 *
12870 * _.range(4);
12871 * // => [0, 1, 2, 3]
12872 *
12873 * _.range(1, 5);
12874 * // => [1, 2, 3, 4]
12875 *
12876 * _.range(0, 20, 5);
12877 * // => [0, 5, 10, 15]
12878 *
12879 * _.range(0, -4, -1);
12880 * // => [0, -1, -2, -3]
12881 *
12882 * _.range(1, 4, 0);
12883 * // => [1, 1, 1]
12884 *
12885 * _.range(0);
12886 * // => []
12887 */
12888 function range(start, end, step) {
12889 if (step && isIterateeCall(start, end, step)) {
12890 end = step = null;
12891 }
12892 start = +start || 0;
12893 step = step == null ? 1 : (+step || 0);
12894
12895 if (end == null) {
12896 end = start;
12897 start = 0;
12898 } else {
12899 end = +end || 0;
12900 }
12901 // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.
12902 // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.
12903 var index = -1,
12904 length = nativeMax(ceil((end - start) / (step || 1)), 0),
12905 result = Array(length);
12906
12907 while (++index < length) {
12908 result[index] = start;
12909 start += step;
12910 }
12911 return result;
12912 }
12913
12914 /**
12915 * Invokes the iteratee function `n` times, returning an array of the results
12916 * of each invocation. The `iteratee` is bound to `thisArg` and invoked with
12917 * one argument; (index).
12918 *
12919 * @static
12920 * @memberOf _
12921 * @category Utility
12922 * @param {number} n The number of times to invoke `iteratee`.
12923 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12924 * @param {*} [thisArg] The `this` binding of `iteratee`.
12925 * @returns {Array} Returns the array of results.
12926 * @example
12927 *
12928 * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));
12929 * // => [3, 6, 4]
12930 *
12931 * _.times(3, function(n) {
12932 * mage.castSpell(n);
12933 * });
12934 * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`
12935 *
12936 * _.times(3, function(n) {
12937 * this.cast(n);
12938 * }, mage);
12939 * // => also invokes `mage.castSpell(n)` three times
12940 */
12941 function times(n, iteratee, thisArg) {
12942 n = floor(n);
12943
12944 // Exit early to avoid a JSC JIT bug in Safari 8
12945 // where `Array(0)` is treated as `Array(1)`.
12946 if (n < 1 || !nativeIsFinite(n)) {
12947 return [];
12948 }
12949 var index = -1,
12950 result = Array(nativeMin(n, MAX_ARRAY_LENGTH));
12951
12952 iteratee = bindCallback(iteratee, thisArg, 1);
12953 while (++index < n) {
12954 if (index < MAX_ARRAY_LENGTH) {
12955 result[index] = iteratee(index);
12956 } else {
12957 iteratee(index);
12958 }
12959 }
12960 return result;
12961 }
12962
12963 /**
12964 * Generates a unique ID. If `prefix` is provided the ID is appended to it.
12965 *
12966 * @static
12967 * @memberOf _
12968 * @category Utility
12969 * @param {string} [prefix] The value to prefix the ID with.
12970 * @returns {string} Returns the unique ID.
12971 * @example
12972 *
12973 * _.uniqueId('contact_');
12974 * // => 'contact_104'
12975 *
12976 * _.uniqueId();
12977 * // => '105'
12978 */
12979 function uniqueId(prefix) {
12980 var id = ++idCounter;
12981 return baseToString(prefix) + id;
12982 }
12983
12984 /*------------------------------------------------------------------------*/
12985
12986 /**
12987 * Adds two numbers.
12988 *
12989 * @static
12990 * @memberOf _
12991 * @category Math
12992 * @param {number} augend The first number to add.
12993 * @param {number} addend The second number to add.
12994 * @returns {number} Returns the sum.
12995 * @example
12996 *
12997 * _.add(6, 4);
12998 * // => 10
12999 */
13000 function add(augend, addend) {
13001 return (+augend || 0) + (+addend || 0);
13002 }
13003
13004 /**
13005 * Gets the maximum value of `collection`. If `collection` is empty or falsey
13006 * `-Infinity` is returned. If an iteratee function is provided it is invoked
13007 * for each value in `collection` to generate the criterion by which the value
13008 * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
13009 * arguments: (value, index, collection).
13010 *
13011 * If a property name is provided for `iteratee` the created `_.property`
13012 * style callback returns the property value of the given element.
13013 *
13014 * If a value is also provided for `thisArg` the created `_.matchesProperty`
13015 * style callback returns `true` for elements that have a matching property
13016 * value, else `false`.
13017 *
13018 * If an object is provided for `iteratee` the created `_.matches` style
13019 * callback returns `true` for elements that have the properties of the given
13020 * object, else `false`.
13021 *
13022 * @static
13023 * @memberOf _
13024 * @category Math
13025 * @param {Array|Object|string} collection The collection to iterate over.
13026 * @param {Function|Object|string} [iteratee] The function invoked per iteration.
13027 * @param {*} [thisArg] The `this` binding of `iteratee`.
13028 * @returns {*} Returns the maximum value.
13029 * @example
13030 *
13031 * _.max([4, 2, 8, 6]);
13032 * // => 8
13033 *
13034 * _.max([]);
13035 * // => -Infinity
13036 *
13037 * var users = [
13038 * { 'user': 'barney', 'age': 36 },
13039 * { 'user': 'fred', 'age': 40 }
13040 * ];
13041 *
13042 * _.max(users, function(chr) {
13043 * return chr.age;
13044 * });
13045 * // => { 'user': 'fred', 'age': 40 }
13046 *
13047 * // using the `_.property` callback shorthand
13048 * _.max(users, 'age');
13049 * // => { 'user': 'fred', 'age': 40 }
13050 */
13051 var max = createExtremum(arrayMax);
13052
13053 /**
13054 * Gets the minimum value of `collection`. If `collection` is empty or falsey
13055 * `Infinity` is returned. If an iteratee function is provided it is invoked
13056 * for each value in `collection` to generate the criterion by which the value
13057 * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
13058 * arguments: (value, index, collection).
13059 *
13060 * If a property name is provided for `iteratee` the created `_.property`
13061 * style callback returns the property value of the given element.
13062 *
13063 * If a value is also provided for `thisArg` the created `_.matchesProperty`
13064 * style callback returns `true` for elements that have a matching property
13065 * value, else `false`.
13066 *
13067 * If an object is provided for `iteratee` the created `_.matches` style
13068 * callback returns `true` for elements that have the properties of the given
13069 * object, else `false`.
13070 *
13071 * @static
13072 * @memberOf _
13073 * @category Math
13074 * @param {Array|Object|string} collection The collection to iterate over.
13075 * @param {Function|Object|string} [iteratee] The function invoked per iteration.
13076 * @param {*} [thisArg] The `this` binding of `iteratee`.
13077 * @returns {*} Returns the minimum value.
13078 * @example
13079 *
13080 * _.min([4, 2, 8, 6]);
13081 * // => 2
13082 *
13083 * _.min([]);
13084 * // => Infinity
13085 *
13086 * var users = [
13087 * { 'user': 'barney', 'age': 36 },
13088 * { 'user': 'fred', 'age': 40 }
13089 * ];
13090 *
13091 * _.min(users, function(chr) {
13092 * return chr.age;
13093 * });
13094 * // => { 'user': 'barney', 'age': 36 }
13095 *
13096 * // using the `_.property` callback shorthand
13097 * _.min(users, 'age');
13098 * // => { 'user': 'barney', 'age': 36 }
13099 */
13100 var min = createExtremum(arrayMin, true);
13101
13102 /**
13103 * Gets the sum of the values in `collection`.
13104 *
13105 * @static
13106 * @memberOf _
13107 * @category Math
13108 * @param {Array|Object|string} collection The collection to iterate over.
13109 * @param {Function|Object|string} [iteratee] The function invoked per iteration.
13110 * @param {*} [thisArg] The `this` binding of `iteratee`.
13111 * @returns {number} Returns the sum.
13112 * @example
13113 *
13114 * _.sum([4, 6]);
13115 * // => 10
13116 *
13117 * _.sum({ 'a': 4, 'b': 6 });
13118 * // => 10
13119 *
13120 * var objects = [
13121 * { 'n': 4 },
13122 * { 'n': 6 }
13123 * ];
13124 *
13125 * _.sum(objects, function(object) {
13126 * return object.n;
13127 * });
13128 * // => 10
13129 *
13130 * // using the `_.property` callback shorthand
13131 * _.sum(objects, 'n');
13132 * // => 10
13133 */
13134 function sum(collection, iteratee, thisArg) {
13135 if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
13136 iteratee = null;
13137 }
13138 var func = getCallback(),
13139 noIteratee = iteratee == null;
13140
13141 if (!(func === baseCallback && noIteratee)) {
13142 noIteratee = false;
13143 iteratee = func(iteratee, thisArg, 3);
13144 }
13145 return noIteratee
13146 ? arraySum(isArray(collection) ? collection : toIterable(collection))
13147 : baseSum(collection, iteratee);
13148 }
13149
13150 /*------------------------------------------------------------------------*/
13151
13152 // Ensure wrappers are instances of `baseLodash`.
13153 lodash.prototype = baseLodash.prototype;
13154
13155 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
13156 LodashWrapper.prototype.constructor = LodashWrapper;
13157
13158 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
13159 LazyWrapper.prototype.constructor = LazyWrapper;
13160
13161 // Add functions to the `Map` cache.
13162 MapCache.prototype['delete'] = mapDelete;
13163 MapCache.prototype.get = mapGet;
13164 MapCache.prototype.has = mapHas;
13165 MapCache.prototype.set = mapSet;
13166
13167 // Add functions to the `Set` cache.
13168 SetCache.prototype.push = cachePush;
13169
13170 // Assign cache to `_.memoize`.
13171 memoize.Cache = MapCache;
13172
13173 // Add functions that return wrapped values when chaining.
13174 lodash.after = after;
13175 lodash.ary = ary;
13176 lodash.assign = assign;
13177 lodash.at = at;
13178 lodash.before = before;
13179 lodash.bind = bind;
13180 lodash.bindAll = bindAll;
13181 lodash.bindKey = bindKey;
13182 lodash.callback = callback;
13183 lodash.chain = chain;
13184 lodash.chunk = chunk;
13185 lodash.compact = compact;
13186 lodash.constant = constant;
13187 lodash.countBy = countBy;
13188 lodash.create = create;
13189 lodash.curry = curry;
13190 lodash.curryRight = curryRight;
13191 lodash.debounce = debounce;
13192 lodash.defaults = defaults;
13193 lodash.defer = defer;
13194 lodash.delay = delay;
13195 lodash.difference = difference;
13196 lodash.drop = drop;
13197 lodash.dropRight = dropRight;
13198 lodash.dropRightWhile = dropRightWhile;
13199 lodash.dropWhile = dropWhile;
13200 lodash.fill = fill;
13201 lodash.filter = filter;
13202 lodash.flatten = flatten;
13203 lodash.flattenDeep = flattenDeep;
13204 lodash.flow = flow;
13205 lodash.flowRight = flowRight;
13206 lodash.forEach = forEach;
13207 lodash.forEachRight = forEachRight;
13208 lodash.forIn = forIn;
13209 lodash.forInRight = forInRight;
13210 lodash.forOwn = forOwn;
13211 lodash.forOwnRight = forOwnRight;
13212 lodash.functions = functions;
13213 lodash.groupBy = groupBy;
13214 lodash.indexBy = indexBy;
13215 lodash.initial = initial;
13216 lodash.intersection = intersection;
13217 lodash.invert = invert;
13218 lodash.invoke = invoke;
13219 lodash.keys = keys;
13220 lodash.keysIn = keysIn;
13221 lodash.map = map;
13222 lodash.mapValues = mapValues;
13223 lodash.matches = matches;
13224 lodash.matchesProperty = matchesProperty;
13225 lodash.memoize = memoize;
13226 lodash.merge = merge;
13227 lodash.method = method;
13228 lodash.methodOf = methodOf;
13229 lodash.mixin = mixin;
13230 lodash.negate = negate;
13231 lodash.omit = omit;
13232 lodash.once = once;
13233 lodash.pairs = pairs;
13234 lodash.partial = partial;
13235 lodash.partialRight = partialRight;
13236 lodash.partition = partition;
13237 lodash.pick = pick;
13238 lodash.pluck = pluck;
13239 lodash.property = property;
13240 lodash.propertyOf = propertyOf;
13241 lodash.pull = pull;
13242 lodash.pullAt = pullAt;
13243 lodash.range = range;
13244 lodash.rearg = rearg;
13245 lodash.reject = reject;
13246 lodash.remove = remove;
13247 lodash.rest = rest;
13248 lodash.restParam = restParam;
13249 lodash.set = set;
13250 lodash.shuffle = shuffle;
13251 lodash.slice = slice;
13252 lodash.sortBy = sortBy;
13253 lodash.sortByAll = sortByAll;
13254 lodash.sortByOrder = sortByOrder;
13255 lodash.spread = spread;
13256 lodash.take = take;
13257 lodash.takeRight = takeRight;
13258 lodash.takeRightWhile = takeRightWhile;
13259 lodash.takeWhile = takeWhile;
13260 lodash.tap = tap;
13261 lodash.throttle = throttle;
13262 lodash.thru = thru;
13263 lodash.times = times;
13264 lodash.toArray = toArray;
13265 lodash.toPlainObject = toPlainObject;
13266 lodash.transform = transform;
13267 lodash.union = union;
13268 lodash.uniq = uniq;
13269 lodash.unzip = unzip;
13270 lodash.values = values;
13271 lodash.valuesIn = valuesIn;
13272 lodash.where = where;
13273 lodash.without = without;
13274 lodash.wrap = wrap;
13275 lodash.xor = xor;
13276 lodash.zip = zip;
13277 lodash.zipObject = zipObject;
13278
13279 // Add aliases.
13280 lodash.backflow = flowRight;
13281 lodash.collect = map;
13282 lodash.compose = flowRight;
13283 lodash.each = forEach;
13284 lodash.eachRight = forEachRight;
13285 lodash.extend = assign;
13286 lodash.iteratee = callback;
13287 lodash.methods = functions;
13288 lodash.object = zipObject;
13289 lodash.select = filter;
13290 lodash.tail = rest;
13291 lodash.unique = uniq;
13292
13293 // Add functions to `lodash.prototype`.
13294 mixin(lodash, lodash);
13295
13296 /*------------------------------------------------------------------------*/
13297
13298 // Add functions that return unwrapped values when chaining.
13299 lodash.add = add;
13300 lodash.attempt = attempt;
13301 lodash.camelCase = camelCase;
13302 lodash.capitalize = capitalize;
13303 lodash.clone = clone;
13304 lodash.cloneDeep = cloneDeep;
13305 lodash.deburr = deburr;
13306 lodash.endsWith = endsWith;
13307 lodash.escape = escape;
13308 lodash.escapeRegExp = escapeRegExp;
13309 lodash.every = every;
13310 lodash.find = find;
13311 lodash.findIndex = findIndex;
13312 lodash.findKey = findKey;
13313 lodash.findLast = findLast;
13314 lodash.findLastIndex = findLastIndex;
13315 lodash.findLastKey = findLastKey;
13316 lodash.findWhere = findWhere;
13317 lodash.first = first;
13318 lodash.get = get;
13319 lodash.has = has;
13320 lodash.identity = identity;
13321 lodash.includes = includes;
13322 lodash.indexOf = indexOf;
13323 lodash.inRange = inRange;
13324 lodash.isArguments = isArguments;
13325 lodash.isArray = isArray;
13326 lodash.isBoolean = isBoolean;
13327 lodash.isDate = isDate;
13328 lodash.isElement = isElement;
13329 lodash.isEmpty = isEmpty;
13330 lodash.isEqual = isEqual;
13331 lodash.isError = isError;
13332 lodash.isFinite = isFinite;
13333 lodash.isFunction = isFunction;
13334 lodash.isMatch = isMatch;
13335 lodash.isNaN = isNaN;
13336 lodash.isNative = isNative;
13337 lodash.isNull = isNull;
13338 lodash.isNumber = isNumber;
13339 lodash.isObject = isObject;
13340 lodash.isPlainObject = isPlainObject;
13341 lodash.isRegExp = isRegExp;
13342 lodash.isString = isString;
13343 lodash.isTypedArray = isTypedArray;
13344 lodash.isUndefined = isUndefined;
13345 lodash.kebabCase = kebabCase;
13346 lodash.last = last;
13347 lodash.lastIndexOf = lastIndexOf;
13348 lodash.max = max;
13349 lodash.min = min;
13350 lodash.noConflict = noConflict;
13351 lodash.noop = noop;
13352 lodash.now = now;
13353 lodash.pad = pad;
13354 lodash.padLeft = padLeft;
13355 lodash.padRight = padRight;
13356 lodash.parseInt = parseInt;
13357 lodash.random = random;
13358 lodash.reduce = reduce;
13359 lodash.reduceRight = reduceRight;
13360 lodash.repeat = repeat;
13361 lodash.result = result;
13362 lodash.runInContext = runInContext;
13363 lodash.size = size;
13364 lodash.snakeCase = snakeCase;
13365 lodash.some = some;
13366 lodash.sortedIndex = sortedIndex;
13367 lodash.sortedLastIndex = sortedLastIndex;
13368 lodash.startCase = startCase;
13369 lodash.startsWith = startsWith;
13370 lodash.sum = sum;
13371 lodash.template = template;
13372 lodash.trim = trim;
13373 lodash.trimLeft = trimLeft;
13374 lodash.trimRight = trimRight;
13375 lodash.trunc = trunc;
13376 lodash.unescape = unescape;
13377 lodash.uniqueId = uniqueId;
13378 lodash.words = words;
13379
13380 // Add aliases.
13381 lodash.all = every;
13382 lodash.any = some;
13383 lodash.contains = includes;
13384 lodash.detect = find;
13385 lodash.foldl = reduce;
13386 lodash.foldr = reduceRight;
13387 lodash.head = first;
13388 lodash.include = includes;
13389 lodash.inject = reduce;
13390
13391 mixin(lodash, (function() {
13392 var source = {};
13393 baseForOwn(lodash, function(func, methodName) {
13394 if (!lodash.prototype[methodName]) {
13395 source[methodName] = func;
13396 }
13397 });
13398 return source;
13399 }()), false);
13400
13401 /*------------------------------------------------------------------------*/
13402
13403 // Add functions capable of returning wrapped and unwrapped values when chaining.
13404 lodash.sample = sample;
13405
13406 lodash.prototype.sample = function(n) {
13407 if (!this.__chain__ && n == null) {
13408 return sample(this.value());
13409 }
13410 return this.thru(function(value) {
13411 return sample(value, n);
13412 });
13413 };
13414
13415 /*------------------------------------------------------------------------*/
13416
13417 /**
13418 * The semantic version number.
13419 *
13420 * @static
13421 * @memberOf _
13422 * @type string
13423 */
13424 lodash.VERSION = VERSION;
13425
13426 // Assign default placeholders.
13427 arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
13428 lodash[methodName].placeholder = lodash;
13429 });
13430
13431 // Add `LazyWrapper` methods that accept an `iteratee` value.
13432 arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) {
13433 var isFilter = type != LAZY_MAP_FLAG,
13434 isDropWhile = type == LAZY_DROP_WHILE_FLAG;
13435
13436 LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
13437 var filtered = this.__filtered__,
13438 result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(),
13439 iteratees = result.__iteratees__ || (result.__iteratees__ = []);
13440
13441 iteratees.push({
13442 'done': false,
13443 'count': 0,
13444 'index': 0,
13445 'iteratee': getCallback(iteratee, thisArg, 1),
13446 'limit': -1,
13447 'type': type
13448 });
13449
13450 result.__filtered__ = filtered || isFilter;
13451 return result;
13452 };
13453 });
13454
13455 // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
13456 arrayEach(['drop', 'take'], function(methodName, index) {
13457 var whileName = methodName + 'While';
13458
13459 LazyWrapper.prototype[methodName] = function(n) {
13460 var filtered = this.__filtered__,
13461 result = (filtered && !index) ? this.dropWhile() : this.clone();
13462
13463 n = n == null ? 1 : nativeMax(floor(n) || 0, 0);
13464 if (filtered) {
13465 if (index) {
13466 result.__takeCount__ = nativeMin(result.__takeCount__, n);
13467 } else {
13468 last(result.__iteratees__).limit = n;
13469 }
13470 } else {
13471 var views = result.__views__ || (result.__views__ = []);
13472 views.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });
13473 }
13474 return result;
13475 };
13476
13477 LazyWrapper.prototype[methodName + 'Right'] = function(n) {
13478 return this.reverse()[methodName](n).reverse();
13479 };
13480
13481 LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) {
13482 return this.reverse()[whileName](predicate, thisArg).reverse();
13483 };
13484 });
13485
13486 // Add `LazyWrapper` methods for `_.first` and `_.last`.
13487 arrayEach(['first', 'last'], function(methodName, index) {
13488 var takeName = 'take' + (index ? 'Right' : '');
13489
13490 LazyWrapper.prototype[methodName] = function() {
13491 return this[takeName](1).value()[0];
13492 };
13493 });
13494
13495 // Add `LazyWrapper` methods for `_.initial` and `_.rest`.
13496 arrayEach(['initial', 'rest'], function(methodName, index) {
13497 var dropName = 'drop' + (index ? '' : 'Right');
13498
13499 LazyWrapper.prototype[methodName] = function() {
13500 return this[dropName](1);
13501 };
13502 });
13503
13504 // Add `LazyWrapper` methods for `_.pluck` and `_.where`.
13505 arrayEach(['pluck', 'where'], function(methodName, index) {
13506 var operationName = index ? 'filter' : 'map',
13507 createCallback = index ? baseMatches : property;
13508
13509 LazyWrapper.prototype[methodName] = function(value) {
13510 return this[operationName](createCallback(value));
13511 };
13512 });
13513
13514 LazyWrapper.prototype.compact = function() {
13515 return this.filter(identity);
13516 };
13517
13518 LazyWrapper.prototype.reject = function(predicate, thisArg) {
13519 predicate = getCallback(predicate, thisArg, 1);
13520 return this.filter(function(value) {
13521 return !predicate(value);
13522 });
13523 };
13524
13525 LazyWrapper.prototype.slice = function(start, end) {
13526 start = start == null ? 0 : (+start || 0);
13527 var result = start < 0 ? this.takeRight(-start) : this.drop(start);
13528
13529 if (end !== undefined) {
13530 end = (+end || 0);
13531 result = end < 0 ? result.dropRight(-end) : result.take(end - start);
13532 }
13533 return result;
13534 };
13535
13536 LazyWrapper.prototype.toArray = function() {
13537 return this.drop(0);
13538 };
13539
13540 // Add `LazyWrapper` methods to `lodash.prototype`.
13541 baseForOwn(LazyWrapper.prototype, function(func, methodName) {
13542 var lodashFunc = lodash[methodName];
13543 if (!lodashFunc) {
13544 return;
13545 }
13546 var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
13547 retUnwrapped = /^(?:first|last)$/.test(methodName);
13548
13549 lodash.prototype[methodName] = function() {
13550 var args = arguments,
13551 length = args.length,
13552 chainAll = this.__chain__,
13553 value = this.__wrapped__,
13554 isHybrid = !!this.__actions__.length,
13555 isLazy = value instanceof LazyWrapper,
13556 iteratee = args[0],
13557 useLazy = isLazy || isArray(value);
13558
13559 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
13560 // avoid lazy use if the iteratee has a "length" value other than `1`
13561 isLazy = useLazy = false;
13562 }
13563 var onlyLazy = isLazy && !isHybrid;
13564 if (retUnwrapped && !chainAll) {
13565 return onlyLazy
13566 ? func.call(value)
13567 : lodashFunc.call(lodash, this.value());
13568 }
13569 var interceptor = function(value) {
13570 var otherArgs = [value];
13571 push.apply(otherArgs, args);
13572 return lodashFunc.apply(lodash, otherArgs);
13573 };
13574 if (useLazy) {
13575 var wrapper = onlyLazy ? value : new LazyWrapper(this),
13576 result = func.apply(wrapper, args);
13577
13578 if (!retUnwrapped && (isHybrid || result.__actions__)) {
13579 var actions = result.__actions__ || (result.__actions__ = []);
13580 actions.push({ 'func': thru, 'args': [interceptor], 'thisArg': lodash });
13581 }
13582 return new LodashWrapper(result, chainAll);
13583 }
13584 return this.thru(interceptor);
13585 };
13586 });
13587
13588 // Add `Array` and `String` methods to `lodash.prototype`.
13589 arrayEach(['concat', 'join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {
13590 var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],
13591 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
13592 retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
13593
13594 lodash.prototype[methodName] = function() {
13595 var args = arguments;
13596 if (retUnwrapped && !this.__chain__) {
13597 return func.apply(this.value(), args);
13598 }
13599 return this[chainName](function(value) {
13600 return func.apply(value, args);
13601 });
13602 };
13603 });
13604
13605 // Map minified function names to their real names.
13606 baseForOwn(LazyWrapper.prototype, function(func, methodName) {
13607 var lodashFunc = lodash[methodName];
13608 if (lodashFunc) {
13609 var key = lodashFunc.name,
13610 names = realNames[key] || (realNames[key] = []);
13611
13612 names.push({ 'name': methodName, 'func': lodashFunc });
13613 }
13614 });
13615
13616 realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }];
13617
13618 // Add functions to the lazy wrapper.
13619 LazyWrapper.prototype.clone = lazyClone;
13620 LazyWrapper.prototype.reverse = lazyReverse;
13621 LazyWrapper.prototype.value = lazyValue;
13622
13623 // Add chaining functions to the `lodash` wrapper.
13624 lodash.prototype.chain = wrapperChain;
13625 lodash.prototype.commit = wrapperCommit;
13626 lodash.prototype.plant = wrapperPlant;
13627 lodash.prototype.reverse = wrapperReverse;
13628 lodash.prototype.toString = wrapperToString;
13629 lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
13630
13631 // Add function aliases to the `lodash` wrapper.
13632 lodash.prototype.collect = lodash.prototype.map;
13633 lodash.prototype.head = lodash.prototype.first;
13634 lodash.prototype.select = lodash.prototype.filter;
13635 lodash.prototype.tail = lodash.prototype.rest;
13636
13637 return lodash;
13638 }
13639
13640 /*--------------------------------------------------------------------------*/
13641
13642 // Export lodash.
13643 var _ = runInContext();
13644
13645 // Some AMD build optimizers like r.js check for condition patterns like the following:
13646 if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
13647 // Expose lodash to the global object when an AMD loader is present to avoid
13648 // errors in cases where lodash is loaded by a script tag and not intended
13649 // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for
13650 // more details.
13651 root._ = _;
13652
13653 // Define as an anonymous module so, through path mapping, it can be
13654 // referenced as the "underscore" module.
13655 define(function() {
13656 return _;
13657 });
13658 }
13659 // Check for `exports` after `define` in case a build optimizer adds an `exports` object.
13660 else if (freeExports && freeModule) {
13661 // Export for Node.js or RingoJS.
13662 if (moduleExports) {
13663 (freeModule.exports = _)._ = _;
13664 }
13665 // Export for Narwhal or Rhino -require.
13666 else {
13667 freeExports._ = _;
13668 }
13669 }
13670 else {
13671 // Export for a browser or Rhino.
13672 root._ = _;
13673 }
13674 }.call(this));
13675
13676 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
13677 },{}],13:[function(require,module,exports){
13678 /*
13679 * Lexical analysis and token construction.
13680 */
13681
13682 "use strict";
13683
13684 var _ = require("lodash");
13685 var events = require("events");
13686 var reg = require("./reg.js");
13687 var state = require("./state.js").state;
13688
13689 var unicodeData = require("../data/ascii-identifier-data.js");
13690 var asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable;
13691 var asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable;
13692 var nonAsciiIdentifierStartTable = require("../data/non-ascii-identifier-start.js");
13693 var nonAsciiIdentifierPartTable = require("../data/non-ascii-identifier-part-only.js");
13694
13695 // Some of these token types are from JavaScript Parser API
13696 // while others are specific to JSHint parser.
13697 // JS Parser API: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
13698
13699 var Token = {
13700 Identifier: 1,
13701 Punctuator: 2,
13702 NumericLiteral: 3,
13703 StringLiteral: 4,
13704 Comment: 5,
13705 Keyword: 6,
13706 NullLiteral: 7,
13707 BooleanLiteral: 8,
13708 RegExp: 9,
13709 TemplateHead: 10,
13710 TemplateMiddle: 11,
13711 TemplateTail: 12,
13712 NoSubstTemplate: 13
13713 };
13714
13715 var Context = {
13716 Block: 1,
13717 Template: 2
13718 };
13719
13720 function isHex(str) {
13721 return /^[0-9a-fA-F]+$/.test(str);
13722 }
13723
13724 function isHexDigit(str) {
13725 return str.length === 1 && isHex(str);
13726 }
13727
13728 // Object that handles postponed lexing verifications that checks the parsed
13729 // environment state.
13730
13731 function asyncTrigger() {
13732 var _checks = [];
13733
13734 return {
13735 push: function(fn) {
13736 _checks.push(fn);
13737 },
13738
13739 check: function() {
13740 for (var check = 0; check < _checks.length; ++check) {
13741 _checks[check]();
13742 }
13743
13744 _checks.splice(0, _checks.length);
13745 }
13746 };
13747 }
13748
13749 /*
13750 * Lexer for JSHint.
13751 *
13752 * This object does a char-by-char scan of the provided source code
13753 * and produces a sequence of tokens.
13754 *
13755 * var lex = new Lexer("var i = 0;");
13756 * lex.start();
13757 * lex.token(); // returns the next token
13758 *
13759 * You have to use the token() method to move the lexer forward
13760 * but you don't have to use its return value to get tokens. In addition
13761 * to token() method returning the next token, the Lexer object also
13762 * emits events.
13763 *
13764 * lex.on("Identifier", function(data) {
13765 * if (data.name.indexOf("_") >= 0) {
13766 * // Produce a warning.
13767 * }
13768 * });
13769 *
13770 * Note that the token() method returns tokens in a JSLint-compatible
13771 * format while the event emitter uses a slightly modified version of
13772 * Mozilla's JavaScript Parser API. Eventually, we will move away from
13773 * JSLint format.
13774 */
13775 function Lexer(source) {
13776 var lines = source;
13777
13778 if (typeof lines === "string") {
13779 lines = lines
13780 .replace(/\r\n/g, "\n")
13781 .replace(/\r/g, "\n")
13782 .split("\n");
13783 }
13784
13785 // If the first line is a shebang (#!), make it a blank and move on.
13786 // Shebangs are used by Node scripts.
13787
13788 if (lines[0] && lines[0].substr(0, 2) === "#!") {
13789 if (lines[0].indexOf("node") !== -1) {
13790 state.option.node = true;
13791 }
13792 lines[0] = "";
13793 }
13794
13795 this.emitter = new events.EventEmitter();
13796 this.source = source;
13797 this.setLines(lines);
13798 this.prereg = true;
13799
13800 this.line = 0;
13801 this.char = 1;
13802 this.from = 1;
13803 this.input = "";
13804 this.inComment = false;
13805 this.context = [];
13806 this.templateStarts = [];
13807
13808 for (var i = 0; i < state.option.indent; i += 1) {
13809 state.tab += " ";
13810 }
13811 }
13812
13813 Lexer.prototype = {
13814 _lines: [],
13815
13816 inContext: function(ctxType) {
13817 return this.context.length > 0 && this.context[this.context.length - 1].type === ctxType;
13818 },
13819
13820 pushContext: function(ctxType) {
13821 this.context.push({ type: ctxType });
13822 },
13823
13824 popContext: function() {
13825 return this.context.pop();
13826 },
13827
13828 isContext: function(context) {
13829 return this.context.length > 0 && this.context[this.context.length - 1] === context;
13830 },
13831
13832 currentContext: function() {
13833 return this.context.length > 0 && this.context[this.context.length - 1];
13834 },
13835
13836 getLines: function() {
13837 this._lines = state.lines;
13838 return this._lines;
13839 },
13840
13841 setLines: function(val) {
13842 this._lines = val;
13843 state.lines = this._lines;
13844 },
13845
13846 /*
13847 * Return the next i character without actually moving the
13848 * char pointer.
13849 */
13850 peek: function(i) {
13851 return this.input.charAt(i || 0);
13852 },
13853
13854 /*
13855 * Move the char pointer forward i times.
13856 */
13857 skip: function(i) {
13858 i = i || 1;
13859 this.char += i;
13860 this.input = this.input.slice(i);
13861 },
13862
13863 /*
13864 * Subscribe to a token event. The API for this method is similar
13865 * Underscore.js i.e. you can subscribe to multiple events with
13866 * one call:
13867 *
13868 * lex.on("Identifier Number", function(data) {
13869 * // ...
13870 * });
13871 */
13872 on: function(names, listener) {
13873 names.split(" ").forEach(function(name) {
13874 this.emitter.on(name, listener);
13875 }.bind(this));
13876 },
13877
13878 /*
13879 * Trigger a token event. All arguments will be passed to each
13880 * listener.
13881 */
13882 trigger: function() {
13883 this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments));
13884 },
13885
13886 /*
13887 * Postpone a token event. the checking condition is set as
13888 * last parameter, and the trigger function is called in a
13889 * stored callback. To be later called using the check() function
13890 * by the parser. This avoids parser's peek() to give the lexer
13891 * a false context.
13892 */
13893 triggerAsync: function(type, args, checks, fn) {
13894 checks.push(function() {
13895 if (fn()) {
13896 this.trigger(type, args);
13897 }
13898 }.bind(this));
13899 },
13900
13901 /*
13902 * Extract a punctuator out of the next sequence of characters
13903 * or return 'null' if its not possible.
13904 *
13905 * This method's implementation was heavily influenced by the
13906 * scanPunctuator function in the Esprima parser's source code.
13907 */
13908 scanPunctuator: function() {
13909 var ch1 = this.peek();
13910 var ch2, ch3, ch4;
13911
13912 switch (ch1) {
13913 // Most common single-character punctuators
13914 case ".":
13915 if ((/^[0-9]$/).test(this.peek(1))) {
13916 return null;
13917 }
13918 if (this.peek(1) === "." && this.peek(2) === ".") {
13919 return {
13920 type: Token.Punctuator,
13921 value: "..."
13922 };
13923 }
13924 /* falls through */
13925 case "(":
13926 case ")":
13927 case ";":
13928 case ",":
13929 case "[":
13930 case "]":
13931 case ":":
13932 case "~":
13933 case "?":
13934 return {
13935 type: Token.Punctuator,
13936 value: ch1
13937 };
13938
13939 // A block/object opener
13940 case "{":
13941 this.pushContext(Context.Block);
13942 return {
13943 type: Token.Punctuator,
13944 value: ch1
13945 };
13946
13947 // A block/object closer
13948 case "}":
13949 if (this.inContext(Context.Block)) {
13950 this.popContext();
13951 }
13952 return {
13953 type: Token.Punctuator,
13954 value: ch1
13955 };
13956
13957 // A pound sign (for Node shebangs)
13958 case "#":
13959 return {
13960 type: Token.Punctuator,
13961 value: ch1
13962 };
13963
13964 // We're at the end of input
13965 case "":
13966 return null;
13967 }
13968
13969 // Peek more characters
13970
13971 ch2 = this.peek(1);
13972 ch3 = this.peek(2);
13973 ch4 = this.peek(3);
13974
13975 // 4-character punctuator: >>>=
13976
13977 if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") {
13978 return {
13979 type: Token.Punctuator,
13980 value: ">>>="
13981 };
13982 }
13983
13984 // 3-character punctuators: === !== >>> <<= >>=
13985
13986 if (ch1 === "=" && ch2 === "=" && ch3 === "=") {
13987 return {
13988 type: Token.Punctuator,
13989 value: "==="
13990 };
13991 }
13992
13993 if (ch1 === "!" && ch2 === "=" && ch3 === "=") {
13994 return {
13995 type: Token.Punctuator,
13996 value: "!=="
13997 };
13998 }
13999
14000 if (ch1 === ">" && ch2 === ">" && ch3 === ">") {
14001 return {
14002 type: Token.Punctuator,
14003 value: ">>>"
14004 };
14005 }
14006
14007 if (ch1 === "<" && ch2 === "<" && ch3 === "=") {
14008 return {
14009 type: Token.Punctuator,
14010 value: "<<="
14011 };
14012 }
14013
14014 if (ch1 === ">" && ch2 === ">" && ch3 === "=") {
14015 return {
14016 type: Token.Punctuator,
14017 value: ">>="
14018 };
14019 }
14020
14021 // Fat arrow punctuator
14022 if (ch1 === "=" && ch2 === ">") {
14023 return {
14024 type: Token.Punctuator,
14025 value: ch1 + ch2
14026 };
14027 }
14028
14029 // 2-character punctuators: <= >= == != ++ -- << >> && ||
14030 // += -= *= %= &= |= ^= /=
14031 if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) {
14032 return {
14033 type: Token.Punctuator,
14034 value: ch1 + ch2
14035 };
14036 }
14037
14038 if ("<>=!+-*%&|^/".indexOf(ch1) >= 0) {
14039 if (ch2 === "=") {
14040 return {
14041 type: Token.Punctuator,
14042 value: ch1 + ch2
14043 };
14044 }
14045
14046 return {
14047 type: Token.Punctuator,
14048 value: ch1
14049 };
14050 }
14051
14052 return null;
14053 },
14054
14055 /*
14056 * Extract a comment out of the next sequence of characters and/or
14057 * lines or return 'null' if its not possible. Since comments can
14058 * span across multiple lines this method has to move the char
14059 * pointer.
14060 *
14061 * In addition to normal JavaScript comments (// and /*) this method
14062 * also recognizes JSHint- and JSLint-specific comments such as
14063 * /*jshint, /*jslint, /*globals and so on.
14064 */
14065 scanComments: function(checks) {
14066 var ch1 = this.peek();
14067 var ch2 = this.peek(1);
14068 var rest = this.input.substr(2);
14069 var startLine = this.line;
14070 var startChar = this.char;
14071 var self = this;
14072
14073 // Create a comment token object and make sure it
14074 // has all the data JSHint needs to work with special
14075 // comments.
14076
14077 function commentToken(label, body, opt) {
14078 var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"];
14079 var isSpecial = false;
14080 var value = label + body;
14081 var commentType = "plain";
14082 opt = opt || {};
14083
14084 if (opt.isMultiline) {
14085 value += "*/";
14086 }
14087
14088 body = body.replace(/\n/g, " ");
14089
14090 if (label === "/*" && reg.fallsThrough.test(body)) {
14091 isSpecial = true;
14092 commentType = "falls through";
14093 }
14094
14095 special.forEach(function(str) {
14096 if (isSpecial) {
14097 return;
14098 }
14099
14100 // Don't recognize any special comments other than jshint for single-line
14101 // comments. This introduced many problems with legit comments.
14102 if (label === "//" && str !== "jshint") {
14103 return;
14104 }
14105
14106 if (body.charAt(str.length) === " " && body.substr(0, str.length) === str) {
14107 isSpecial = true;
14108 label = label + str;
14109 body = body.substr(str.length);
14110 }
14111
14112 if (!isSpecial && body.charAt(0) === " " && body.charAt(str.length + 1) === " " &&
14113 body.substr(1, str.length) === str) {
14114 isSpecial = true;
14115 label = label + " " + str;
14116 body = body.substr(str.length + 1);
14117 }
14118
14119 if (!isSpecial) {
14120 return;
14121 }
14122
14123 switch (str) {
14124 case "member":
14125 commentType = "members";
14126 break;
14127 case "global":
14128 commentType = "globals";
14129 break;
14130 default:
14131 var options = body.split(":").map(function(v) {
14132 return v.replace(/^\s+/, "").replace(/\s+$/, "");
14133 });
14134
14135 if (options.length === 2) {
14136 switch (options[0]) {
14137 case "ignore":
14138 switch (options[1]) {
14139 case "start":
14140 self.ignoringLinterErrors = true;
14141 isSpecial = false;
14142 break;
14143 case "end":
14144 self.ignoringLinterErrors = false;
14145 isSpecial = false;
14146 break;
14147 }
14148 }
14149 }
14150
14151 commentType = str;
14152 }
14153 });
14154
14155 return {
14156 type: Token.Comment,
14157 commentType: commentType,
14158 value: value,
14159 body: body,
14160 isSpecial: isSpecial,
14161 isMultiline: opt.isMultiline || false,
14162 isMalformed: opt.isMalformed || false
14163 };
14164 }
14165
14166 // End of unbegun comment. Raise an error and skip that input.
14167 if (ch1 === "*" && ch2 === "/") {
14168 this.trigger("error", {
14169 code: "E018",
14170 line: startLine,
14171 character: startChar
14172 });
14173
14174 this.skip(2);
14175 return null;
14176 }
14177
14178 // Comments must start either with // or /*
14179 if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) {
14180 return null;
14181 }
14182
14183 // One-line comment
14184 if (ch2 === "/") {
14185 this.skip(this.input.length); // Skip to the EOL.
14186 return commentToken("//", rest);
14187 }
14188
14189 var body = "";
14190
14191 /* Multi-line comment */
14192 if (ch2 === "*") {
14193 this.inComment = true;
14194 this.skip(2);
14195
14196 while (this.peek() !== "*" || this.peek(1) !== "/") {
14197 if (this.peek() === "") { // End of Line
14198 body += "\n";
14199
14200 // If we hit EOF and our comment is still unclosed,
14201 // trigger an error and end the comment implicitly.
14202 if (!this.nextLine(checks)) {
14203 this.trigger("error", {
14204 code: "E017",
14205 line: startLine,
14206 character: startChar
14207 });
14208
14209 this.inComment = false;
14210 return commentToken("/*", body, {
14211 isMultiline: true,
14212 isMalformed: true
14213 });
14214 }
14215 } else {
14216 body += this.peek();
14217 this.skip();
14218 }
14219 }
14220
14221 this.skip(2);
14222 this.inComment = false;
14223 return commentToken("/*", body, { isMultiline: true });
14224 }
14225 },
14226
14227 /*
14228 * Extract a keyword out of the next sequence of characters or
14229 * return 'null' if its not possible.
14230 */
14231 scanKeyword: function() {
14232 var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input);
14233 var keywords = [
14234 "if", "in", "do", "var", "for", "new",
14235 "try", "let", "this", "else", "case",
14236 "void", "with", "enum", "while", "break",
14237 "catch", "throw", "const", "yield", "class",
14238 "super", "return", "typeof", "delete",
14239 "switch", "export", "import", "default",
14240 "finally", "extends", "function", "continue",
14241 "debugger", "instanceof"
14242 ];
14243
14244 if (result && keywords.indexOf(result[0]) >= 0) {
14245 return {
14246 type: Token.Keyword,
14247 value: result[0]
14248 };
14249 }
14250
14251 return null;
14252 },
14253
14254 /*
14255 * Extract a JavaScript identifier out of the next sequence of
14256 * characters or return 'null' if its not possible. In addition,
14257 * to Identifier this method can also produce BooleanLiteral
14258 * (true/false) and NullLiteral (null).
14259 */
14260 scanIdentifier: function() {
14261 var id = "";
14262 var index = 0;
14263 var type, char;
14264
14265 function isNonAsciiIdentifierStart(code) {
14266 return nonAsciiIdentifierStartTable.indexOf(code) > -1;
14267 }
14268
14269 function isNonAsciiIdentifierPart(code) {
14270 return isNonAsciiIdentifierStart(code) || nonAsciiIdentifierPartTable.indexOf(code) > -1;
14271 }
14272
14273 var readUnicodeEscapeSequence = function() {
14274 /*jshint validthis:true */
14275 index += 1;
14276
14277 if (this.peek(index) !== "u") {
14278 return null;
14279 }
14280
14281 var sequence = this.peek(index + 1) + this.peek(index + 2) +
14282 this.peek(index + 3) + this.peek(index + 4);
14283 var code;
14284
14285 if (isHex(sequence)) {
14286 code = parseInt(sequence, 16);
14287
14288 if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) {
14289 index += 5;
14290 return "\\u" + sequence;
14291 }
14292
14293 return null;
14294 }
14295
14296 return null;
14297 }.bind(this);
14298
14299 var getIdentifierStart = function() {
14300 /*jshint validthis:true */
14301 var chr = this.peek(index);
14302 var code = chr.charCodeAt(0);
14303
14304 if (code === 92) {
14305 return readUnicodeEscapeSequence();
14306 }
14307
14308 if (code < 128) {
14309 if (asciiIdentifierStartTable[code]) {
14310 index += 1;
14311 return chr;
14312 }
14313
14314 return null;
14315 }
14316
14317 if (isNonAsciiIdentifierStart(code)) {
14318 index += 1;
14319 return chr;
14320 }
14321
14322 return null;
14323 }.bind(this);
14324
14325 var getIdentifierPart = function() {
14326 /*jshint validthis:true */
14327 var chr = this.peek(index);
14328 var code = chr.charCodeAt(0);
14329
14330 if (code === 92) {
14331 return readUnicodeEscapeSequence();
14332 }
14333
14334 if (code < 128) {
14335 if (asciiIdentifierPartTable[code]) {
14336 index += 1;
14337 return chr;
14338 }
14339
14340 return null;
14341 }
14342
14343 if (isNonAsciiIdentifierPart(code)) {
14344 index += 1;
14345 return chr;
14346 }
14347
14348 return null;
14349 }.bind(this);
14350
14351 function removeEscapeSequences(id) {
14352 return id.replace(/\\u([0-9a-fA-F]{4})/g, function(m0, codepoint) {
14353 return String.fromCharCode(parseInt(codepoint, 16));
14354 });
14355 }
14356
14357 char = getIdentifierStart();
14358 if (char === null) {
14359 return null;
14360 }
14361
14362 id = char;
14363 for (;;) {
14364 char = getIdentifierPart();
14365
14366 if (char === null) {
14367 break;
14368 }
14369
14370 id += char;
14371 }
14372
14373 switch (id) {
14374 case "true":
14375 case "false":
14376 type = Token.BooleanLiteral;
14377 break;
14378 case "null":
14379 type = Token.NullLiteral;
14380 break;
14381 default:
14382 type = Token.Identifier;
14383 }
14384
14385 return {
14386 type: type,
14387 value: removeEscapeSequences(id),
14388 text: id,
14389 tokenLength: id.length
14390 };
14391 },
14392
14393 /*
14394 * Extract a numeric literal out of the next sequence of
14395 * characters or return 'null' if its not possible. This method
14396 * supports all numeric literals described in section 7.8.3
14397 * of the EcmaScript 5 specification.
14398 *
14399 * This method's implementation was heavily influenced by the
14400 * scanNumericLiteral function in the Esprima parser's source code.
14401 */
14402 scanNumericLiteral: function(checks) {
14403 var index = 0;
14404 var value = "";
14405 var length = this.input.length;
14406 var char = this.peek(index);
14407 var bad;
14408 var isAllowedDigit = isDecimalDigit;
14409 var base = 10;
14410 var isLegacy = false;
14411
14412 function isDecimalDigit(str) {
14413 return (/^[0-9]$/).test(str);
14414 }
14415
14416 function isOctalDigit(str) {
14417 return (/^[0-7]$/).test(str);
14418 }
14419
14420 function isBinaryDigit(str) {
14421 return (/^[01]$/).test(str);
14422 }
14423
14424 function isIdentifierStart(ch) {
14425 return (ch === "$") || (ch === "_") || (ch === "\\") ||
14426 (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z");
14427 }
14428
14429 // Numbers must start either with a decimal digit or a point.
14430
14431 if (char !== "." && !isDecimalDigit(char)) {
14432 return null;
14433 }
14434
14435 if (char !== ".") {
14436 value = this.peek(index);
14437 index += 1;
14438 char = this.peek(index);
14439
14440 if (value === "0") {
14441 // Base-16 numbers.
14442 if (char === "x" || char === "X") {
14443 isAllowedDigit = isHexDigit;
14444 base = 16;
14445
14446 index += 1;
14447 value += char;
14448 }
14449
14450 // Base-8 numbers.
14451 if (char === "o" || char === "O") {
14452 isAllowedDigit = isOctalDigit;
14453 base = 8;
14454
14455 if (!state.inES6(true)) {
14456 this.triggerAsync(
14457 "warning",
14458 {
14459 code: "W119",
14460 line: this.line,
14461 character: this.char,
14462 data: [ "Octal integer literal", "6" ]
14463 },
14464 checks,
14465 function() { return true; }
14466 );
14467 }
14468
14469 index += 1;
14470 value += char;
14471 }
14472
14473 // Base-2 numbers.
14474 if (char === "b" || char === "B") {
14475 isAllowedDigit = isBinaryDigit;
14476 base = 2;
14477
14478 if (!state.inES6(true)) {
14479 this.triggerAsync(
14480 "warning",
14481 {
14482 code: "W119",
14483 line: this.line,
14484 character: this.char,
14485 data: [ "Binary integer literal", "6" ]
14486 },
14487 checks,
14488 function() { return true; }
14489 );
14490 }
14491
14492 index += 1;
14493 value += char;
14494 }
14495
14496 // Legacy base-8 numbers.
14497 if (isOctalDigit(char)) {
14498 isAllowedDigit = isOctalDigit;
14499 base = 8;
14500 isLegacy = true;
14501 bad = false;
14502
14503 index += 1;
14504 value += char;
14505 }
14506
14507 // Decimal numbers that start with '0' such as '09' are illegal
14508 // but we still parse them and return as malformed.
14509
14510 if (!isOctalDigit(char) && isDecimalDigit(char)) {
14511 index += 1;
14512 value += char;
14513 }
14514 }
14515
14516 while (index < length) {
14517 char = this.peek(index);
14518
14519 if (isLegacy && isDecimalDigit(char)) {
14520 // Numbers like '019' (note the 9) are not valid octals
14521 // but we still parse them and mark as malformed.
14522 bad = true;
14523 } else if (!isAllowedDigit(char)) {
14524 break;
14525 }
14526 value += char;
14527 index += 1;
14528 }
14529
14530 if (isAllowedDigit !== isDecimalDigit) {
14531 if (!isLegacy && value.length <= 2) { // 0x
14532 return {
14533 type: Token.NumericLiteral,
14534 value: value,
14535 isMalformed: true
14536 };
14537 }
14538
14539 if (index < length) {
14540 char = this.peek(index);
14541 if (isIdentifierStart(char)) {
14542 return null;
14543 }
14544 }
14545
14546 return {
14547 type: Token.NumericLiteral,
14548 value: value,
14549 base: base,
14550 isLegacy: isLegacy,
14551 isMalformed: false
14552 };
14553 }
14554 }
14555
14556 // Decimal digits.
14557
14558 if (char === ".") {
14559 value += char;
14560 index += 1;
14561
14562 while (index < length) {
14563 char = this.peek(index);
14564 if (!isDecimalDigit(char)) {
14565 break;
14566 }
14567 value += char;
14568 index += 1;
14569 }
14570 }
14571
14572 // Exponent part.
14573
14574 if (char === "e" || char === "E") {
14575 value += char;
14576 index += 1;
14577 char = this.peek(index);
14578
14579 if (char === "+" || char === "-") {
14580 value += this.peek(index);
14581 index += 1;
14582 }
14583
14584 char = this.peek(index);
14585 if (isDecimalDigit(char)) {
14586 value += char;
14587 index += 1;
14588
14589 while (index < length) {
14590 char = this.peek(index);
14591 if (!isDecimalDigit(char)) {
14592 break;
14593 }
14594 value += char;
14595 index += 1;
14596 }
14597 } else {
14598 return null;
14599 }
14600 }
14601
14602 if (index < length) {
14603 char = this.peek(index);
14604 if (isIdentifierStart(char)) {
14605 return null;
14606 }
14607 }
14608
14609 return {
14610 type: Token.NumericLiteral,
14611 value: value,
14612 base: base,
14613 isMalformed: !isFinite(value)
14614 };
14615 },
14616
14617
14618 // Assumes previously parsed character was \ (=== '\\') and was not skipped.
14619 scanEscapeSequence: function(checks) {
14620 var allowNewLine = false;
14621 var jump = 1;
14622 this.skip();
14623 var char = this.peek();
14624
14625 switch (char) {
14626 case "'":
14627 this.triggerAsync("warning", {
14628 code: "W114",
14629 line: this.line,
14630 character: this.char,
14631 data: [ "\\'" ]
14632 }, checks, function() {return state.jsonMode; });
14633 break;
14634 case "b":
14635 char = "\\b";
14636 break;
14637 case "f":
14638 char = "\\f";
14639 break;
14640 case "n":
14641 char = "\\n";
14642 break;
14643 case "r":
14644 char = "\\r";
14645 break;
14646 case "t":
14647 char = "\\t";
14648 break;
14649 case "0":
14650 char = "\\0";
14651
14652 // Octal literals fail in strict mode.
14653 // Check if the number is between 00 and 07.
14654 var n = parseInt(this.peek(1), 10);
14655 this.triggerAsync("warning", {
14656 code: "W115",
14657 line: this.line,
14658 character: this.char
14659 }, checks,
14660 function() { return n >= 0 && n <= 7 && state.isStrict(); });
14661 break;
14662 case "1":
14663 case "2":
14664 case "3":
14665 case "4":
14666 case "5":
14667 case "6":
14668 case "7":
14669 char = "\\" + char;
14670 this.triggerAsync("warning", {
14671 code: "W115",
14672 line: this.line,
14673 character: this.char
14674 }, checks,
14675 function() { return state.isStrict(); });
14676 break;
14677 case "u":
14678 var sequence = this.input.substr(1, 4);
14679 var code = parseInt(sequence, 16);
14680 if (!isHex(sequence)) {
14681 // This condition unequivocally describes a syntax error.
14682 // TODO: Re-factor as an "error" (not a "warning").
14683 this.trigger("warning", {
14684 code: "W052",
14685 line: this.line,
14686 character: this.char,
14687 data: [ "u" + sequence ]
14688 });
14689 }
14690 char = String.fromCharCode(code);
14691 jump = 5;
14692 break;
14693 case "v":
14694 this.triggerAsync("warning", {
14695 code: "W114",
14696 line: this.line,
14697 character: this.char,
14698 data: [ "\\v" ]
14699 }, checks, function() { return state.jsonMode; });
14700
14701 char = "\v";
14702 break;
14703 case "x":
14704 var x = parseInt(this.input.substr(1, 2), 16);
14705
14706 this.triggerAsync("warning", {
14707 code: "W114",
14708 line: this.line,
14709 character: this.char,
14710 data: [ "\\x-" ]
14711 }, checks, function() { return state.jsonMode; });
14712
14713 char = String.fromCharCode(x);
14714 jump = 3;
14715 break;
14716 case "\\":
14717 char = "\\\\";
14718 break;
14719 case "\"":
14720 char = "\\\"";
14721 break;
14722 case "/":
14723 break;
14724 case "":
14725 allowNewLine = true;
14726 char = "";
14727 break;
14728 }
14729
14730 return { char: char, jump: jump, allowNewLine: allowNewLine };
14731 },
14732
14733 /*
14734 * Extract a template literal out of the next sequence of characters
14735 * and/or lines or return 'null' if its not possible. Since template
14736 * literals can span across multiple lines, this method has to move
14737 * the char pointer.
14738 */
14739 scanTemplateLiteral: function(checks) {
14740 var tokenType;
14741 var value = "";
14742 var ch;
14743 var startLine = this.line;
14744 var startChar = this.char;
14745 var depth = this.templateStarts.length;
14746
14747 if (this.peek() === "`") {
14748 if (!state.inES6(true)) {
14749 this.triggerAsync(
14750 "warning",
14751 {
14752 code: "W119",
14753 line: this.line,
14754 character: this.char,
14755 data: ["template literal syntax", "6"]
14756 },
14757 checks,
14758 function() { return true; }
14759 );
14760 }
14761 // Template must start with a backtick.
14762 tokenType = Token.TemplateHead;
14763 this.templateStarts.push({ line: this.line, char: this.char });
14764 depth = this.templateStarts.length;
14765 this.skip(1);
14766 this.pushContext(Context.Template);
14767 } else if (this.inContext(Context.Template) && this.peek() === "}") {
14768 // If we're in a template context, and we have a '}', lex a TemplateMiddle.
14769 tokenType = Token.TemplateMiddle;
14770 } else {
14771 // Go lex something else.
14772 return null;
14773 }
14774
14775 while (this.peek() !== "`") {
14776 while ((ch = this.peek()) === "") {
14777 value += "\n";
14778 if (!this.nextLine(checks)) {
14779 // Unclosed template literal --- point to the starting "`"
14780 var startPos = this.templateStarts.pop();
14781 this.trigger("error", {
14782 code: "E052",
14783 line: startPos.line,
14784 character: startPos.char
14785 });
14786 return {
14787 type: tokenType,
14788 value: value,
14789 startLine: startLine,
14790 startChar: startChar,
14791 isUnclosed: true,
14792 depth: depth,
14793 context: this.popContext()
14794 };
14795 }
14796 }
14797
14798 if (ch === '$' && this.peek(1) === '{') {
14799 value += '${';
14800 this.skip(2);
14801 return {
14802 type: tokenType,
14803 value: value,
14804 startLine: startLine,
14805 startChar: startChar,
14806 isUnclosed: false,
14807 depth: depth,
14808 context: this.currentContext()
14809 };
14810 } else if (ch === '\\') {
14811 var escape = this.scanEscapeSequence(checks);
14812 value += escape.char;
14813 this.skip(escape.jump);
14814 } else if (ch !== '`') {
14815 // Otherwise, append the value and continue.
14816 value += ch;
14817 this.skip(1);
14818 }
14819 }
14820
14821 // Final value is either NoSubstTemplate or TemplateTail
14822 tokenType = tokenType === Token.TemplateHead ? Token.NoSubstTemplate : Token.TemplateTail;
14823 this.skip(1);
14824 this.templateStarts.pop();
14825
14826 return {
14827 type: tokenType,
14828 value: value,
14829 startLine: startLine,
14830 startChar: startChar,
14831 isUnclosed: false,
14832 depth: depth,
14833 context: this.popContext()
14834 };
14835 },
14836
14837 /*
14838 * Extract a string out of the next sequence of characters and/or
14839 * lines or return 'null' if its not possible. Since strings can
14840 * span across multiple lines this method has to move the char
14841 * pointer.
14842 *
14843 * This method recognizes pseudo-multiline JavaScript strings:
14844 *
14845 * var str = "hello\
14846 * world";
14847 */
14848 scanStringLiteral: function(checks) {
14849 /*jshint loopfunc:true */
14850 var quote = this.peek();
14851
14852 // String must start with a quote.
14853 if (quote !== "\"" && quote !== "'") {
14854 return null;
14855 }
14856
14857 // In JSON strings must always use double quotes.
14858 this.triggerAsync("warning", {
14859 code: "W108",
14860 line: this.line,
14861 character: this.char // +1?
14862 }, checks, function() { return state.jsonMode && quote !== "\""; });
14863
14864 var value = "";
14865 var startLine = this.line;
14866 var startChar = this.char;
14867 var allowNewLine = false;
14868
14869 this.skip();
14870
14871 while (this.peek() !== quote) {
14872 if (this.peek() === "") { // End Of Line
14873
14874 // If an EOL is not preceded by a backslash, show a warning
14875 // and proceed like it was a legit multi-line string where
14876 // author simply forgot to escape the newline symbol.
14877 //
14878 // Another approach is to implicitly close a string on EOL
14879 // but it generates too many false positives.
14880
14881 if (!allowNewLine) {
14882 // This condition unequivocally describes a syntax error.
14883 // TODO: Re-factor as an "error" (not a "warning").
14884 this.trigger("warning", {
14885 code: "W112",
14886 line: this.line,
14887 character: this.char
14888 });
14889 } else {
14890 allowNewLine = false;
14891
14892 // Otherwise show a warning if multistr option was not set.
14893 // For JSON, show warning no matter what.
14894
14895 this.triggerAsync("warning", {
14896 code: "W043",
14897 line: this.line,
14898 character: this.char
14899 }, checks, function() { return !state.option.multistr; });
14900
14901 this.triggerAsync("warning", {
14902 code: "W042",
14903 line: this.line,
14904 character: this.char
14905 }, checks, function() { return state.jsonMode && state.option.multistr; });
14906 }
14907
14908 // If we get an EOF inside of an unclosed string, show an
14909 // error and implicitly close it at the EOF point.
14910
14911 if (!this.nextLine(checks)) {
14912 this.trigger("error", {
14913 code: "E029",
14914 line: startLine,
14915 character: startChar
14916 });
14917
14918 return {
14919 type: Token.StringLiteral,
14920 value: value,
14921 startLine: startLine,
14922 startChar: startChar,
14923 isUnclosed: true,
14924 quote: quote
14925 };
14926 }
14927
14928 } else { // Any character other than End Of Line
14929
14930 allowNewLine = false;
14931 var char = this.peek();
14932 var jump = 1; // A length of a jump, after we're done
14933 // parsing this character.
14934
14935 if (char < " ") {
14936 // Warn about a control character in a string.
14937 this.triggerAsync(
14938 "warning",
14939 {
14940 code: "W113",
14941 line: this.line,
14942 character: this.char,
14943 data: [ "<non-printable>" ]
14944 },
14945 checks,
14946 function() { return true; }
14947 );
14948 }
14949
14950 // Special treatment for some escaped characters.
14951 if (char === "\\") {
14952 var parsed = this.scanEscapeSequence(checks);
14953 char = parsed.char;
14954 jump = parsed.jump;
14955 allowNewLine = parsed.allowNewLine;
14956 }
14957
14958 value += char;
14959 this.skip(jump);
14960 }
14961 }
14962
14963 this.skip();
14964 return {
14965 type: Token.StringLiteral,
14966 value: value,
14967 startLine: startLine,
14968 startChar: startChar,
14969 isUnclosed: false,
14970 quote: quote
14971 };
14972 },
14973
14974 /*
14975 * Extract a regular expression out of the next sequence of
14976 * characters and/or lines or return 'null' if its not possible.
14977 *
14978 * This method is platform dependent: it accepts almost any
14979 * regular expression values but then tries to compile and run
14980 * them using system's RegExp object. This means that there are
14981 * rare edge cases where one JavaScript engine complains about
14982 * your regular expression while others don't.
14983 */
14984 scanRegExp: function(checks) {
14985 var index = 0;
14986 var length = this.input.length;
14987 var char = this.peek();
14988 var value = char;
14989 var body = "";
14990 var flags = [];
14991 var malformed = false;
14992 var isCharSet = false;
14993 var terminated, malformedDesc;
14994
14995 var scanUnexpectedChars = function() {
14996 // Unexpected control character
14997 if (char < " ") {
14998 malformed = true;
14999 this.triggerAsync(
15000 "warning",
15001 {
15002 code: "W048",
15003 line: this.line,
15004 character: this.char
15005 },
15006 checks,
15007 function() { return true; }
15008 );
15009 }
15010
15011 // Unexpected escaped character
15012 if (char === "<") {
15013 malformed = true;
15014 this.triggerAsync(
15015 "warning",
15016 {
15017 code: "W049",
15018 line: this.line,
15019 character: this.char,
15020 data: [ char ]
15021 },
15022 checks,
15023 function() { return true; }
15024 );
15025 }
15026 }.bind(this);
15027
15028 // Regular expressions must start with '/'
15029 if (!this.prereg || char !== "/") {
15030 return null;
15031 }
15032
15033 index += 1;
15034 terminated = false;
15035
15036 // Try to get everything in between slashes. A couple of
15037 // cases aside (see scanUnexpectedChars) we don't really
15038 // care whether the resulting expression is valid or not.
15039 // We will check that later using the RegExp object.
15040
15041 while (index < length) {
15042 char = this.peek(index);
15043 value += char;
15044 body += char;
15045
15046 if (isCharSet) {
15047 if (char === "]") {
15048 if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") {
15049 isCharSet = false;
15050 }
15051 }
15052
15053 if (char === "\\") {
15054 index += 1;
15055 char = this.peek(index);
15056 body += char;
15057 value += char;
15058
15059 scanUnexpectedChars();
15060 }
15061
15062 index += 1;
15063 continue;
15064 }
15065
15066 if (char === "\\") {
15067 index += 1;
15068 char = this.peek(index);
15069 body += char;
15070 value += char;
15071
15072 scanUnexpectedChars();
15073
15074 if (char === "/") {
15075 index += 1;
15076 continue;
15077 }
15078
15079 if (char === "[") {
15080 index += 1;
15081 continue;
15082 }
15083 }
15084
15085 if (char === "[") {
15086 isCharSet = true;
15087 index += 1;
15088 continue;
15089 }
15090
15091 if (char === "/") {
15092 body = body.substr(0, body.length - 1);
15093 terminated = true;
15094 index += 1;
15095 break;
15096 }
15097
15098 index += 1;
15099 }
15100
15101 // A regular expression that was never closed is an
15102 // error from which we cannot recover.
15103
15104 if (!terminated) {
15105 this.trigger("error", {
15106 code: "E015",
15107 line: this.line,
15108 character: this.from
15109 });
15110
15111 return void this.trigger("fatal", {
15112 line: this.line,
15113 from: this.from
15114 });
15115 }
15116
15117 // Parse flags (if any).
15118
15119 while (index < length) {
15120 char = this.peek(index);
15121 if (!/[gimy]/.test(char)) {
15122 break;
15123 }
15124 if (char === "y") {
15125 if (!state.inES6(true)) {
15126 this.triggerAsync(
15127 "warning",
15128 {
15129 code: "W119",
15130 line: this.line,
15131 character: this.char,
15132 data: [ "Sticky RegExp flag", "6" ]
15133 },
15134 checks,
15135 function() { return true; }
15136 );
15137 }
15138 if (value.indexOf("y") > -1) {
15139 malformedDesc = "Duplicate RegExp flag";
15140 }
15141 } else {
15142 flags.push(char);
15143 }
15144 value += char;
15145 index += 1;
15146 }
15147
15148 // Check regular expression for correctness.
15149
15150 try {
15151 new RegExp(body, flags.join(""));
15152 } catch (err) {
15153 /**
15154 * Because JSHint relies on the current engine's RegExp parser to
15155 * validate RegExp literals, the description (exposed as the "data"
15156 * property on the error object) is platform dependent.
15157 */
15158 malformedDesc = err.message;
15159 }
15160
15161 if (malformedDesc) {
15162 malformed = true;
15163 this.trigger("error", {
15164 code: "E016",
15165 line: this.line,
15166 character: this.char,
15167 data: [ malformedDesc ]
15168 });
15169 }
15170
15171 return {
15172 type: Token.RegExp,
15173 value: value,
15174 flags: flags,
15175 isMalformed: malformed
15176 };
15177 },
15178
15179 /*
15180 * Scan for any occurrence of non-breaking spaces. Non-breaking spaces
15181 * can be mistakenly typed on OS X with option-space. Non UTF-8 web
15182 * pages with non-breaking pages produce syntax errors.
15183 */
15184 scanNonBreakingSpaces: function() {
15185 return state.option.nonbsp ?
15186 this.input.search(/(\u00A0)/) : -1;
15187 },
15188
15189 /*
15190 * Scan for characters that get silently deleted by one or more browsers.
15191 */
15192 scanUnsafeChars: function() {
15193 return this.input.search(reg.unsafeChars);
15194 },
15195
15196 /*
15197 * Produce the next raw token or return 'null' if no tokens can be matched.
15198 * This method skips over all space characters.
15199 */
15200 next: function(checks) {
15201 this.from = this.char;
15202
15203 // Move to the next non-space character.
15204 while (/\s/.test(this.peek())) {
15205 this.from += 1;
15206 this.skip();
15207 }
15208
15209 // Methods that work with multi-line structures and move the
15210 // character pointer.
15211
15212 var match = this.scanComments(checks) ||
15213 this.scanStringLiteral(checks) ||
15214 this.scanTemplateLiteral(checks);
15215
15216 if (match) {
15217 return match;
15218 }
15219
15220 // Methods that don't move the character pointer.
15221
15222 match =
15223 this.scanRegExp(checks) ||
15224 this.scanPunctuator() ||
15225 this.scanKeyword() ||
15226 this.scanIdentifier() ||
15227 this.scanNumericLiteral(checks);
15228
15229 if (match) {
15230 this.skip(match.tokenLength || match.value.length);
15231 return match;
15232 }
15233
15234 // No token could be matched, give up.
15235
15236 return null;
15237 },
15238
15239 /*
15240 * Switch to the next line and reset all char pointers. Once
15241 * switched, this method also checks for other minor warnings.
15242 */
15243 nextLine: function(checks) {
15244 var char;
15245
15246 if (this.line >= this.getLines().length) {
15247 return false;
15248 }
15249
15250 this.input = this.getLines()[this.line];
15251 this.line += 1;
15252 this.char = 1;
15253 this.from = 1;
15254
15255 var inputTrimmed = this.input.trim();
15256
15257 var startsWith = function() {
15258 return _.some(arguments, function(prefix) {
15259 return inputTrimmed.indexOf(prefix) === 0;
15260 });
15261 };
15262
15263 var endsWith = function() {
15264 return _.some(arguments, function(suffix) {
15265 return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1;
15266 });
15267 };
15268
15269 // If we are ignoring linter errors, replace the input with empty string
15270 // if it doesn't already at least start or end a multi-line comment
15271 if (this.ignoringLinterErrors === true) {
15272 if (!startsWith("/*", "//") && !(this.inComment && endsWith("*/"))) {
15273 this.input = "";
15274 }
15275 }
15276
15277 char = this.scanNonBreakingSpaces();
15278 if (char >= 0) {
15279 this.triggerAsync(
15280 "warning",
15281 { code: "W125", line: this.line, character: char + 1 },
15282 checks,
15283 function() { return true; }
15284 );
15285 }
15286
15287 this.input = this.input.replace(/\t/g, state.tab);
15288 char = this.scanUnsafeChars();
15289
15290 if (char >= 0) {
15291 this.triggerAsync(
15292 "warning",
15293 { code: "W100", line: this.line, character: char },
15294 checks,
15295 function() { return true; }
15296 );
15297 }
15298
15299 // If there is a limit on line length, warn when lines get too
15300 // long.
15301
15302 if (!this.ignoringLinterErrors && state.option.maxlen &&
15303 state.option.maxlen < this.input.length) {
15304 var inComment = this.inComment ||
15305 startsWith.call(inputTrimmed, "//") ||
15306 startsWith.call(inputTrimmed, "/*");
15307
15308 var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed);
15309
15310 if (shouldTriggerError) {
15311 this.triggerAsync(
15312 "warning",
15313 { code: "W101", line: this.line, character: this.input.length },
15314 checks,
15315 function() { return true; }
15316 );
15317 }
15318 }
15319
15320 return true;
15321 },
15322
15323 /*
15324 * Produce the next token. This function is called by advance() to get
15325 * the next token. It returns a token in a JSLint-compatible format.
15326 */
15327 token: function() {
15328 /*jshint loopfunc:true */
15329 var checks = asyncTrigger();
15330 var token;
15331
15332
15333 function isReserved(token, isProperty) {
15334 if (!token.reserved) {
15335 return false;
15336 }
15337 var meta = token.meta;
15338
15339 if (meta && meta.isFutureReservedWord && state.inES5()) {
15340 // ES3 FutureReservedWord in an ES5 environment.
15341 if (!meta.es5) {
15342 return false;
15343 }
15344
15345 // Some ES5 FutureReservedWord identifiers are active only
15346 // within a strict mode environment.
15347 if (meta.strictOnly) {
15348 if (!state.option.strict && !state.isStrict()) {
15349 return false;
15350 }
15351 }
15352
15353 if (isProperty) {
15354 return false;
15355 }
15356 }
15357
15358 return true;
15359 }
15360
15361 // Produce a token object.
15362 var create = function(type, value, isProperty, token) {
15363 /*jshint validthis:true */
15364 var obj;
15365
15366 if (type !== "(endline)" && type !== "(end)") {
15367 this.prereg = false;
15368 }
15369
15370 if (type === "(punctuator)") {
15371 switch (value) {
15372 case ".":
15373 case ")":
15374 case "~":
15375 case "#":
15376 case "]":
15377 case "++":
15378 case "--":
15379 this.prereg = false;
15380 break;
15381 default:
15382 this.prereg = true;
15383 }
15384
15385 obj = Object.create(state.syntax[value] || state.syntax["(error)"]);
15386 }
15387
15388 if (type === "(identifier)") {
15389 if (value === "return" || value === "case" || value === "yield" ||
15390 value === "typeof" || value === "instanceof") {
15391 this.prereg = true;
15392 }
15393
15394 if (_.has(state.syntax, value)) {
15395 obj = Object.create(state.syntax[value] || state.syntax["(error)"]);
15396
15397 // If this can't be a reserved keyword, reset the object.
15398 if (!isReserved(obj, isProperty && type === "(identifier)")) {
15399 obj = null;
15400 }
15401 }
15402 }
15403
15404 if (type === "(template)" || type === "(template middle)") {
15405 this.prereg = true;
15406 }
15407
15408 if (!obj) {
15409 obj = Object.create(state.syntax[type]);
15410 }
15411
15412 obj.identifier = (type === "(identifier)");
15413 obj.type = obj.type || type;
15414 obj.value = value;
15415 obj.line = this.line;
15416 obj.character = this.char;
15417 obj.from = this.from;
15418 if (obj.identifier && token) obj.raw_text = token.text || token.value;
15419 if (token && token.startLine && token.startLine !== this.line) {
15420 obj.startLine = token.startLine;
15421 }
15422 if (token && token.context) {
15423 // Context of current token
15424 obj.context = token.context;
15425 }
15426 if (token && token.depth) {
15427 // Nested template depth
15428 obj.depth = token.depth;
15429 }
15430 if (token && token.isUnclosed) {
15431 // Mark token as unclosed string / template literal
15432 obj.isUnclosed = token.isUnclosed;
15433 }
15434
15435 if (isProperty && obj.identifier) {
15436 obj.isProperty = isProperty;
15437 }
15438
15439 obj.check = checks.check;
15440
15441 return obj;
15442 }.bind(this);
15443
15444 for (;;) {
15445 if (!this.input.length) {
15446 if (this.nextLine(checks)) {
15447 return create("(endline)", "");
15448 }
15449
15450 if (this.exhausted) {
15451 return null;
15452 }
15453
15454 this.exhausted = true;
15455 return create("(end)", "");
15456 }
15457
15458 token = this.next(checks);
15459
15460 if (!token) {
15461 if (this.input.length) {
15462 // Unexpected character.
15463 this.trigger("error", {
15464 code: "E024",
15465 line: this.line,
15466 character: this.char,
15467 data: [ this.peek() ]
15468 });
15469
15470 this.input = "";
15471 }
15472
15473 continue;
15474 }
15475
15476 switch (token.type) {
15477 case Token.StringLiteral:
15478 this.triggerAsync("String", {
15479 line: this.line,
15480 char: this.char,
15481 from: this.from,
15482 startLine: token.startLine,
15483 startChar: token.startChar,
15484 value: token.value,
15485 quote: token.quote
15486 }, checks, function() { return true; });
15487
15488 return create("(string)", token.value, null, token);
15489
15490 case Token.TemplateHead:
15491 this.trigger("TemplateHead", {
15492 line: this.line,
15493 char: this.char,
15494 from: this.from,
15495 startLine: token.startLine,
15496 startChar: token.startChar,
15497 value: token.value
15498 });
15499 return create("(template)", token.value, null, token);
15500
15501 case Token.TemplateMiddle:
15502 this.trigger("TemplateMiddle", {
15503 line: this.line,
15504 char: this.char,
15505 from: this.from,
15506 startLine: token.startLine,
15507 startChar: token.startChar,
15508 value: token.value
15509 });
15510 return create("(template middle)", token.value, null, token);
15511
15512 case Token.TemplateTail:
15513 this.trigger("TemplateTail", {
15514 line: this.line,
15515 char: this.char,
15516 from: this.from,
15517 startLine: token.startLine,
15518 startChar: token.startChar,
15519 value: token.value
15520 });
15521 return create("(template tail)", token.value, null, token);
15522
15523 case Token.NoSubstTemplate:
15524 this.trigger("NoSubstTemplate", {
15525 line: this.line,
15526 char: this.char,
15527 from: this.from,
15528 startLine: token.startLine,
15529 startChar: token.startChar,
15530 value: token.value
15531 });
15532 return create("(no subst template)", token.value, null, token);
15533
15534 case Token.Identifier:
15535 this.triggerAsync("Identifier", {
15536 line: this.line,
15537 char: this.char,
15538 from: this.from,
15539 name: token.value,
15540 raw_name: token.text,
15541 isProperty: state.tokens.curr.id === "."
15542 }, checks, function() { return true; });
15543
15544 /* falls through */
15545 case Token.Keyword:
15546 case Token.NullLiteral:
15547 case Token.BooleanLiteral:
15548 return create("(identifier)", token.value, state.tokens.curr.id === ".", token);
15549
15550 case Token.NumericLiteral:
15551 if (token.isMalformed) {
15552 // This condition unequivocally describes a syntax error.
15553 // TODO: Re-factor as an "error" (not a "warning").
15554 this.trigger("warning", {
15555 code: "W045",
15556 line: this.line,
15557 character: this.char,
15558 data: [ token.value ]
15559 });
15560 }
15561
15562 this.triggerAsync("warning", {
15563 code: "W114",
15564 line: this.line,
15565 character: this.char,
15566 data: [ "0x-" ]
15567 }, checks, function() { return token.base === 16 && state.jsonMode; });
15568
15569 this.triggerAsync("warning", {
15570 code: "W115",
15571 line: this.line,
15572 character: this.char
15573 }, checks, function() {
15574 return state.isStrict() && token.base === 8 && token.isLegacy;
15575 });
15576
15577 this.trigger("Number", {
15578 line: this.line,
15579 char: this.char,
15580 from: this.from,
15581 value: token.value,
15582 base: token.base,
15583 isMalformed: token.malformed
15584 });
15585
15586 return create("(number)", token.value);
15587
15588 case Token.RegExp:
15589 return create("(regexp)", token.value);
15590
15591 case Token.Comment:
15592 state.tokens.curr.comment = true;
15593
15594 if (token.isSpecial) {
15595 return {
15596 id: '(comment)',
15597 value: token.value,
15598 body: token.body,
15599 type: token.commentType,
15600 isSpecial: token.isSpecial,
15601 line: this.line,
15602 character: this.char,
15603 from: this.from
15604 };
15605 }
15606
15607 break;
15608
15609 case "":
15610 break;
15611
15612 default:
15613 return create("(punctuator)", token.value);
15614 }
15615 }
15616 }
15617 };
15618
15619 exports.Lexer = Lexer;
15620 exports.Context = Context;
15621
15622 },{"../data/ascii-identifier-data.js":1,"../data/non-ascii-identifier-part-only.js":2,"../data/non-ascii-identifier-start.js":3,"./reg.js":17,"./state.js":19,"events":5,"lodash":12}],14:[function(require,module,exports){
15623 "use strict";
15624
15625 var _ = require("lodash");
15626
15627 var errors = {
15628 // JSHint options
15629 E001: "Bad option: '{a}'.",
15630 E002: "Bad option value.",
15631
15632 // JSHint input
15633 E003: "Expected a JSON value.",
15634 E004: "Input is neither a string nor an array of strings.",
15635 E005: "Input is empty.",
15636 E006: "Unexpected early end of program.",
15637
15638 // Strict mode
15639 E007: "Missing \"use strict\" statement.",
15640 E008: "Strict violation.",
15641 E009: "Option 'validthis' can't be used in a global scope.",
15642 E010: "'with' is not allowed in strict mode.",
15643
15644 // Constants
15645 E011: "'{a}' has already been declared.",
15646 E012: "const '{a}' is initialized to 'undefined'.",
15647 E013: "Attempting to override '{a}' which is a constant.",
15648
15649 // Regular expressions
15650 E014: "A regular expression literal can be confused with '/='.",
15651 E015: "Unclosed regular expression.",
15652 E016: "Invalid regular expression.",
15653
15654 // Tokens
15655 E017: "Unclosed comment.",
15656 E018: "Unbegun comment.",
15657 E019: "Unmatched '{a}'.",
15658 E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
15659 E021: "Expected '{a}' and instead saw '{b}'.",
15660 E022: "Line breaking error '{a}'.",
15661 E023: "Missing '{a}'.",
15662 E024: "Unexpected '{a}'.",
15663 E025: "Missing ':' on a case clause.",
15664 E026: "Missing '}' to match '{' from line {a}.",
15665 E027: "Missing ']' to match '[' from line {a}.",
15666 E028: "Illegal comma.",
15667 E029: "Unclosed string.",
15668
15669 // Everything else
15670 E030: "Expected an identifier and instead saw '{a}'.",
15671 E031: "Bad assignment.", // FIXME: Rephrase
15672 E032: "Expected a small integer or 'false' and instead saw '{a}'.",
15673 E033: "Expected an operator and instead saw '{a}'.",
15674 E034: "get/set are ES5 features.",
15675 E035: "Missing property name.",
15676 E036: "Expected to see a statement and instead saw a block.",
15677 E037: null,
15678 E038: null,
15679 E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
15680 E040: "Each value should have its own case label.",
15681 E041: "Unrecoverable syntax error.",
15682 E042: "Stopping.",
15683 E043: "Too many errors.",
15684 E044: null,
15685 E045: "Invalid for each loop.",
15686 E046: "Yield expressions may only occur within generator functions.",
15687 E047: null,
15688 E048: "{a} declaration not directly within block.",
15689 E049: "A {a} cannot be named '{b}'.",
15690 E050: "Mozilla requires the yield expression to be parenthesized here.",
15691 E051: null,
15692 E052: "Unclosed template literal.",
15693 E053: "{a} declarations are only allowed at the top level of module scope.",
15694 E054: "Class properties must be methods. Expected '(' but instead saw '{a}'.",
15695 E055: "The '{a}' option cannot be set after any executable code.",
15696 E056: "'{a}' was used before it was declared, which is illegal for '{b}' variables.",
15697 E057: "Invalid meta property: '{a}.{b}'.",
15698 E058: "Missing semicolon.",
15699 E059: "Incompatible values for the '{a}' and '{b}' linting options.",
15700 E060: "Non-callable values cannot be used as the second operand to instanceof.",
15701 E061: "Invalid position for 'yield' expression (consider wrapping in parenthesis)."
15702 };
15703
15704 var warnings = {
15705 W001: "'hasOwnProperty' is a really bad name.",
15706 W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
15707 W003: "'{a}' was used before it was defined.",
15708 W004: "'{a}' is already defined.",
15709 W005: "A dot following a number can be confused with a decimal point.",
15710 W006: "Confusing minuses.",
15711 W007: "Confusing plusses.",
15712 W008: "A leading decimal point can be confused with a dot: '{a}'.",
15713 W009: "The array literal notation [] is preferable.",
15714 W010: "The object literal notation {} is preferable.",
15715 W011: null,
15716 W012: null,
15717 W013: null,
15718 W014: "Misleading line break before '{a}'; readers may interpret this as an expression boundary.",
15719 W015: null,
15720 W016: "Unexpected use of '{a}'.",
15721 W017: "Bad operand.",
15722 W018: "Confusing use of '{a}'.",
15723 W019: "Use the isNaN function to compare with NaN.",
15724 W020: "Read only.",
15725 W021: "Reassignment of '{a}', which is is a {b}. " +
15726 "Use 'var' or 'let' to declare bindings that may change.",
15727 W022: "Do not assign to the exception parameter.",
15728 W023: "Expected an identifier in an assignment and instead saw a function invocation.",
15729 W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
15730 W025: "Missing name in function declaration.",
15731 W026: "Inner functions should be listed at the top of the outer function.",
15732 W027: "Unreachable '{a}' after '{b}'.",
15733 W028: "Label '{a}' on {b} statement.",
15734 W030: "Expected an assignment or function call and instead saw an expression.",
15735 W031: "Do not use 'new' for side effects.",
15736 W032: "Unnecessary semicolon.",
15737 W033: "Missing semicolon.",
15738 W034: "Unnecessary directive \"{a}\".",
15739 W035: "Empty block.",
15740 W036: "Unexpected /*member '{a}'.",
15741 W037: "'{a}' is a statement label.",
15742 W038: "'{a}' used out of scope.",
15743 W039: "'{a}' is not allowed.",
15744 W040: "If a strict mode function is executed using function invocation, " +
15745 "its 'this' value will be undefined.",
15746 W041: null,
15747 W042: "Avoid EOL escaping.",
15748 W043: "Bad escaping of EOL. Use option multistr if needed.",
15749 W044: "Bad or unnecessary escaping.", /* TODO(caitp): remove W044 */
15750 W045: "Bad number '{a}'.",
15751 W046: "Don't use extra leading zeros '{a}'.",
15752 W047: "A trailing decimal point can be confused with a dot: '{a}'.",
15753 W048: "Unexpected control character in regular expression.",
15754 W049: "Unexpected escaped character '{a}' in regular expression.",
15755 W050: "JavaScript URL.",
15756 W051: "Variables should not be deleted.",
15757 W052: "Unexpected '{a}'.",
15758 W053: "Do not use {a} as a constructor.",
15759 W054: "The Function constructor is a form of eval.",
15760 W055: "A constructor name should start with an uppercase letter.",
15761 W056: "Bad constructor.",
15762 W057: "Weird construction. Is 'new' necessary?",
15763 W058: "Missing '()' invoking a constructor.",
15764 W059: "Avoid arguments.{a}.",
15765 W060: "document.write can be a form of eval.",
15766 W061: "eval can be harmful.",
15767 W062: "Wrap an immediate function invocation in parens " +
15768 "to assist the reader in understanding that the expression " +
15769 "is the result of a function, and not the function itself.",
15770 W063: "Math is not a function.",
15771 W064: "Missing 'new' prefix when invoking a constructor.",
15772 W065: "Missing radix parameter.",
15773 W066: "Implied eval. Consider passing a function instead of a string.",
15774 W067: "Bad invocation.",
15775 W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
15776 W069: "['{a}'] is better written in dot notation.",
15777 W070: "Extra comma. (it breaks older versions of IE)",
15778 W071: "This function has too many statements. ({a})",
15779 W072: "This function has too many parameters. ({a})",
15780 W073: "Blocks are nested too deeply. ({a})",
15781 W074: "This function's cyclomatic complexity is too high. ({a})",
15782 W075: "Duplicate {a} '{b}'.",
15783 W076: "Unexpected parameter '{a}' in get {b} function.",
15784 W077: "Expected a single parameter in set {a} function.",
15785 W078: "Setter is defined without getter.",
15786 W079: "Redefinition of '{a}'.",
15787 W080: "It's not necessary to initialize '{a}' to 'undefined'.",
15788 W081: null,
15789 W082: "Function declarations should not be placed in blocks. " +
15790 "Use a function expression or move the statement to the top of " +
15791 "the outer function.",
15792 W083: "Functions declared within loops referencing an outer scoped " +
15793 "variable may lead to confusing semantics.",
15794 W084: "Expected a conditional expression and instead saw an assignment.",
15795 W085: "Don't use 'with'.",
15796 W086: "Expected a 'break' statement before '{a}'.",
15797 W087: "Forgotten 'debugger' statement?",
15798 W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
15799 W089: "The body of a for in should be wrapped in an if statement to filter " +
15800 "unwanted properties from the prototype.",
15801 W090: "'{a}' is not a statement label.",
15802 W091: null,
15803 W093: "Did you mean to return a conditional instead of an assignment?",
15804 W094: "Unexpected comma.",
15805 W095: "Expected a string and instead saw {a}.",
15806 W096: "The '{a}' key may produce unexpected results.",
15807 W097: "Use the function form of \"use strict\".",
15808 W098: "'{a}' is defined but never used.",
15809 W099: null,
15810 W100: "This character may get silently deleted by one or more browsers.",
15811 W101: "Line is too long.",
15812 W102: null,
15813 W103: "The '{a}' property is deprecated.",
15814 W104: "'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).",
15815 W105: "Unexpected {a} in '{b}'.",
15816 W106: "Identifier '{a}' is not in camel case.",
15817 W107: "Script URL.",
15818 W108: "Strings must use doublequote.",
15819 W109: "Strings must use singlequote.",
15820 W110: "Mixed double and single quotes.",
15821 W112: "Unclosed string.",
15822 W113: "Control character in string: {a}.",
15823 W114: "Avoid {a}.",
15824 W115: "Octal literals are not allowed in strict mode.",
15825 W116: "Expected '{a}' and instead saw '{b}'.",
15826 W117: "'{a}' is not defined.",
15827 W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
15828 W119: "'{a}' is only available in ES{b} (use 'esversion: {b}').",
15829 W120: "You might be leaking a variable ({a}) here.",
15830 W121: "Extending prototype of native object: '{a}'.",
15831 W122: "Invalid typeof value '{a}'",
15832 W123: "'{a}' is already defined in outer scope.",
15833 W124: "A generator function should contain at least one yield expression.",
15834 W125: "This line contains non-breaking spaces: http://jshint.com/docs/options/#nonbsp",
15835 W126: "Unnecessary grouping operator.",
15836 W127: "Unexpected use of a comma operator.",
15837 W128: "Empty array elements require elision=true.",
15838 W129: "'{a}' is defined in a future version of JavaScript. Use a " +
15839 "different variable name to avoid migration issues.",
15840 W130: "Invalid element after rest element.",
15841 W131: "Invalid parameter after rest parameter.",
15842 W132: "`var` declarations are forbidden. Use `let` or `const` instead.",
15843 W133: "Invalid for-{a} loop left-hand-side: {b}.",
15844 W134: "The '{a}' option is only available when linting ECMAScript {b} code.",
15845 W135: "{a} may not be supported by non-browser environments.",
15846 W136: "'{a}' must be in function scope.",
15847 W137: "Empty destructuring.",
15848 W138: "Regular parameters should not come after default parameters.",
15849 W139: "Function expressions should not be used as the second operand to instanceof.",
15850 W140: "Missing comma."
15851 };
15852
15853 var info = {
15854 I001: "Comma warnings can be turned off with 'laxcomma'.",
15855 I002: null,
15856 I003: "ES5 option is now set per default"
15857 };
15858
15859 exports.errors = {};
15860 exports.warnings = {};
15861 exports.info = {};
15862
15863 _.each(errors, function(desc, code) {
15864 exports.errors[code] = { code: code, desc: desc };
15865 });
15866
15867 _.each(warnings, function(desc, code) {
15868 exports.warnings[code] = { code: code, desc: desc };
15869 });
15870
15871 _.each(info, function(desc, code) {
15872 exports.info[code] = { code: code, desc: desc };
15873 });
15874
15875 },{"lodash":12}],15:[function(require,module,exports){
15876 "use strict";
15877
15878 function NameStack() {
15879 this._stack = [];
15880 }
15881
15882 Object.defineProperty(NameStack.prototype, "length", {
15883 get: function() {
15884 return this._stack.length;
15885 }
15886 });
15887
15888 /**
15889 * Create a new entry in the stack. Useful for tracking names across
15890 * expressions.
15891 */
15892 NameStack.prototype.push = function() {
15893 this._stack.push(null);
15894 };
15895
15896 /**
15897 * Discard the most recently-created name on the stack.
15898 */
15899 NameStack.prototype.pop = function() {
15900 this._stack.pop();
15901 };
15902
15903 /**
15904 * Update the most recent name on the top of the stack.
15905 *
15906 * @param {object} token The token to consider as the source for the most
15907 * recent name.
15908 */
15909 NameStack.prototype.set = function(token) {
15910 this._stack[this.length - 1] = token;
15911 };
15912
15913 /**
15914 * Generate a string representation of the most recent name.
15915 *
15916 * @returns {string}
15917 */
15918 NameStack.prototype.infer = function() {
15919 var nameToken = this._stack[this.length - 1];
15920 var prefix = "";
15921 var type;
15922
15923 // During expected operation, the topmost entry on the stack will only
15924 // reflect the current function's name when the function is declared without
15925 // the `function` keyword (i.e. for in-line accessor methods). In other
15926 // cases, the `function` expression itself will introduce an empty entry on
15927 // the top of the stack, and this should be ignored.
15928 if (!nameToken || nameToken.type === "class") {
15929 nameToken = this._stack[this.length - 2];
15930 }
15931
15932 if (!nameToken) {
15933 return "(empty)";
15934 }
15935
15936 type = nameToken.type;
15937
15938 if (type !== "(string)" && type !== "(number)" && type !== "(identifier)" && type !== "default") {
15939 return "(expression)";
15940 }
15941
15942 if (nameToken.accessorType) {
15943 prefix = nameToken.accessorType + " ";
15944 }
15945
15946 return prefix + nameToken.value;
15947 };
15948
15949 module.exports = NameStack;
15950
15951 },{}],16:[function(require,module,exports){
15952 "use strict";
15953
15954 // These are the JSHint boolean options.
15955 exports.bool = {
15956 enforcing: {
15957
15958 /**
15959 * This option prohibits the use of bitwise operators such as `^` (XOR),
15960 * `|` (OR) and others. Bitwise operators are very rare in JavaScript
15961 * programs and quite often `&` is simply a mistyped `&&`.
15962 */
15963 bitwise : true,
15964
15965 /**
15966 *
15967 * This options prohibits overwriting prototypes of native objects such as
15968 * `Array`, `Date` and so on.
15969 *
15970 * // jshint freeze:true
15971 * Array.prototype.count = function (value) { return 4; };
15972 * // -> Warning: Extending prototype of native object: 'Array'.
15973 */
15974 freeze : true,
15975
15976 /**
15977 * This option allows you to force all variable names to use either
15978 * camelCase style or UPPER_CASE with underscores.
15979 *
15980 * @deprecated JSHint is limiting its scope to issues of code correctness.
15981 * If you would like to enforce rules relating to code style,
15982 * check out [the JSCS
15983 * project](https://github.com/jscs-dev/node-jscs).
15984 */
15985 camelcase : true,
15986
15987 /**
15988 * This option requires you to always put curly braces around blocks in
15989 * loops and conditionals. JavaScript allows you to omit curly braces when
15990 * the block consists of only one statement, for example:
15991 *
15992 * while (day)
15993 * shuffle();
15994 *
15995 * However, in some circumstances, it can lead to bugs (you'd think that
15996 * `sleep()` is a part of the loop while in reality it is not):
15997 *
15998 * while (day)
15999 * shuffle();
16000 * sleep();
16001 */
16002 curly : true,
16003
16004 /**
16005 * This options prohibits the use of `==` and `!=` in favor of `===` and
16006 * `!==`. The former try to coerce values before comparing them which can
16007 * lead to some unexpected results. The latter don't do any coercion so
16008 * they are generally safer. If you would like to learn more about type
16009 * coercion in JavaScript, we recommend [Truth, Equality and
16010 * JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/)
16011 * by Angus Croll.
16012 */
16013 eqeqeq : true,
16014
16015 /**
16016 * This option enables warnings about the use of identifiers which are
16017 * defined in future versions of JavaScript. Although overwriting them has
16018 * no effect in contexts where they are not implemented, this practice can
16019 * cause issues when migrating codebases to newer versions of the language.
16020 */
16021 futurehostile: true,
16022
16023 /**
16024 * This option tells JSHint that your code needs to adhere to ECMAScript 3
16025 * specification. Use this option if you need your program to be executable
16026 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
16027 * JavaScript environments.
16028 *
16029 * @deprecated Use `esversion: 3` instead.
16030 */
16031 es3 : true,
16032
16033 /**
16034 * This option enables syntax first defined in [the ECMAScript 5.1
16035 * specification](http://es5.github.io/). This includes allowing reserved
16036 * keywords as object properties.
16037 *
16038 * @deprecated Use `esversion: 5` instead.
16039 */
16040 es5 : true,
16041
16042 /**
16043 * This option requires all `for in` loops to filter object's items. The
16044 * for in statement allows for looping through the names of all of the
16045 * properties of an object including those inherited through the prototype
16046 * chain. This behavior can lead to unexpected items in your object so it
16047 * is generally safer to always filter inherited properties out as shown in
16048 * the example:
16049 *
16050 * for (key in obj) {
16051 * if (obj.hasOwnProperty(key)) {
16052 * // We are sure that obj[key] belongs to the object and was not inherited.
16053 * }
16054 * }
16055 *
16056 * For more in-depth understanding of `for in` loops in JavaScript, read
16057 * [Exploring JavaScript for-in
16058 * loops](http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/)
16059 * by Angus Croll.
16060 */
16061 forin : true,
16062
16063 /**
16064 * This option prohibits the use of immediate function invocations without
16065 * wrapping them in parentheses. Wrapping parentheses assists readers of
16066 * your code in understanding that the expression is the result of a
16067 * function, and not the function itself.
16068 *
16069 * @deprecated JSHint is limiting its scope to issues of code correctness.
16070 * If you would like to enforce rules relating to code style,
16071 * check out [the JSCS
16072 * project](https://github.com/jscs-dev/node-jscs).
16073 */
16074 immed : true,
16075
16076 /**
16077 * This option requires you to capitalize names of constructor functions.
16078 * Capitalizing functions that are intended to be used with `new` operator
16079 * is just a convention that helps programmers to visually distinguish
16080 * constructor functions from other types of functions to help spot
16081 * mistakes when using `this`.
16082 *
16083 * Not doing so won't break your code in any browsers or environments but
16084 * it will be a bit harder to figure out—by reading the code—if the
16085 * function was supposed to be used with or without new. And this is
16086 * important because when the function that was intended to be used with
16087 * `new` is used without it, `this` will point to the global object instead
16088 * of a new object.
16089 *
16090 * @deprecated JSHint is limiting its scope to issues of code correctness.
16091 * If you would like to enforce rules relating to code style,
16092 * check out [the JSCS
16093 * project](https://github.com/jscs-dev/node-jscs).
16094 */
16095 newcap : true,
16096
16097 /**
16098 * This option prohibits the use of `arguments.caller` and
16099 * `arguments.callee`. Both `.caller` and `.callee` make quite a few
16100 * optimizations impossible so they were deprecated in future versions of
16101 * JavaScript. In fact, ECMAScript 5 forbids the use of `arguments.callee`
16102 * in strict mode.
16103 */
16104 noarg : true,
16105
16106 /**
16107 * This option prohibits the use of the comma operator. When misused, the
16108 * comma operator can obscure the value of a statement and promote
16109 * incorrect code.
16110 */
16111 nocomma : true,
16112
16113 /**
16114 * This option warns when you have an empty block in your code. JSLint was
16115 * originally warning for all empty blocks and we simply made it optional.
16116 * There were no studies reporting that empty blocks in JavaScript break
16117 * your code in any way.
16118 *
16119 * @deprecated JSHint is limiting its scope to issues of code correctness.
16120 * If you would like to enforce rules relating to code style,
16121 * check out [the JSCS
16122 * project](https://github.com/jscs-dev/node-jscs).
16123 */
16124 noempty : true,
16125
16126 /**
16127 * This option warns about "non-breaking whitespace" characters. These
16128 * characters can be entered with option-space on Mac computers and have a
16129 * potential of breaking non-UTF8 web pages.
16130 */
16131 nonbsp : true,
16132
16133 /**
16134 * This option prohibits the use of constructor functions for side-effects.
16135 * Some people like to call constructor functions without assigning its
16136 * result to any variable:
16137 *
16138 * new MyConstructor();
16139 *
16140 * There is no advantage in this approach over simply calling
16141 * `MyConstructor` since the object that the operator `new` creates isn't
16142 * used anywhere so you should generally avoid constructors like this one.
16143 */
16144 nonew : true,
16145
16146 /**
16147 * This option prohibits the use of explicitly undeclared variables. This
16148 * option is very useful for spotting leaking and mistyped variables.
16149 *
16150 * // jshint undef:true
16151 *
16152 * function test() {
16153 * var myVar = 'Hello, World';
16154 * console.log(myvar); // Oops, typoed here. JSHint with undef will complain
16155 * }
16156 *
16157 * If your variable is defined in another file, you can use the `global`
16158 * directive to tell JSHint about it.
16159 */
16160 undef : true,
16161
16162 /**
16163 * This option prohibits the use of the grouping operator when it is not
16164 * strictly required. Such usage commonly reflects a misunderstanding of
16165 * unary operators, for example:
16166 *
16167 * // jshint singleGroups: true
16168 *
16169 * delete(obj.attr); // Warning: Unnecessary grouping operator.
16170 */
16171 singleGroups: false,
16172
16173 /**
16174 * When set to true, the use of VariableStatements are forbidden.
16175 * For example:
16176 *
16177 * // jshint varstmt: true
16178 *
16179 * var a; // Warning: `var` declarations are forbidden. Use `let` or `const` instead.
16180 */
16181 varstmt: false,
16182
16183 /**
16184 * This option is a short hand for the most strict JSHint configuration as
16185 * available in JSHint version 2.6.3. It enables all enforcing options and
16186 * disables all relaxing options that were defined in that release.
16187 *
16188 * @deprecated The option cannot be maintained without automatically opting
16189 * users in to new features. This can lead to unexpected
16190 * warnings/errors in when upgrading between minor versions of
16191 * JSHint.
16192 */
16193 enforceall : false,
16194
16195 /**
16196 * This option warns when a comma is not placed after the last element in an
16197 * array or object literal. Due to bugs in old versions of IE, trailing
16198 * commas used to be discouraged, but since ES5 their semantics were
16199 * standardized. (See
16200 * [#11.1.4](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.4) and
16201 * [#11.1.5](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5).)
16202 * Now, they help to prevent the same [visual
16203 * ambiguities](http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.2)
16204 * that the strict usage of semicolons helps prevent.
16205 *
16206 * For example, this code might have worked last Tuesday:
16207 *
16208 * [
16209 * b + c
16210 * ].forEach(print);
16211 *
16212 * But if one adds an element to the array and forgets to compensate for the
16213 * missing comma, no syntax error is thrown, and a linter cannot determine
16214 * if this was a mistake or an intentional function invocation.
16215 *
16216 * [
16217 * b + c
16218 * (d + e)
16219 * ].forEach(print);
16220 *
16221 * If one always appends a list item with a comma, this ambiguity cannot
16222 * occur:
16223 *
16224 * [
16225 * b + c,
16226 * ].forEach(print);
16227 *
16228 * [
16229 * b + c,
16230 * (d + e),
16231 * ].forEach(print);
16232 */
16233 trailingcomma: false
16234 },
16235 relaxing: {
16236
16237 /**
16238 * This option suppresses warnings about missing semicolons. There is a lot
16239 * of FUD about semicolon spread by quite a few people in the community.
16240 * The common myths are that semicolons are required all the time (they are
16241 * not) and that they are unreliable. JavaScript has rules about semicolons
16242 * which are followed by *all* browsers so it is up to you to decide
16243 * whether you should or should not use semicolons in your code.
16244 *
16245 * For more information about semicolons in JavaScript read [An Open Letter
16246 * to JavaScript Leaders Regarding
16247 * Semicolons](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding)
16248 * by Isaac Schlueter and [JavaScript Semicolon
16249 * Insertion](http://inimino.org/~inimino/blog/javascript_semicolons).
16250 */
16251 asi : true,
16252
16253 /**
16254 * This option suppresses warnings about multi-line strings. Multi-line
16255 * strings can be dangerous in JavaScript because all hell breaks loose if
16256 * you accidentally put a whitespace in between the escape character (`\`)
16257 * and a new line.
16258 *
16259 * Note that even though this option allows correct multi-line strings, it
16260 * still warns about multi-line strings without escape characters or with
16261 * anything in between the escape character and a whitespace.
16262 *
16263 * // jshint multistr:true
16264 *
16265 * var text = "Hello\
16266 * World"; // All good.
16267 *
16268 * text = "Hello
16269 * World"; // Warning, no escape character.
16270 *
16271 * text = "Hello\
16272 * World"; // Warning, there is a space after \
16273 *
16274 * @deprecated JSHint is limiting its scope to issues of code correctness.
16275 * If you would like to enforce rules relating to code style,
16276 * check out [the JSCS
16277 * project](https://github.com/jscs-dev/node-jscs).
16278 */
16279 multistr : true,
16280
16281 /**
16282 * This option suppresses warnings about the `debugger` statements in your
16283 * code.
16284 */
16285 debug : true,
16286
16287 /**
16288 * This option suppresses warnings about the use of assignments in cases
16289 * where comparisons are expected. More often than not, code like `if (a =
16290 * 10) {}` is a typo. However, it can be useful in cases like this one:
16291 *
16292 * for (var i = 0, person; person = people[i]; i++) {}
16293 *
16294 * You can silence this error on a per-use basis by surrounding the assignment
16295 * with parenthesis, such as:
16296 *
16297 * for (var i = 0, person; (person = people[i]); i++) {}
16298 */
16299 boss : true,
16300
16301 /**
16302 * This option suppresses warnings about the use of `eval`. The use of
16303 * `eval` is discouraged because it can make your code vulnerable to
16304 * various injection attacks and it makes it hard for JavaScript
16305 * interpreter to do certain optimizations.
16306 */
16307 evil : true,
16308
16309 /**
16310 * This option suppresses warnings about declaring variables inside of
16311 * control
16312 * structures while accessing them later from the outside. Even though
16313 * JavaScript has only two real scopes—global and function—such practice
16314 * leads to confusion among people new to the language and hard-to-debug
16315 * bugs. This is why, by default, JSHint warns about variables that are
16316 * used outside of their intended scope.
16317 *
16318 * function test() {
16319 * if (true) {
16320 * var x = 0;
16321 * }
16322 *
16323 * x += 1; // Default: 'x' used out of scope.
16324 * // No warning when funcscope:true
16325 * }
16326 */
16327 funcscope : true,
16328
16329 /**
16330 * This option suppresses warnings about the use of global strict mode.
16331 * Global strict mode can break third-party widgets so it is not
16332 * recommended.
16333 *
16334 * For more info about strict mode see the `strict` option.
16335 *
16336 * @deprecated Use `strict: "global"`.
16337 */
16338 globalstrict: true,
16339
16340 /**
16341 * This option suppresses warnings about the `__iterator__` property. This
16342 * property is not supported by all browsers so use it carefully.
16343 */
16344 iterator : true,
16345
16346 /**
16347 * This option suppresses warnings about invalid `typeof` operator values.
16348 * This operator has only [a limited set of possible return
16349 * values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof).
16350 * By default, JSHint warns when you compare its result with an invalid
16351 * value which often can be a typo.
16352 *
16353 * // 'fuction' instead of 'function'
16354 * if (typeof a == "fuction") { // Invalid typeof value 'fuction'
16355 * // ...
16356 * }
16357 *
16358 * Do not use this option unless you're absolutely sure you don't want
16359 * these checks.
16360 */
16361 notypeof : true,
16362
16363 /**
16364 * This option prohibits the use of unary increment and decrement
16365 * operators. Some people think that `++` and `--` reduces the quality of
16366 * their coding styles and there are programming languages—such as
16367 * Python—that go completely without these operators.
16368 */
16369 plusplus : true,
16370
16371 /**
16372 * This option suppresses warnings about the `__proto__` property.
16373 */
16374 proto : true,
16375
16376 /**
16377 * This option suppresses warnings about the use of script-targeted
16378 * URLs—such as `javascript:...`.
16379 */
16380 scripturl : true,
16381
16382 /**
16383 * This option suppresses warnings about using `[]` notation when it can be
16384 * expressed in dot notation: `person['name']` vs. `person.name`.
16385 *
16386 * @deprecated JSHint is limiting its scope to issues of code correctness.
16387 * If you would like to enforce rules relating to code style,
16388 * check out [the JSCS
16389 * project](https://github.com/jscs-dev/node-jscs).
16390 */
16391 sub : true,
16392
16393 /**
16394 * This option suppresses warnings about "weird" constructions like
16395 * `new function () { ... }` and `new Object;`. Such constructions are
16396 * sometimes used to produce singletons in JavaScript:
16397 *
16398 * var singleton = new function() {
16399 * var privateVar;
16400 *
16401 * this.publicMethod = function () {}
16402 * this.publicMethod2 = function () {}
16403 * };
16404 */
16405 supernew : true,
16406
16407 /**
16408 * This option suppresses most of the warnings about possibly unsafe line
16409 * breakings in your code. It doesn't suppress warnings about comma-first
16410 * coding style. To suppress those you have to use `laxcomma` (see below).
16411 *
16412 * @deprecated JSHint is limiting its scope to issues of code correctness.
16413 * If you would like to enforce rules relating to code style,
16414 * check out [the JSCS
16415 * project](https://github.com/jscs-dev/node-jscs).
16416 */
16417 laxbreak : true,
16418
16419 /**
16420 * This option suppresses warnings about comma-first coding style:
16421 *
16422 * var obj = {
16423 * name: 'Anton'
16424 * , handle: 'valueof'
16425 * , role: 'SW Engineer'
16426 * };
16427 *
16428 * @deprecated JSHint is limiting its scope to issues of code correctness.
16429 * If you would like to enforce rules relating to code style,
16430 * check out [the JSCS
16431 * project](https://github.com/jscs-dev/node-jscs).
16432 */
16433 laxcomma : true,
16434
16435 /**
16436 * This option suppresses warnings about possible strict violations when
16437 * the code is running in strict mode and you use `this` in a
16438 * non-constructor function. You should use this option—in a function scope
16439 * only—when you are positive that your use of `this` is valid in the
16440 * strict mode (for example, if you call your function using
16441 * `Function.call`).
16442 *
16443 * **Note:** This option can be used only inside of a function scope.
16444 * JSHint will fail with an error if you will try to set this option
16445 * globally.
16446 */
16447 validthis : true,
16448
16449 /**
16450 * This option suppresses warnings about the use of the `with` statement.
16451 * The semantics of the `with` statement can cause confusion among
16452 * developers and accidental definition of global variables.
16453 *
16454 * More info:
16455 *
16456 * * [with Statement Considered
16457 * Harmful](http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/)
16458 */
16459 withstmt : true,
16460
16461 /**
16462 * This options tells JSHint that your code uses Mozilla JavaScript
16463 * extensions. Unless you develop specifically for the Firefox web browser
16464 * you don't need this option.
16465 *
16466 * More info:
16467 *
16468 * * [New in JavaScript
16469 * 1.7](https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7)
16470 */
16471 moz : true,
16472
16473 /**
16474 * This option suppresses warnings about generator functions with no
16475 * `yield` statement in them.
16476 */
16477 noyield : true,
16478
16479 /**
16480 * This option suppresses warnings about `== null` comparisons. Such
16481 * comparisons are often useful when you want to check if a variable is
16482 * `null` or `undefined`.
16483 */
16484 eqnull : true,
16485
16486 /**
16487 * This option suppresses warnings about missing semicolons, but only when
16488 * the semicolon is omitted for the last statement in a one-line block:
16489 *
16490 * var name = (function() { return 'Anton' }());
16491 *
16492 * This is a very niche use case that is useful only when you use automatic
16493 * JavaScript code generators.
16494 */
16495 lastsemic : true,
16496
16497 /**
16498 * This option suppresses warnings about functions inside of loops.
16499 * Defining functions inside of loops can lead to bugs such as this one:
16500 *
16501 * var nums = [];
16502 *
16503 * for (var i = 0; i < 10; i++) {
16504 * nums[i] = function (j) {
16505 * return i + j;
16506 * };
16507 * }
16508 *
16509 * nums[0](2); // Prints 12 instead of 2
16510 *
16511 * To fix the code above you need to copy the value of `i`:
16512 *
16513 * var nums = [];
16514 *
16515 * for (var i = 0; i < 10; i++) {
16516 * (function (i) {
16517 * nums[i] = function (j) {
16518 * return i + j;
16519 * };
16520 * }(i));
16521 * }
16522 */
16523 loopfunc : true,
16524
16525 /**
16526 * This option suppresses warnings about the use of expressions where
16527 * normally you would expect to see assignments or function calls. Most of
16528 * the time, such code is a typo. However, it is not forbidden by the spec
16529 * and that's why this warning is optional.
16530 */
16531 expr : true,
16532
16533 /**
16534 * This option tells JSHint that your code uses ECMAScript 6 specific
16535 * syntax. Note that not all browsers implement these features.
16536 *
16537 * More info:
16538 *
16539 * * [Specification for ECMAScript
16540 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html)
16541 *
16542 * @deprecated Use `esversion: 6` instead.
16543 */
16544 esnext : true,
16545
16546 /**
16547 * This option tells JSHint that your code uses ES3 array elision elements,
16548 * or empty elements (for example, `[1, , , 4, , , 7]`).
16549 */
16550 elision : true,
16551 },
16552
16553 // Third party globals
16554 environments: {
16555
16556 /**
16557 * This option defines globals exposed by the
16558 * [MooTools](http://mootools.net/) JavaScript framework.
16559 */
16560 mootools : true,
16561
16562 /**
16563 * This option defines globals exposed by
16564 * [CouchDB](http://couchdb.apache.org/). CouchDB is a document-oriented
16565 * database that can be queried and indexed in a MapReduce fashion using
16566 * JavaScript.
16567 */
16568 couch : true,
16569
16570 /**
16571 * This option defines globals exposed by [the Jasmine unit testing
16572 * framework](https://jasmine.github.io/).
16573 */
16574 jasmine : true,
16575
16576 /**
16577 * This option defines globals exposed by the [jQuery](http://jquery.com/)
16578 * JavaScript library.
16579 */
16580 jquery : true,
16581
16582 /**
16583 * This option defines globals available when your code is running inside
16584 * of the Node runtime environment. [Node.js](http://nodejs.org/) is a
16585 * server-side JavaScript environment that uses an asynchronous
16586 * event-driven model. This option also skips some warnings that make sense
16587 * in the browser environments but don't make sense in Node such as
16588 * file-level `use strict` pragmas and `console.log` statements.
16589 */
16590 node : true,
16591
16592 /**
16593 * This option defines globals exposed by [the QUnit unit testing
16594 * framework](http://qunitjs.com/).
16595 */
16596 qunit : true,
16597
16598 /**
16599 * This option defines globals available when your code is running inside
16600 * of the Rhino runtime environment. [Rhino](http://www.mozilla.org/rhino/)
16601 * is an open-source implementation of JavaScript written entirely in Java.
16602 */
16603 rhino : true,
16604
16605 /**
16606 * This option defines globals exposed by [the ShellJS
16607 * library](http://documentup.com/arturadib/shelljs).
16608 */
16609 shelljs : true,
16610
16611 /**
16612 * This option defines globals exposed by the
16613 * [Prototype](http://www.prototypejs.org/) JavaScript framework.
16614 */
16615 prototypejs : true,
16616
16617 /**
16618 * This option defines globals exposed by the [YUI](http://yuilibrary.com/)
16619 * JavaScript framework.
16620 */
16621 yui : true,
16622
16623 /**
16624 * This option defines globals exposed by the "BDD" and "TDD" UIs of the
16625 * [Mocha unit testing framework](http://mochajs.org/).
16626 */
16627 mocha : true,
16628
16629 /**
16630 * This option informs JSHint that the input code describes an ECMAScript 6
16631 * module. All module code is interpreted as strict mode code.
16632 */
16633 module : true,
16634
16635 /**
16636 * This option defines globals available when your code is running as a
16637 * script for the [Windows Script
16638 * Host](http://en.wikipedia.org/wiki/Windows_Script_Host).
16639 */
16640 wsh : true,
16641
16642 /**
16643 * This option defines globals available when your code is running inside
16644 * of a Web Worker. [Web
16645 * Workers](https://developer.mozilla.org/en/Using_web_workers) provide a
16646 * simple means for web content to run scripts in background threads.
16647 */
16648 worker : true,
16649
16650 /**
16651 * This option defines non-standard but widely adopted globals such as
16652 * `escape` and `unescape`.
16653 */
16654 nonstandard : true,
16655
16656 /**
16657 * This option defines globals exposed by modern browsers: all the way from
16658 * good old `document` and `navigator` to the HTML5 `FileReader` and other
16659 * new developments in the browser world.
16660 *
16661 * **Note:** This option doesn't expose variables like `alert` or
16662 * `console`. See option `devel` for more information.
16663 */
16664 browser : true,
16665
16666 /**
16667 * This option defines globals available when using [the Browserify
16668 * tool](http://browserify.org/) to build a project.
16669 */
16670 browserify : true,
16671
16672 /**
16673 * This option defines globals that are usually used for logging poor-man's
16674 * debugging: `console`, `alert`, etc. It is usually a good idea to not
16675 * ship them in production because, for example, `console.log` breaks in
16676 * legacy versions of Internet Explorer.
16677 */
16678 devel : true,
16679
16680 /**
16681 * This option defines globals exposed by the [Dojo
16682 * Toolkit](http://dojotoolkit.org/).
16683 */
16684 dojo : true,
16685
16686 /**
16687 * This option defines globals for typed array constructors.
16688 *
16689 * More info:
16690 *
16691 * * [JavaScript typed
16692 * arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays)
16693 */
16694 typed : true,
16695
16696 /**
16697 * This option defines globals available when your core is running inside
16698 * of the PhantomJS runtime environment. [PhantomJS](http://phantomjs.org/)
16699 * is a headless WebKit scriptable with a JavaScript API. It has fast and
16700 * native support for various web standards: DOM handling, CSS selector,
16701 * JSON, Canvas, and SVG.
16702 */
16703 phantom : true
16704 },
16705
16706 // Obsolete options
16707 obsolete: {
16708 onecase : true, // if one case switch statements should be allowed
16709 regexp : true, // if the . should not be allowed in regexp literals
16710 regexdash : true // if unescaped first/last dash (-) inside brackets
16711 // should be tolerated
16712 }
16713 };
16714
16715 // These are the JSHint options that can take any value
16716 // (we use this object to detect invalid options)
16717 exports.val = {
16718
16719 /**
16720 * This option lets you set the maximum length of a line.
16721 *
16722 * @deprecated JSHint is limiting its scope to issues of code correctness. If
16723 * you would like to enforce rules relating to code style, check
16724 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
16725 */
16726 maxlen : false,
16727
16728 /**
16729 * This option sets a specific tab width for your code.
16730 *
16731 * @deprecated JSHint is limiting its scope to issues of code correctness. If
16732 * you would like to enforce rules relating to code style, check
16733 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
16734 */
16735 indent : false,
16736
16737 /**
16738 * This options allows you to set the maximum amount of warnings JSHint will
16739 * produce before giving up. Default is 50.
16740 */
16741 maxerr : false,
16742
16743 /**
16744 * This option allows you to control which variables JSHint considers to be
16745 * implicitly defined in the environment. Configure it with an array of
16746 * string values. Prefixing a variable name with a hyphen (-) character will
16747 * remove that name from the collection of predefined variables.
16748 *
16749 * JSHint will consider variables declared in this way to be read-only.
16750 *
16751 * This option cannot be specified in-line; it may only be used via the
16752 * JavaScript API or from an external configuration file.
16753 */
16754 predef : false,
16755
16756 /**
16757 * This option can be used to specify a white list of global variables that
16758 * are not formally defined in the source code. This is most useful when
16759 * combined with the `undef` option in order to suppress warnings for
16760 * project-specific global variables.
16761 *
16762 * Setting an entry to `true` enables reading and writing to that variable.
16763 * Setting it to `false` will trigger JSHint to consider that variable
16764 * read-only.
16765 *
16766 * See also the "environment" options: a set of options to be used as short
16767 * hand for enabling global variables defined in common JavaScript
16768 * environments.
16769 *
16770 * To configure `globals` within an individual file, see [Inline
16771 * Configuration](http://jshint.com/docs/#inline-configuration).
16772 */
16773 globals : false,
16774
16775 /**
16776 * This option enforces the consistency of quotation marks used throughout
16777 * your code. It accepts three values: `true` if you don't want to enforce
16778 * one particular style but want some consistency, `"single"` if you want to
16779 * allow only single quotes and `"double"` if you want to allow only double
16780 * quotes.
16781 *
16782 * @deprecated JSHint is limiting its scope to issues of code correctness. If
16783 * you would like to enforce rules relating to code style, check
16784 * out [the JSCS project](https://github.com/jscs-dev/node-jscs).
16785 */
16786 quotmark : false,
16787
16788 scope : false,
16789
16790 /**
16791 * This option lets you set the max number of statements allowed per function:
16792 *
16793 * // jshint maxstatements:4
16794 *
16795 * function main() {
16796 * var i = 0;
16797 * var j = 0;
16798 *
16799 * // Function declarations count as one statement. Their bodies
16800 * // don't get taken into account for the outer function.
16801 * function inner() {
16802 * var i2 = 1;
16803 * var j2 = 1;
16804 *
16805 * return i2 + j2;
16806 * }
16807 *
16808 * j = i + j;
16809 * return j; // JSHint: Too many statements per function. (5)
16810 * }
16811 */
16812 maxstatements: false,
16813
16814 /**
16815 * This option lets you control how nested do you want your blocks to be:
16816 *
16817 * // jshint maxdepth:2
16818 *
16819 * function main(meaning) {
16820 * var day = true;
16821 *
16822 * if (meaning === 42) {
16823 * while (day) {
16824 * shuffle();
16825 *
16826 * if (tired) { // JSHint: Blocks are nested too deeply (3).
16827 * sleep();
16828 * }
16829 * }
16830 * }
16831 * }
16832 */
16833 maxdepth : false,
16834
16835 /**
16836 * This option lets you set the max number of formal parameters allowed per
16837 * function:
16838 *
16839 * // jshint maxparams:3
16840 *
16841 * function login(request, onSuccess) {
16842 * // ...
16843 * }
16844 *
16845 * // JSHint: Too many parameters per function (4).
16846 * function logout(request, isManual, whereAmI, onSuccess) {
16847 * // ...
16848 * }
16849 */
16850 maxparams : false,
16851
16852 /**
16853 * This option lets you control cyclomatic complexity throughout your code.
16854 * Cyclomatic complexity measures the number of linearly independent paths
16855 * through a program's source code. Read more about [cyclomatic complexity on
16856 * Wikipedia](http://en.wikipedia.org/wiki/Cyclomatic_complexity).
16857 */
16858 maxcomplexity: false,
16859
16860 /**
16861 * This option suppresses warnings about variable shadowing i.e. declaring a
16862 * variable that had been already declared somewhere in the outer scope.
16863 *
16864 * - "inner" - check for variables defined in the same scope only
16865 * - "outer" - check for variables defined in outer scopes as well
16866 * - false - same as inner
16867 * - true - allow variable shadowing
16868 */
16869 shadow : false,
16870
16871 /**
16872 * This option requires the code to run in ECMAScript 5's strict mode.
16873 * [Strict mode](https://developer.mozilla.org/en/JavaScript/Strict_mode)
16874 * is a way to opt in to a restricted variant of JavaScript. Strict mode
16875 * eliminates some JavaScript pitfalls that didn't cause errors by changing
16876 * them to produce errors. It also fixes mistakes that made it difficult
16877 * for the JavaScript engines to perform certain optimizations.
16878 *
16879 * - "global" - there must be a `"use strict";` directive at global level
16880 * - "implied" - lint the code as if there is the `"use strict";` directive
16881 * - false - disable warnings about strict mode
16882 * - true - there must be a `"use strict";` directive at function level;
16883 * this is preferable for scripts intended to be loaded in web
16884 * browsers directly because enabling strict mode globally
16885 * could adversely effect other scripts running on the same
16886 * page
16887 */
16888 strict : true,
16889
16890 /**
16891 * This option warns when you define and never use your variables. It is very
16892 * useful for general code cleanup, especially when used in addition to
16893 * `undef`.
16894 *
16895 * // jshint unused:true
16896 *
16897 * function test(a, b) {
16898 * var c, d = 2;
16899 *
16900 * return a + d;
16901 * }
16902 *
16903 * test(1, 2);
16904 *
16905 * // Line 3: 'b' was defined but never used.
16906 * // Line 4: 'c' was defined but never used.
16907 *
16908 * In addition to that, this option will warn you about unused global
16909 * variables declared via the `global` directive.
16910 *
16911 * When set to `true`, unused parameters that are followed by a used
16912 * parameter will not produce warnings. This option can be set to `vars` to
16913 * only check for variables, not function parameters, or `strict` to check
16914 * all variables and parameters.
16915 */
16916 unused : true,
16917
16918 /**
16919 * This option prohibits the use of a variable before it was defined.
16920 * JavaScript has function scope only and, in addition to that, all variables
16921 * are always moved—or hoisted— to the top of the function. This behavior can
16922 * lead to some very nasty bugs and that's why it is safer to always use
16923 * variable only after they have been explicitly defined.
16924 *
16925 * Setting this option to "nofunc" will allow function declarations to be
16926 * ignored.
16927 *
16928 * For more in-depth understanding of scoping and hoisting in JavaScript,
16929 * read [JavaScript Scoping and
16930 * Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)
16931 * by Ben Cherry.
16932 */
16933 latedef : false,
16934
16935 ignore : false, // start/end ignoring lines of code, bypassing the lexer
16936 // start - start ignoring lines, including the current line
16937 // end - stop ignoring lines, starting on the next line
16938 // line - ignore warnings / errors for just a single line
16939 // (this option does not bypass the lexer)
16940
16941 ignoreDelimiters: false, // array of start/end delimiters used to ignore
16942 // certain chunks from code
16943
16944 /**
16945 * This option is used to specify the ECMAScript version to which the code
16946 * must adhere. It can assume one of the following values:
16947 * - `3` - If you need your program to be executable
16948 * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
16949 * JavaScript environments
16950 * - `5` - To enable syntax first defined in [the ECMAScript 5.1
16951 * specification](http://www.ecma-international.org/ecma-262/5.1/index.html).
16952 * This includes allowing reserved keywords as object properties.
16953 * - `6` - To tell JSHint that your code uses [ECMAScript
16954 * 6](http://www.ecma-international.org/ecma-262/6.0/index.html) specific
16955 * syntax. Note that not all browsers implement them.
16956 */
16957 esversion: 5
16958 };
16959
16960 // These are JSHint boolean options which are shared with JSLint
16961 // where the definition in JSHint is opposite JSLint
16962 exports.inverted = {
16963 bitwise : true,
16964 forin : true,
16965 newcap : true,
16966 plusplus: true,
16967 regexp : true,
16968 undef : true,
16969
16970 // Inverted and renamed, use JSHint name here
16971 eqeqeq : true,
16972 strict : true
16973 };
16974
16975 exports.validNames = Object.keys(exports.val)
16976 .concat(Object.keys(exports.bool.relaxing))
16977 .concat(Object.keys(exports.bool.enforcing))
16978 .concat(Object.keys(exports.bool.obsolete))
16979 .concat(Object.keys(exports.bool.environments));
16980
16981 // These are JSHint boolean options which are shared with JSLint
16982 // where the name has been changed but the effect is unchanged
16983 exports.renamed = {
16984 eqeq : "eqeqeq",
16985 windows: "wsh",
16986 sloppy : "strict"
16987 };
16988
16989 exports.removed = {
16990 nomen: true,
16991 onevar: true,
16992 passfail: true,
16993 white: true,
16994 gcl: true,
16995 smarttabs: true,
16996 trailing: true
16997 };
16998
16999 // Add options here which should not be automatically enforced by
17000 // `enforceall`.
17001 exports.noenforceall = {
17002 varstmt: true,
17003 strict: true
17004 };
17005
17006 },{}],17:[function(require,module,exports){
17007 /*
17008 * Regular expressions. Some of these are stupidly long.
17009 */
17010
17011 /*jshint maxlen:1000 */
17012
17013 "use strict";
17014
17015 // Unsafe comment or string (ax)
17016 exports.unsafeString =
17017 /@cc|<\/?|script|\]\s*\]|<\s*!|&lt/i;
17018
17019 // Unsafe characters that are silently deleted by one or more browsers (cx)
17020 exports.unsafeChars =
17021 /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
17022
17023 // Characters in strings that need escaping (nx and nxg)
17024 exports.needEsc =
17025 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
17026
17027 exports.needEscGlobal =
17028 /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
17029
17030 // Star slash (lx)
17031 exports.starSlash = /\*\//;
17032
17033 // Identifier (ix)
17034 exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;
17035
17036 // JavaScript URL (jx)
17037 exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
17038
17039 // Catches /* falls through */ comments (ft)
17040 exports.fallsThrough = /^\s*falls?\sthrough\s*$/;
17041
17042 // very conservative rule (eg: only one space between the start of the comment and the first character)
17043 // to relax the maxlen option
17044 exports.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/;
17045
17046 },{}],18:[function(require,module,exports){
17047 "use strict";
17048
17049 var _ = require("lodash");
17050 var events = require("events");
17051
17052 // Used to denote membership in lookup tables (a primitive value such as `true`
17053 // would be silently rejected for the property name "__proto__" in some
17054 // environments)
17055 var marker = {};
17056
17057 /**
17058 * Creates a scope manager that handles variables and labels, storing usages
17059 * and resolving when variables are used and undefined
17060 */
17061 var scopeManager = function(state, predefined, exported, declared) {
17062
17063 var _current;
17064 var _scopeStack = [];
17065
17066 function _newScope(type) {
17067 _current = {
17068 "(labels)": Object.create(null),
17069 "(usages)": Object.create(null),
17070 "(breakLabels)": Object.create(null),
17071 "(parent)": _current,
17072 "(type)": type,
17073 "(params)": (type === "functionparams" || type === "catchparams") ? [] : null
17074 };
17075 _scopeStack.push(_current);
17076 }
17077
17078 _newScope("global");
17079 _current["(predefined)"] = predefined;
17080
17081 var _currentFunctBody = _current; // this is the block after the params = function
17082
17083 var usedPredefinedAndGlobals = Object.create(null);
17084 var impliedGlobals = Object.create(null);
17085 var unuseds = [];
17086 var emitter = new events.EventEmitter();
17087
17088 function warning(code, token) {
17089 emitter.emit("warning", {
17090 code: code,
17091 token: token,
17092 data: _.slice(arguments, 2)
17093 });
17094 }
17095
17096 function error(code, token) {
17097 emitter.emit("warning", {
17098 code: code,
17099 token: token,
17100 data: _.slice(arguments, 2)
17101 });
17102 }
17103
17104 function _setupUsages(labelName) {
17105 if (!_current["(usages)"][labelName]) {
17106 _current["(usages)"][labelName] = {
17107 "(modified)": [],
17108 "(reassigned)": [],
17109 "(tokens)": []
17110 };
17111 }
17112 }
17113
17114 var _getUnusedOption = function(unused_opt) {
17115 if (unused_opt === undefined) {
17116 unused_opt = state.option.unused;
17117 }
17118
17119 if (unused_opt === true) {
17120 unused_opt = "last-param";
17121 }
17122
17123 return unused_opt;
17124 };
17125
17126 var _warnUnused = function(name, tkn, type, unused_opt) {
17127 var line = tkn.line;
17128 var chr = tkn.from;
17129 var raw_name = tkn.raw_text || name;
17130
17131 unused_opt = _getUnusedOption(unused_opt);
17132
17133 var warnable_types = {
17134 "vars": ["var"],
17135 "last-param": ["var", "param"],
17136 "strict": ["var", "param", "last-param"]
17137 };
17138
17139 if (unused_opt) {
17140 if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) {
17141 warning("W098", { line: line, from: chr }, raw_name);
17142 }
17143 }
17144
17145 // inconsistent - see gh-1894
17146 if (unused_opt || type === "var") {
17147 unuseds.push({
17148 name: name,
17149 line: line,
17150 character: chr
17151 });
17152 }
17153 };
17154
17155 /**
17156 * Checks the current scope for unused identifiers
17157 */
17158 function _checkForUnused() {
17159 // function params are handled specially
17160 // assume that parameters are the only thing declared in the param scope
17161 if (_current["(type)"] === "functionparams") {
17162 _checkParams();
17163 return;
17164 }
17165 var curentLabels = _current["(labels)"];
17166 for (var labelName in curentLabels) {
17167 if (curentLabels[labelName]) {
17168 if (curentLabels[labelName]["(type)"] !== "exception" &&
17169 curentLabels[labelName]["(unused)"]) {
17170 _warnUnused(labelName, curentLabels[labelName]["(token)"], "var");
17171 }
17172 }
17173 }
17174 }
17175
17176 /**
17177 * Checks the current scope for unused parameters
17178 * Must be called in a function parameter scope
17179 */
17180 function _checkParams() {
17181 var params = _current["(params)"];
17182
17183 if (!params) {
17184 return;
17185 }
17186
17187 var param = params.pop();
17188 var unused_opt;
17189
17190 while (param) {
17191 var label = _current["(labels)"][param];
17192
17193 unused_opt = _getUnusedOption(state.funct["(unusedOption)"]);
17194
17195 // 'undefined' is a special case for (function(window, undefined) { ... })();
17196 // patterns.
17197 if (param === "undefined")
17198 return;
17199
17200 if (label["(unused)"]) {
17201 _warnUnused(param, label["(token)"], "param", state.funct["(unusedOption)"]);
17202 } else if (unused_opt === "last-param") {
17203 return;
17204 }
17205
17206 param = params.pop();
17207 }
17208 }
17209
17210 /**
17211 * Finds the relevant label's scope, searching from nearest outwards
17212 * @returns {Object} the scope the label was found in
17213 */
17214 function _getLabel(labelName) {
17215 for (var i = _scopeStack.length - 1 ; i >= 0; --i) {
17216 var scopeLabels = _scopeStack[i]["(labels)"];
17217 if (scopeLabels[labelName]) {
17218 return scopeLabels;
17219 }
17220 }
17221 }
17222
17223 function usedSoFarInCurrentFunction(labelName) {
17224 // used so far in this whole function and any sub functions
17225 for (var i = _scopeStack.length - 1; i >= 0; i--) {
17226 var current = _scopeStack[i];
17227 if (current["(usages)"][labelName]) {
17228 return current["(usages)"][labelName];
17229 }
17230 if (current === _currentFunctBody) {
17231 break;
17232 }
17233 }
17234 return false;
17235 }
17236
17237 function _checkOuterShadow(labelName, token) {
17238
17239 // only check if shadow is outer
17240 if (state.option.shadow !== "outer") {
17241 return;
17242 }
17243
17244 var isGlobal = _currentFunctBody["(type)"] === "global",
17245 isNewFunction = _current["(type)"] === "functionparams";
17246
17247 var outsideCurrentFunction = !isGlobal;
17248 for (var i = 0; i < _scopeStack.length; i++) {
17249 var stackItem = _scopeStack[i];
17250
17251 if (!isNewFunction && _scopeStack[i + 1] === _currentFunctBody) {
17252 outsideCurrentFunction = false;
17253 }
17254 if (outsideCurrentFunction && stackItem["(labels)"][labelName]) {
17255 warning("W123", token, labelName);
17256 }
17257 if (stackItem["(breakLabels)"][labelName]) {
17258 warning("W123", token, labelName);
17259 }
17260 }
17261 }
17262
17263 function _latedefWarning(type, labelName, token) {
17264 if (state.option.latedef) {
17265 // if either latedef is strict and this is a function
17266 // or this is not a function
17267 if ((state.option.latedef === true && type === "function") ||
17268 type !== "function") {
17269 warning("W003", token, labelName);
17270 }
17271 }
17272 }
17273
17274 var scopeManagerInst = {
17275
17276 on: function(names, listener) {
17277 names.split(" ").forEach(function(name) {
17278 emitter.on(name, listener);
17279 });
17280 },
17281
17282 isPredefined: function(labelName) {
17283 return !this.has(labelName) && _.has(_scopeStack[0]["(predefined)"], labelName);
17284 },
17285
17286 /**
17287 * Tell the manager we are entering a new block of code
17288 * @param {string} [type] - The type of the block. Valid values are
17289 * "functionparams", "catchparams" and
17290 * "functionouter"
17291 */
17292 stack: function(type) {
17293 var previousScope = _current;
17294 _newScope(type);
17295
17296 if (!type && previousScope["(type)"] === "functionparams") {
17297
17298 _current["(isFuncBody)"] = true;
17299 _current["(context)"] = _currentFunctBody;
17300 _currentFunctBody = _current;
17301 }
17302 },
17303
17304 unstack: function() {
17305 // jshint proto: true
17306 var subScope = _scopeStack.length > 1 ? _scopeStack[_scopeStack.length - 2] : null;
17307 var isUnstackingFunctionBody = _current === _currentFunctBody,
17308 isUnstackingFunctionParams = _current["(type)"] === "functionparams",
17309 isUnstackingFunctionOuter = _current["(type)"] === "functionouter";
17310
17311 var i, j;
17312 var currentUsages = _current["(usages)"];
17313 var currentLabels = _current["(labels)"];
17314 var usedLabelNameList = Object.keys(currentUsages);
17315
17316 if (currentUsages.__proto__ && usedLabelNameList.indexOf("__proto__") === -1) {
17317 usedLabelNameList.push("__proto__");
17318 }
17319
17320 for (i = 0; i < usedLabelNameList.length; i++) {
17321 var usedLabelName = usedLabelNameList[i];
17322
17323 var usage = currentUsages[usedLabelName];
17324 var usedLabel = currentLabels[usedLabelName];
17325 if (usedLabel) {
17326 var usedLabelType = usedLabel["(type)"];
17327 var isImmutable = usedLabelType === "const" || usedLabelType === "import";
17328
17329 if (usedLabel["(useOutsideOfScope)"] && !state.option.funcscope) {
17330 var usedTokens = usage["(tokens)"];
17331 if (usedTokens) {
17332 for (j = 0; j < usedTokens.length; j++) {
17333 // Keep the consistency of https://github.com/jshint/jshint/issues/2409
17334 if (usedLabel["(function)"] === usedTokens[j]["(function)"]) {
17335 error("W038", usedTokens[j], usedLabelName);
17336 }
17337 }
17338 }
17339 }
17340
17341 // mark the label used
17342 _current["(labels)"][usedLabelName]["(unused)"] = false;
17343
17344 // check for modifying a const
17345 if (isImmutable && usage["(modified)"]) {
17346 for (j = 0; j < usage["(modified)"].length; j++) {
17347 error("E013", usage["(modified)"][j], usedLabelName);
17348 }
17349 }
17350
17351 // check for re-assigning a function declaration
17352 if ((usedLabelType === "function" || usedLabelType === "class") &&
17353 usage["(reassigned)"]) {
17354 for (j = 0; j < usage["(reassigned)"].length; j++) {
17355 if (!usage["(reassigned)"][j].ignoreW021) {
17356 warning("W021", usage["(reassigned)"][j], usedLabelName, usedLabelType);
17357 }
17358 }
17359 }
17360 continue;
17361 }
17362
17363 if (isUnstackingFunctionOuter) {
17364 state.funct["(isCapturing)"] = true;
17365 }
17366
17367 if (subScope) {
17368 // not exiting the global scope, so copy the usage down in case its an out of scope usage
17369 if (!subScope["(usages)"][usedLabelName]) {
17370 subScope["(usages)"][usedLabelName] = usage;
17371 if (isUnstackingFunctionBody) {
17372 subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"] = true;
17373 }
17374 } else {
17375 var subScopeUsage = subScope["(usages)"][usedLabelName];
17376 subScopeUsage["(modified)"] = subScopeUsage["(modified)"].concat(usage["(modified)"]);
17377 subScopeUsage["(tokens)"] = subScopeUsage["(tokens)"].concat(usage["(tokens)"]);
17378 subScopeUsage["(reassigned)"] =
17379 subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]);
17380 }
17381 } else {
17382 // this is exiting global scope, so we finalise everything here - we are at the end of the file
17383 if (typeof _current["(predefined)"][usedLabelName] === "boolean") {
17384
17385 // remove the declared token, so we know it is used
17386 delete declared[usedLabelName];
17387
17388 // note it as used so it can be reported
17389 usedPredefinedAndGlobals[usedLabelName] = marker;
17390
17391 // check for re-assigning a read-only (set to false) predefined
17392 if (_current["(predefined)"][usedLabelName] === false && usage["(reassigned)"]) {
17393 for (j = 0; j < usage["(reassigned)"].length; j++) {
17394 if (!usage["(reassigned)"][j].ignoreW020) {
17395 warning("W020", usage["(reassigned)"][j]);
17396 }
17397 }
17398 }
17399 }
17400 else {
17401 // label usage is not predefined and we have not found a declaration
17402 // so report as undeclared
17403 if (usage["(tokens)"]) {
17404 for (j = 0; j < usage["(tokens)"].length; j++) {
17405 var undefinedToken = usage["(tokens)"][j];
17406 // if its not a forgiven undefined (e.g. typof x)
17407 if (!undefinedToken.forgiveUndef) {
17408 // if undef is on and undef was on when the token was defined
17409 if (state.option.undef && !undefinedToken.ignoreUndef) {
17410 warning("W117", undefinedToken, usedLabelName);
17411 }
17412 if (impliedGlobals[usedLabelName]) {
17413 impliedGlobals[usedLabelName].line.push(undefinedToken.line);
17414 } else {
17415 impliedGlobals[usedLabelName] = {
17416 name: usedLabelName,
17417 line: [undefinedToken.line]
17418 };
17419 }
17420 }
17421 }
17422 }
17423 }
17424 }
17425 }
17426
17427 // if exiting the global scope, we can warn about declared globals that haven't been used yet
17428 if (!subScope) {
17429 Object.keys(declared)
17430 .forEach(function(labelNotUsed) {
17431 _warnUnused(labelNotUsed, declared[labelNotUsed], "var");
17432 });
17433 }
17434
17435 // If this is not a function boundary, transfer function-scoped labels to
17436 // the parent block (a rough simulation of variable hoisting). Previously
17437 // existing labels in the parent block should take precedence so that things and stuff.
17438 if (subScope && !isUnstackingFunctionBody &&
17439 !isUnstackingFunctionParams && !isUnstackingFunctionOuter) {
17440 var labelNames = Object.keys(currentLabels);
17441 for (i = 0; i < labelNames.length; i++) {
17442
17443 var defLabelName = labelNames[i];
17444 var defLabel = currentLabels[defLabelName];
17445
17446 if (!defLabel["(blockscoped)"] && defLabel["(type)"] !== "exception") {
17447 var shadowed = subScope["(labels)"][defLabelName];
17448
17449 // Do not overwrite a label if it exists in the parent scope
17450 // because it is shared by adjacent blocks. Copy the `unused`
17451 // property so that any references found within the current block
17452 // are counted toward that higher-level declaration.
17453 if (shadowed) {
17454 shadowed["(unused)"] &= defLabel["(unused)"];
17455
17456 // "Hoist" the variable to the parent block, decorating the label
17457 // so that future references, though technically valid, can be
17458 // reported as "out-of-scope" in the absence of the `funcscope`
17459 // option.
17460 } else {
17461 defLabel["(useOutsideOfScope)"] =
17462 // Do not warn about out-of-scope usages in the global scope
17463 _currentFunctBody["(type)"] !== "global" &&
17464 // When a higher scope contains a binding for the label, the
17465 // label is a re-declaration and should not prompt "used
17466 // out-of-scope" warnings.
17467 !this.funct.has(defLabelName, { excludeCurrent: true });
17468
17469 subScope["(labels)"][defLabelName] = defLabel;
17470 }
17471
17472 delete currentLabels[defLabelName];
17473 }
17474 }
17475 }
17476
17477 _checkForUnused();
17478
17479 _scopeStack.pop();
17480 if (isUnstackingFunctionBody) {
17481 _currentFunctBody = _scopeStack[_.findLastIndex(_scopeStack, function(scope) {
17482 // if function or if global (which is at the bottom so it will only return true if we call back)
17483 return scope["(isFuncBody)"] || scope["(type)"] === "global";
17484 })];
17485 }
17486
17487 _current = subScope;
17488 },
17489
17490 /**
17491 * Add a param to the current scope
17492 * @param {string} labelName
17493 * @param {Token} token
17494 * @param {string} [type="param"] param type
17495 */
17496 addParam: function(labelName, token, type) {
17497 type = type || "param";
17498
17499 if (type === "exception") {
17500 // if defined in the current function
17501 var previouslyDefinedLabelType = this.funct.labeltype(labelName);
17502 if (previouslyDefinedLabelType && previouslyDefinedLabelType !== "exception") {
17503 // and has not been used yet in the current function scope
17504 if (!state.option.node) {
17505 warning("W002", state.tokens.next, labelName);
17506 }
17507 }
17508 }
17509
17510 // The variable was declared in the current scope
17511 if (_.has(_current["(labels)"], labelName)) {
17512 _current["(labels)"][labelName].duplicated = true;
17513
17514 // The variable was declared in an outer scope
17515 } else {
17516 // if this scope has the variable defined, it's a re-definition error
17517 _checkOuterShadow(labelName, token, type);
17518
17519 _current["(labels)"][labelName] = {
17520 "(type)" : type,
17521 "(token)": token,
17522 "(unused)": true };
17523
17524 _current["(params)"].push(labelName);
17525 }
17526
17527 if (_.has(_current["(usages)"], labelName)) {
17528 var usage = _current["(usages)"][labelName];
17529 // if its in a sub function it is not necessarily an error, just latedef
17530 if (usage["(onlyUsedSubFunction)"]) {
17531 _latedefWarning(type, labelName, token);
17532 } else {
17533 // this is a clear illegal usage for block scoped variables
17534 warning("E056", token, labelName, type);
17535 }
17536 }
17537 },
17538
17539 validateParams: function() {
17540 // This method only concerns errors for function parameters
17541 if (_currentFunctBody["(type)"] === "global") {
17542 return;
17543 }
17544
17545 var isStrict = state.isStrict();
17546 var currentFunctParamScope = _currentFunctBody["(parent)"];
17547
17548 if (!currentFunctParamScope["(params)"]) {
17549 return;
17550 }
17551
17552 currentFunctParamScope["(params)"].forEach(function(labelName) {
17553 var label = currentFunctParamScope["(labels)"][labelName];
17554
17555 if (label && label.duplicated) {
17556 if (isStrict) {
17557 warning("E011", label["(token)"], labelName);
17558 } else if (state.option.shadow !== true) {
17559 warning("W004", label["(token)"], labelName);
17560 }
17561 }
17562 });
17563 },
17564
17565 getUsedOrDefinedGlobals: function() {
17566 // jshint proto: true
17567 var list = Object.keys(usedPredefinedAndGlobals);
17568
17569 // If `__proto__` is used as a global variable name, its entry in the
17570 // lookup table may not be enumerated by `Object.keys` (depending on the
17571 // environment).
17572 if (usedPredefinedAndGlobals.__proto__ === marker &&
17573 list.indexOf("__proto__") === -1) {
17574 list.push("__proto__");
17575 }
17576
17577 return list;
17578 },
17579
17580 /**
17581 * Gets an array of implied globals
17582 * @returns {Array.<{ name: string, line: Array.<number>}>}
17583 */
17584 getImpliedGlobals: function() {
17585 // jshint proto: true
17586 var values = _.values(impliedGlobals);
17587 var hasProto = false;
17588
17589 // If `__proto__` is an implied global variable, its entry in the lookup
17590 // table may not be enumerated by `_.values` (depending on the
17591 // environment).
17592 if (impliedGlobals.__proto__) {
17593 hasProto = values.some(function(value) {
17594 return value.name === "__proto__";
17595 });
17596
17597 if (!hasProto) {
17598 values.push(impliedGlobals.__proto__);
17599 }
17600 }
17601
17602 return values;
17603 },
17604
17605 /**
17606 * Returns a list of unused variables
17607 * @returns {Array}
17608 */
17609 getUnuseds: function() {
17610 return unuseds;
17611 },
17612
17613 has: function(labelName) {
17614 return Boolean(_getLabel(labelName));
17615 },
17616
17617 labeltype: function(labelName) {
17618 // returns a labels type or null if not present
17619 var scopeLabels = _getLabel(labelName);
17620 if (scopeLabels) {
17621 return scopeLabels[labelName]["(type)"];
17622 }
17623 return null;
17624 },
17625
17626 /**
17627 * for the exported options, indicating a variable is used outside the file
17628 */
17629 addExported: function(labelName) {
17630 var globalLabels = _scopeStack[0]["(labels)"];
17631 if (_.has(declared, labelName)) {
17632 // remove the declared token, so we know it is used
17633 delete declared[labelName];
17634 } else if (_.has(globalLabels, labelName)) {
17635 globalLabels[labelName]["(unused)"] = false;
17636 } else {
17637 for (var i = 1; i < _scopeStack.length; i++) {
17638 var scope = _scopeStack[i];
17639 // if `scope.(type)` is not defined, it is a block scope
17640 if (!scope["(type)"]) {
17641 if (_.has(scope["(labels)"], labelName) &&
17642 !scope["(labels)"][labelName]["(blockscoped)"]) {
17643 scope["(labels)"][labelName]["(unused)"] = false;
17644 return;
17645 }
17646 } else {
17647 break;
17648 }
17649 }
17650 exported[labelName] = true;
17651 }
17652 },
17653
17654 /**
17655 * Mark an indentifier as es6 module exported
17656 */
17657 setExported: function(labelName, token) {
17658 this.block.use(labelName, token);
17659 },
17660
17661 initialize: function(labelName) {
17662 if (_current["(labels)"][labelName]) {
17663 _current["(labels)"][labelName]["(initialized)"] = true;
17664 }
17665 },
17666
17667 /**
17668 * adds an indentifier to the relevant current scope and creates warnings/errors as necessary
17669 * @param {string} labelName
17670 * @param {Object} opts
17671 * @param {String} opts.type - the type of the label e.g. "param", "var", "let, "const", "import", "function"
17672 * @param {Token} opts.token - the token pointing at the declaration
17673 * @param {boolean} opts.initialized - whether the binding should be created in an "initialized" state.
17674 */
17675 addlabel: function(labelName, opts) {
17676
17677 var type = opts.type;
17678 var token = opts.token;
17679 var isblockscoped = type === "let" || type === "const" ||
17680 type === "class" || type === "import";
17681 var ishoisted = type === "function" || type === "import";
17682 var isexported = (isblockscoped ? _current : _currentFunctBody)["(type)"] === "global" &&
17683 _.has(exported, labelName);
17684
17685 // outer shadow check (inner is only on non-block scoped)
17686 _checkOuterShadow(labelName, token, type);
17687
17688 if (isblockscoped) {
17689
17690 var declaredInCurrentScope = _current["(labels)"][labelName];
17691 // for block scoped variables, params are seen in the current scope as the root function
17692 // scope, so check these too.
17693 if (!declaredInCurrentScope && _current === _currentFunctBody &&
17694 _current["(type)"] !== "global") {
17695 declaredInCurrentScope = !!_currentFunctBody["(parent)"]["(labels)"][labelName];
17696 }
17697
17698 // if its not already defined (which is an error, so ignore) and is used in TDZ
17699 if (!declaredInCurrentScope && _current["(usages)"][labelName]) {
17700 var usage = _current["(usages)"][labelName];
17701 // if its in a sub function it is not necessarily an error, just latedef
17702 if (usage["(onlyUsedSubFunction)"] || ishoisted) {
17703 _latedefWarning(type, labelName, token);
17704 } else if (!ishoisted) {
17705 // this is a clear illegal usage for block scoped variables
17706 warning("E056", token, labelName, type);
17707 }
17708 }
17709
17710 // if this scope has the variable defined, its a re-definition error
17711 if (declaredInCurrentScope) {
17712 warning("E011", token, labelName);
17713 }
17714 else if (state.option.shadow === "outer") {
17715
17716 // if shadow is outer, for block scope we want to detect any shadowing within this function
17717 if (scopeManagerInst.funct.has(labelName)) {
17718 warning("W004", token, labelName);
17719 }
17720 }
17721
17722 scopeManagerInst.block.add(
17723 labelName, type, token, !isexported, opts.initialized
17724 );
17725
17726 } else {
17727
17728 var declaredInCurrentFunctionScope = scopeManagerInst.funct.has(labelName);
17729
17730 // check for late definition, ignore if already declared
17731 if (!declaredInCurrentFunctionScope && usedSoFarInCurrentFunction(labelName)) {
17732 _latedefWarning(type, labelName, token);
17733 }
17734
17735 // defining with a var or a function when a block scope variable of the same name
17736 // is in scope is an error
17737 if (scopeManagerInst.funct.has(labelName, { onlyBlockscoped: true })) {
17738 warning("E011", token, labelName);
17739 } else if (state.option.shadow !== true) {
17740 // now since we didn't get any block scope variables, test for var/function
17741 // shadowing
17742 if (declaredInCurrentFunctionScope && labelName !== "__proto__") {
17743
17744 // see https://github.com/jshint/jshint/issues/2400
17745 if (_currentFunctBody["(type)"] !== "global") {
17746 warning("W004", token, labelName);
17747 }
17748 }
17749 }
17750
17751 scopeManagerInst.funct.add(labelName, type, token, !isexported);
17752
17753 if (_currentFunctBody["(type)"] === "global" && !state.impliedClosure()) {
17754 usedPredefinedAndGlobals[labelName] = marker;
17755 }
17756 }
17757 },
17758
17759 funct: {
17760 /**
17761 * Returns the label type given certain options
17762 * @param labelName
17763 * @param {Object=} options
17764 * @param {Boolean=} options.onlyBlockscoped - only include block scoped labels
17765 * @param {Boolean=} options.excludeParams - exclude the param scope
17766 * @param {Boolean=} options.excludeCurrent - exclude the current scope
17767 * @returns {String}
17768 */
17769 labeltype: function(labelName, options) {
17770 var onlyBlockscoped = options && options.onlyBlockscoped;
17771 var excludeParams = options && options.excludeParams;
17772 var currentScopeIndex = _scopeStack.length - (options && options.excludeCurrent ? 2 : 1);
17773 for (var i = currentScopeIndex; i >= 0; i--) {
17774 var current = _scopeStack[i];
17775 if (current["(labels)"][labelName] &&
17776 (!onlyBlockscoped || current["(labels)"][labelName]["(blockscoped)"])) {
17777 return current["(labels)"][labelName]["(type)"];
17778 }
17779 var scopeCheck = excludeParams ? _scopeStack[ i - 1 ] : current;
17780 if (scopeCheck && scopeCheck["(type)"] === "functionparams") {
17781 return null;
17782 }
17783 }
17784 return null;
17785 },
17786 /**
17787 * Returns if a break label exists in the function scope
17788 * @param {string} labelName
17789 * @returns {boolean}
17790 */
17791 hasBreakLabel: function(labelName) {
17792 for (var i = _scopeStack.length - 1; i >= 0; i--) {
17793 var current = _scopeStack[i];
17794
17795 if (current["(breakLabels)"][labelName]) {
17796 return true;
17797 }
17798 if (current["(type)"] === "functionparams") {
17799 return false;
17800 }
17801 }
17802 return false;
17803 },
17804 /**
17805 * Returns if the label is in the current function scope
17806 * See scopeManager.funct.labelType for options
17807 */
17808 has: function(labelName, options) {
17809 return Boolean(this.labeltype(labelName, options));
17810 },
17811
17812 /**
17813 * Adds a new function scoped variable
17814 * see block.add for block scoped
17815 */
17816 add: function(labelName, type, tok, unused) {
17817 _current["(labels)"][labelName] = {
17818 "(type)" : type,
17819 "(token)": tok,
17820 "(blockscoped)": false,
17821 "(function)": _currentFunctBody,
17822 "(unused)": unused };
17823 }
17824 },
17825
17826 block: {
17827
17828 /**
17829 * is the current block global?
17830 * @returns Boolean
17831 */
17832 isGlobal: function() {
17833 return _current["(type)"] === "global";
17834 },
17835
17836 use: function(labelName, token) {
17837
17838 // if resolves to current function params, then do not store usage just resolve
17839 // this is because function(a) { var a; a = a; } will resolve to the param, not
17840 // to the unset var
17841 // first check the param is used
17842 var paramScope = _currentFunctBody["(parent)"];
17843 if (paramScope && paramScope["(labels)"][labelName] &&
17844 paramScope["(labels)"][labelName]["(type)"] === "param") {
17845
17846 // then check its not declared by a block scope variable
17847 if (!scopeManagerInst.funct.has(labelName,
17848 { excludeParams: true, onlyBlockscoped: true })) {
17849 paramScope["(labels)"][labelName]["(unused)"] = false;
17850 }
17851 }
17852
17853 if (token && (state.ignored.W117 || state.option.undef === false)) {
17854 token.ignoreUndef = true;
17855 }
17856
17857 _setupUsages(labelName);
17858
17859 _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false;
17860
17861 if (token) {
17862 token["(function)"] = _currentFunctBody;
17863 _current["(usages)"][labelName]["(tokens)"].push(token);
17864 }
17865
17866 // blockscoped vars can't be used within their initializer (TDZ)
17867 var label = _current["(labels)"][labelName];
17868 if (label && label["(blockscoped)"] && !label["(initialized)"]) {
17869 error("E056", token, labelName, label["(type)"]);
17870 }
17871 },
17872
17873 reassign: function(labelName, token) {
17874 token.ignoreW020 = state.ignored.W020;
17875 token.ignoreW021 = state.ignored.W021;
17876
17877 this.modify(labelName, token);
17878
17879 _current["(usages)"][labelName]["(reassigned)"].push(token);
17880 },
17881
17882 modify: function(labelName, token) {
17883
17884 _setupUsages(labelName);
17885
17886 _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false;
17887 _current["(usages)"][labelName]["(modified)"].push(token);
17888 },
17889
17890 /**
17891 * Adds a new variable
17892 */
17893 add: function(labelName, type, tok, unused, initialized) {
17894 _current["(labels)"][labelName] = {
17895 "(type)" : type,
17896 "(token)": tok,
17897 "(initialized)": !!initialized,
17898 "(blockscoped)": true,
17899 "(unused)": unused };
17900 },
17901
17902 addBreakLabel: function(labelName, opts) {
17903 var token = opts.token;
17904 if (scopeManagerInst.funct.hasBreakLabel(labelName)) {
17905 warning("E011", token, labelName);
17906 }
17907 else if (state.option.shadow === "outer") {
17908 if (scopeManagerInst.funct.has(labelName)) {
17909 warning("W004", token, labelName);
17910 } else {
17911 _checkOuterShadow(labelName, token);
17912 }
17913 }
17914 _current["(breakLabels)"][labelName] = token;
17915 }
17916 }
17917 };
17918 return scopeManagerInst;
17919 };
17920
17921 module.exports = scopeManager;
17922
17923 },{"events":5,"lodash":12}],19:[function(require,module,exports){
17924 "use strict";
17925 var NameStack = require("./name-stack.js");
17926
17927 var state = {
17928 syntax: {},
17929
17930 /**
17931 * Determine if the code currently being linted is strict mode code.
17932 *
17933 * @returns {boolean}
17934 */
17935 isStrict: function() {
17936 return this.directive["use strict"] || this.inClassBody ||
17937 this.option.module || this.option.strict === "implied";
17938 },
17939
17940 /**
17941 * Determine if the current state warrants a warning for statements outside
17942 * of strict mode code.
17943 *
17944 * While emitting warnings based on function scope would be more intuitive
17945 * (and less noisy), JSHint observes statement-based semantics in order to
17946 * preserve legacy behavior.
17947 *
17948 * This method does not take the state of the parser into account, making no
17949 * distinction between global code and function code. Because the "missing
17950 * 'use strict'" warning is *also* reported at function boundaries, this
17951 * function interprets `strict` option values `true` and `undefined` as
17952 * equivalent.
17953 */
17954 stmtMissingStrict: function() {
17955 if (this.option.strict === "global") {
17956 return true;
17957 }
17958
17959 if (this.option.strict === false) {
17960 return false;
17961 }
17962
17963 if (this.option.globalstrict) {
17964 return true;
17965 }
17966
17967 return false;
17968 },
17969
17970 allowsGlobalUsd: function() {
17971 return this.option.strict === "global" || this.option.globalstrict ||
17972 this.option.module || this.impliedClosure();
17973 },
17974
17975 /**
17976 * Determine if the current configuration describes an environment that is
17977 * wrapped in an immediately-invoked function expression prior to evaluation.
17978 *
17979 * @returns {boolean}
17980 */
17981 impliedClosure: function() {
17982 return this.option.node || this.option.phantom || this.option.browserify;
17983 },
17984
17985 // Assumption: chronologically ES3 < ES5 < ES6 < Moz
17986
17987 inMoz: function() {
17988 return this.option.moz;
17989 },
17990
17991 /**
17992 * @param {boolean} strict - When `true`, only consider ES6 when in
17993 * "esversion: 6" code.
17994 */
17995 inES6: function(strict) {
17996 if (strict) {
17997 return this.esVersion === 6;
17998 }
17999 return this.option.moz || this.esVersion >= 6;
18000 },
18001
18002 /**
18003 * @param {boolean} strict - When `true`, return `true` only when
18004 * esVersion is exactly 5
18005 */
18006 inES5: function(strict) {
18007 if (strict) {
18008 return (!this.esVersion || this.esVersion === 5) && !this.option.moz;
18009 }
18010 return !this.esVersion || this.esVersion >= 5 || this.option.moz;
18011 },
18012
18013 /**
18014 * Determine the current version of the input language by inspecting the
18015 * value of all ECMAScript-version-related options. This logic is necessary
18016 * to ensure compatibility with deprecated options `es3`, `es5`, and
18017 * `esnext`, and it may be drastically simplified when those options are
18018 * removed.
18019 *
18020 * @returns {string|null} - the name of any incompatible option detected,
18021 * `null` otherwise
18022 */
18023 inferEsVersion: function() {
18024 var badOpt = null;
18025
18026 if (this.option.esversion) {
18027 if (this.option.es3) {
18028 badOpt = "es3";
18029 } else if (this.option.es5) {
18030 badOpt = "es5";
18031 } else if (this.option.esnext) {
18032 badOpt = "esnext";
18033 }
18034
18035 if (badOpt) {
18036 return badOpt;
18037 }
18038
18039 if (this.option.esversion === 2015) {
18040 this.esVersion = 6;
18041 } else {
18042 this.esVersion = this.option.esversion;
18043 }
18044 } else if (this.option.es3) {
18045 this.esVersion = 3;
18046 } else if (this.option.esnext) {
18047 this.esVersion = 6;
18048 }
18049
18050 return null;
18051 },
18052
18053 reset: function() {
18054 this.tokens = {
18055 prev: null,
18056 next: null,
18057 curr: null
18058 };
18059
18060 this.option = {};
18061 this.esVersion = 5;
18062 this.funct = null;
18063 this.ignored = {};
18064 this.directive = {};
18065 this.jsonMode = false;
18066 this.jsonWarnings = [];
18067 this.lines = [];
18068 this.tab = "";
18069 this.cache = {}; // Node.JS doesn't have Map. Sniff.
18070 this.ignoredLines = {};
18071 this.forinifcheckneeded = false;
18072 this.nameStack = new NameStack();
18073 this.inClassBody = false;
18074 }
18075 };
18076
18077 exports.state = state;
18078
18079 },{"./name-stack.js":15}],20:[function(require,module,exports){
18080 "use strict";
18081
18082 exports.register = function(linter) {
18083 // Check for properties named __proto__. This special property was
18084 // deprecated and then re-introduced for ES6.
18085
18086 linter.on("Identifier", function style_scanProto(data) {
18087 if (linter.getOption("proto")) {
18088 return;
18089 }
18090
18091 if (data.name === "__proto__") {
18092 linter.warn("W103", {
18093 line: data.line,
18094 char: data.char,
18095 data: [ data.name, "6" ]
18096 });
18097 }
18098 });
18099
18100 // Check for properties named __iterator__. This is a special property
18101 // available only in browsers with JavaScript 1.7 implementation, but
18102 // it is deprecated for ES6
18103
18104 linter.on("Identifier", function style_scanIterator(data) {
18105 if (linter.getOption("iterator")) {
18106 return;
18107 }
18108
18109 if (data.name === "__iterator__") {
18110 linter.warn("W103", {
18111 line: data.line,
18112 char: data.char,
18113 data: [ data.name ]
18114 });
18115 }
18116 });
18117
18118 // Check that all identifiers are using camelCase notation.
18119 // Exceptions: names like MY_VAR and _myVar.
18120
18121 linter.on("Identifier", function style_scanCamelCase(data) {
18122 if (!linter.getOption("camelcase")) {
18123 return;
18124 }
18125
18126 if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
18127 linter.warn("W106", {
18128 line: data.line,
18129 char: data.char,
18130 data: [ data.name ]
18131 });
18132 }
18133 });
18134
18135 // Enforce consistency in style of quoting.
18136
18137 linter.on("String", function style_scanQuotes(data) {
18138 var quotmark = linter.getOption("quotmark");
18139 var code;
18140
18141 if (!quotmark) {
18142 return;
18143 }
18144
18145 // If quotmark is set to 'single' warn about all double-quotes.
18146
18147 if (quotmark === "single" && data.quote !== "'") {
18148 code = "W109";
18149 }
18150
18151 // If quotmark is set to 'double' warn about all single-quotes.
18152
18153 if (quotmark === "double" && data.quote !== "\"") {
18154 code = "W108";
18155 }
18156
18157 // If quotmark is set to true, remember the first quotation style
18158 // and then warn about all others.
18159
18160 if (quotmark === true) {
18161 if (!linter.getCache("quotmark")) {
18162 linter.setCache("quotmark", data.quote);
18163 }
18164
18165 if (linter.getCache("quotmark") !== data.quote) {
18166 code = "W110";
18167 }
18168 }
18169
18170 if (code) {
18171 linter.warn(code, {
18172 line: data.line,
18173 char: data.char,
18174 });
18175 }
18176 });
18177
18178 linter.on("Number", function style_scanNumbers(data) {
18179 if (data.value.charAt(0) === ".") {
18180 // Warn about a leading decimal point.
18181 linter.warn("W008", {
18182 line: data.line,
18183 char: data.char,
18184 data: [ data.value ]
18185 });
18186 }
18187
18188 if (data.value.substr(data.value.length - 1) === ".") {
18189 // Warn about a trailing decimal point.
18190 linter.warn("W047", {
18191 line: data.line,
18192 char: data.char,
18193 data: [ data.value ]
18194 });
18195 }
18196
18197 if (/^00+/.test(data.value)) {
18198 // Multiple leading zeroes.
18199 linter.warn("W046", {
18200 line: data.line,
18201 char: data.char,
18202 data: [ data.value ]
18203 });
18204 }
18205 });
18206
18207 // Warn about script URLs.
18208
18209 linter.on("String", function style_scanJavaScriptURLs(data) {
18210 var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
18211
18212 if (linter.getOption("scripturl")) {
18213 return;
18214 }
18215
18216 if (re.test(data.value)) {
18217 linter.warn("W107", {
18218 line: data.line,
18219 char: data.char
18220 });
18221 }
18222 });
18223 };
18224
18225 },{}],21:[function(require,module,exports){
18226 // jshint -W001
18227
18228 "use strict";
18229
18230 // Identifiers provided by the ECMAScript standard.
18231
18232 exports.reservedVars = {
18233 arguments : false,
18234 NaN : false
18235 };
18236
18237 exports.ecmaIdentifiers = {
18238 3: {
18239 Array : false,
18240 Boolean : false,
18241 Date : false,
18242 decodeURI : false,
18243 decodeURIComponent : false,
18244 encodeURI : false,
18245 encodeURIComponent : false,
18246 Error : false,
18247 "eval" : false,
18248 EvalError : false,
18249 Function : false,
18250 hasOwnProperty : false,
18251 isFinite : false,
18252 isNaN : false,
18253 Math : false,
18254 Number : false,
18255 Object : false,
18256 parseInt : false,
18257 parseFloat : false,
18258 RangeError : false,
18259 ReferenceError : false,
18260 RegExp : false,
18261 String : false,
18262 SyntaxError : false,
18263 TypeError : false,
18264 URIError : false
18265 },
18266 5: {
18267 JSON : false
18268 },
18269 6: {
18270 ArrayBuffer : false,
18271 DataView : false,
18272 Float32Array : false,
18273 Float64Array : false,
18274 Int8Array : false,
18275 Int16Array : false,
18276 Int32Array : false,
18277 Map : false,
18278 Promise : false,
18279 Proxy : false,
18280 Reflect : false,
18281 Set : false,
18282 Symbol : false,
18283 Uint8Array : false,
18284 Uint16Array : false,
18285 Uint32Array : false,
18286 Uint8ClampledArray : false,
18287 WeakMap : false,
18288 WeakSet : false
18289 }
18290 };
18291
18292 // Global variables commonly provided by a web browser environment.
18293
18294 exports.browser = {
18295 Audio : false,
18296 Blob : false,
18297 addEventListener : false,
18298 applicationCache : false,
18299 atob : false,
18300 blur : false,
18301 btoa : false,
18302 cancelAnimationFrame : false,
18303 CanvasGradient : false,
18304 CanvasPattern : false,
18305 CanvasRenderingContext2D: false,
18306 CSS : false,
18307 clearInterval : false,
18308 clearTimeout : false,
18309 close : false,
18310 closed : false,
18311 Comment : false,
18312 CompositionEvent : false,
18313 CustomEvent : false,
18314 DOMParser : false,
18315 defaultStatus : false,
18316 Document : false,
18317 document : false,
18318 DocumentFragment : false,
18319 Element : false,
18320 ElementTimeControl : false,
18321 Event : false,
18322 event : false,
18323 fetch : false,
18324 File : false,
18325 FileList : false,
18326 FileReader : false,
18327 FormData : false,
18328 focus : false,
18329 frames : false,
18330 getComputedStyle : false,
18331 HTMLElement : false,
18332 HTMLAnchorElement : false,
18333 HTMLBaseElement : false,
18334 HTMLBlockquoteElement: false,
18335 HTMLBodyElement : false,
18336 HTMLBRElement : false,
18337 HTMLButtonElement : false,
18338 HTMLCanvasElement : false,
18339 HTMLCollection : false,
18340 HTMLDirectoryElement : false,
18341 HTMLDivElement : false,
18342 HTMLDListElement : false,
18343 HTMLFieldSetElement : false,
18344 HTMLFontElement : false,
18345 HTMLFormElement : false,
18346 HTMLFrameElement : false,
18347 HTMLFrameSetElement : false,
18348 HTMLHeadElement : false,
18349 HTMLHeadingElement : false,
18350 HTMLHRElement : false,
18351 HTMLHtmlElement : false,
18352 HTMLIFrameElement : false,
18353 HTMLImageElement : false,
18354 HTMLInputElement : false,
18355 HTMLIsIndexElement : false,
18356 HTMLLabelElement : false,
18357 HTMLLayerElement : false,
18358 HTMLLegendElement : false,
18359 HTMLLIElement : false,
18360 HTMLLinkElement : false,
18361 HTMLMapElement : false,
18362 HTMLMenuElement : false,
18363 HTMLMetaElement : false,
18364 HTMLModElement : false,
18365 HTMLObjectElement : false,
18366 HTMLOListElement : false,
18367 HTMLOptGroupElement : false,
18368 HTMLOptionElement : false,
18369 HTMLParagraphElement : false,
18370 HTMLParamElement : false,
18371 HTMLPreElement : false,
18372 HTMLQuoteElement : false,
18373 HTMLScriptElement : false,
18374 HTMLSelectElement : false,
18375 HTMLStyleElement : false,
18376 HTMLTableCaptionElement: false,
18377 HTMLTableCellElement : false,
18378 HTMLTableColElement : false,
18379 HTMLTableElement : false,
18380 HTMLTableRowElement : false,
18381 HTMLTableSectionElement: false,
18382 HTMLTemplateElement : false,
18383 HTMLTextAreaElement : false,
18384 HTMLTitleElement : false,
18385 HTMLUListElement : false,
18386 HTMLVideoElement : false,
18387 history : false,
18388 Image : false,
18389 Intl : false,
18390 length : false,
18391 localStorage : false,
18392 location : false,
18393 matchMedia : false,
18394 MediaRecorder : false,
18395 MessageChannel : false,
18396 MessageEvent : false,
18397 MessagePort : false,
18398 MouseEvent : false,
18399 moveBy : false,
18400 moveTo : false,
18401 MutationObserver : false,
18402 name : false,
18403 Node : false,
18404 NodeFilter : false,
18405 NodeList : false,
18406 Notification : false,
18407 navigator : false,
18408 onbeforeunload : true,
18409 onblur : true,
18410 onerror : true,
18411 onfocus : true,
18412 onload : true,
18413 onresize : true,
18414 onunload : true,
18415 open : false,
18416 openDatabase : false,
18417 opener : false,
18418 Option : false,
18419 parent : false,
18420 performance : false,
18421 print : false,
18422 Range : false,
18423 requestAnimationFrame : false,
18424 removeEventListener : false,
18425 resizeBy : false,
18426 resizeTo : false,
18427 screen : false,
18428 scroll : false,
18429 scrollBy : false,
18430 scrollTo : false,
18431 sessionStorage : false,
18432 setInterval : false,
18433 setTimeout : false,
18434 SharedWorker : false,
18435 status : false,
18436 Storage : false,
18437 SVGAElement : false,
18438 SVGAltGlyphDefElement: false,
18439 SVGAltGlyphElement : false,
18440 SVGAltGlyphItemElement: false,
18441 SVGAngle : false,
18442 SVGAnimateColorElement: false,
18443 SVGAnimateElement : false,
18444 SVGAnimateMotionElement: false,
18445 SVGAnimateTransformElement: false,
18446 SVGAnimatedAngle : false,
18447 SVGAnimatedBoolean : false,
18448 SVGAnimatedEnumeration: false,
18449 SVGAnimatedInteger : false,
18450 SVGAnimatedLength : false,
18451 SVGAnimatedLengthList: false,
18452 SVGAnimatedNumber : false,
18453 SVGAnimatedNumberList: false,
18454 SVGAnimatedPathData : false,
18455 SVGAnimatedPoints : false,
18456 SVGAnimatedPreserveAspectRatio: false,
18457 SVGAnimatedRect : false,
18458 SVGAnimatedString : false,
18459 SVGAnimatedTransformList: false,
18460 SVGAnimationElement : false,
18461 SVGCSSRule : false,
18462 SVGCircleElement : false,
18463 SVGClipPathElement : false,
18464 SVGColor : false,
18465 SVGColorProfileElement: false,
18466 SVGColorProfileRule : false,
18467 SVGComponentTransferFunctionElement: false,
18468 SVGCursorElement : false,
18469 SVGDefsElement : false,
18470 SVGDescElement : false,
18471 SVGDocument : false,
18472 SVGElement : false,
18473 SVGElementInstance : false,
18474 SVGElementInstanceList: false,
18475 SVGEllipseElement : false,
18476 SVGExternalResourcesRequired: false,
18477 SVGFEBlendElement : false,
18478 SVGFEColorMatrixElement: false,
18479 SVGFEComponentTransferElement: false,
18480 SVGFECompositeElement: false,
18481 SVGFEConvolveMatrixElement: false,
18482 SVGFEDiffuseLightingElement: false,
18483 SVGFEDisplacementMapElement: false,
18484 SVGFEDistantLightElement: false,
18485 SVGFEFloodElement : false,
18486 SVGFEFuncAElement : false,
18487 SVGFEFuncBElement : false,
18488 SVGFEFuncGElement : false,
18489 SVGFEFuncRElement : false,
18490 SVGFEGaussianBlurElement: false,
18491 SVGFEImageElement : false,
18492 SVGFEMergeElement : false,
18493 SVGFEMergeNodeElement: false,
18494 SVGFEMorphologyElement: false,
18495 SVGFEOffsetElement : false,
18496 SVGFEPointLightElement: false,
18497 SVGFESpecularLightingElement: false,
18498 SVGFESpotLightElement: false,
18499 SVGFETileElement : false,
18500 SVGFETurbulenceElement: false,
18501 SVGFilterElement : false,
18502 SVGFilterPrimitiveStandardAttributes: false,
18503 SVGFitToViewBox : false,
18504 SVGFontElement : false,
18505 SVGFontFaceElement : false,
18506 SVGFontFaceFormatElement: false,
18507 SVGFontFaceNameElement: false,
18508 SVGFontFaceSrcElement: false,
18509 SVGFontFaceUriElement: false,
18510 SVGForeignObjectElement: false,
18511 SVGGElement : false,
18512 SVGGlyphElement : false,
18513 SVGGlyphRefElement : false,
18514 SVGGradientElement : false,
18515 SVGHKernElement : false,
18516 SVGICCColor : false,
18517 SVGImageElement : false,
18518 SVGLangSpace : false,
18519 SVGLength : false,
18520 SVGLengthList : false,
18521 SVGLineElement : false,
18522 SVGLinearGradientElement: false,
18523 SVGLocatable : false,
18524 SVGMPathElement : false,
18525 SVGMarkerElement : false,
18526 SVGMaskElement : false,
18527 SVGMatrix : false,
18528 SVGMetadataElement : false,
18529 SVGMissingGlyphElement: false,
18530 SVGNumber : false,
18531 SVGNumberList : false,
18532 SVGPaint : false,
18533 SVGPathElement : false,
18534 SVGPathSeg : false,
18535 SVGPathSegArcAbs : false,
18536 SVGPathSegArcRel : false,
18537 SVGPathSegClosePath : false,
18538 SVGPathSegCurvetoCubicAbs: false,
18539 SVGPathSegCurvetoCubicRel: false,
18540 SVGPathSegCurvetoCubicSmoothAbs: false,
18541 SVGPathSegCurvetoCubicSmoothRel: false,
18542 SVGPathSegCurvetoQuadraticAbs: false,
18543 SVGPathSegCurvetoQuadraticRel: false,
18544 SVGPathSegCurvetoQuadraticSmoothAbs: false,
18545 SVGPathSegCurvetoQuadraticSmoothRel: false,
18546 SVGPathSegLinetoAbs : false,
18547 SVGPathSegLinetoHorizontalAbs: false,
18548 SVGPathSegLinetoHorizontalRel: false,
18549 SVGPathSegLinetoRel : false,
18550 SVGPathSegLinetoVerticalAbs: false,
18551 SVGPathSegLinetoVerticalRel: false,
18552 SVGPathSegList : false,
18553 SVGPathSegMovetoAbs : false,
18554 SVGPathSegMovetoRel : false,
18555 SVGPatternElement : false,
18556 SVGPoint : false,
18557 SVGPointList : false,
18558 SVGPolygonElement : false,
18559 SVGPolylineElement : false,
18560 SVGPreserveAspectRatio: false,
18561 SVGRadialGradientElement: false,
18562 SVGRect : false,
18563 SVGRectElement : false,
18564 SVGRenderingIntent : false,
18565 SVGSVGElement : false,
18566 SVGScriptElement : false,
18567 SVGSetElement : false,
18568 SVGStopElement : false,
18569 SVGStringList : false,
18570 SVGStylable : false,
18571 SVGStyleElement : false,
18572 SVGSwitchElement : false,
18573 SVGSymbolElement : false,
18574 SVGTRefElement : false,
18575 SVGTSpanElement : false,
18576 SVGTests : false,
18577 SVGTextContentElement: false,
18578 SVGTextElement : false,
18579 SVGTextPathElement : false,
18580 SVGTextPositioningElement: false,
18581 SVGTitleElement : false,
18582 SVGTransform : false,
18583 SVGTransformList : false,
18584 SVGTransformable : false,
18585 SVGURIReference : false,
18586 SVGUnitTypes : false,
18587 SVGUseElement : false,
18588 SVGVKernElement : false,
18589 SVGViewElement : false,
18590 SVGViewSpec : false,
18591 SVGZoomAndPan : false,
18592 Text : false,
18593 TextDecoder : false,
18594 TextEncoder : false,
18595 TimeEvent : false,
18596 top : false,
18597 URL : false,
18598 WebGLActiveInfo : false,
18599 WebGLBuffer : false,
18600 WebGLContextEvent : false,
18601 WebGLFramebuffer : false,
18602 WebGLProgram : false,
18603 WebGLRenderbuffer : false,
18604 WebGLRenderingContext: false,
18605 WebGLShader : false,
18606 WebGLShaderPrecisionFormat: false,
18607 WebGLTexture : false,
18608 WebGLUniformLocation : false,
18609 WebSocket : false,
18610 window : false,
18611 Window : false,
18612 Worker : false,
18613 XDomainRequest : false,
18614 XMLHttpRequest : false,
18615 XMLSerializer : false,
18616 XPathEvaluator : false,
18617 XPathException : false,
18618 XPathExpression : false,
18619 XPathNamespace : false,
18620 XPathNSResolver : false,
18621 XPathResult : false
18622 };
18623
18624 exports.devel = {
18625 alert : false,
18626 confirm: false,
18627 console: false,
18628 Debug : false,
18629 opera : false,
18630 prompt : false
18631 };
18632
18633 exports.worker = {
18634 importScripts : true,
18635 onmessage : true,
18636 postMessage : true,
18637 self : true,
18638 FileReaderSync : true
18639 };
18640
18641 // Widely adopted global names that are not part of ECMAScript standard
18642 exports.nonstandard = {
18643 escape : false,
18644 unescape: false
18645 };
18646
18647 // Globals provided by popular JavaScript environments.
18648
18649 exports.couch = {
18650 "require" : false,
18651 respond : false,
18652 getRow : false,
18653 emit : false,
18654 send : false,
18655 start : false,
18656 sum : false,
18657 log : false,
18658 exports : false,
18659 module : false,
18660 provides : false
18661 };
18662
18663 exports.node = {
18664 __filename : false,
18665 __dirname : false,
18666 GLOBAL : false,
18667 global : false,
18668 module : false,
18669 require : false,
18670
18671 // These globals are writeable because Node allows the following
18672 // usage pattern: var Buffer = require("buffer").Buffer;
18673
18674 Buffer : true,
18675 console : true,
18676 exports : true,
18677 process : true,
18678 setTimeout : true,
18679 clearTimeout : true,
18680 setInterval : true,
18681 clearInterval : true,
18682 setImmediate : true, // v0.9.1+
18683 clearImmediate: true // v0.9.1+
18684 };
18685
18686 exports.browserify = {
18687 __filename : false,
18688 __dirname : false,
18689 global : false,
18690 module : false,
18691 require : false,
18692 Buffer : true,
18693 exports : true,
18694 process : true
18695 };
18696
18697 exports.phantom = {
18698 phantom : true,
18699 require : true,
18700 WebPage : true,
18701 console : true, // in examples, but undocumented
18702 exports : true // v1.7+
18703 };
18704
18705 exports.qunit = {
18706 asyncTest : false,
18707 deepEqual : false,
18708 equal : false,
18709 expect : false,
18710 module : false,
18711 notDeepEqual : false,
18712 notEqual : false,
18713 notOk : false,
18714 notPropEqual : false,
18715 notStrictEqual : false,
18716 ok : false,
18717 propEqual : false,
18718 QUnit : false,
18719 raises : false,
18720 start : false,
18721 stop : false,
18722 strictEqual : false,
18723 test : false,
18724 "throws" : false
18725 };
18726
18727 exports.rhino = {
18728 defineClass : false,
18729 deserialize : false,
18730 gc : false,
18731 help : false,
18732 importClass : false,
18733 importPackage: false,
18734 "java" : false,
18735 load : false,
18736 loadClass : false,
18737 Packages : false,
18738 print : false,
18739 quit : false,
18740 readFile : false,
18741 readUrl : false,
18742 runCommand : false,
18743 seal : false,
18744 serialize : false,
18745 spawn : false,
18746 sync : false,
18747 toint32 : false,
18748 version : false
18749 };
18750
18751 exports.shelljs = {
18752 target : false,
18753 echo : false,
18754 exit : false,
18755 cd : false,
18756 pwd : false,
18757 ls : false,
18758 find : false,
18759 cp : false,
18760 rm : false,
18761 mv : false,
18762 mkdir : false,
18763 test : false,
18764 cat : false,
18765 sed : false,
18766 grep : false,
18767 which : false,
18768 dirs : false,
18769 pushd : false,
18770 popd : false,
18771 env : false,
18772 exec : false,
18773 chmod : false,
18774 config : false,
18775 error : false,
18776 tempdir : false
18777 };
18778
18779 exports.typed = {
18780 ArrayBuffer : false,
18781 ArrayBufferView : false,
18782 DataView : false,
18783 Float32Array : false,
18784 Float64Array : false,
18785 Int16Array : false,
18786 Int32Array : false,
18787 Int8Array : false,
18788 Uint16Array : false,
18789 Uint32Array : false,
18790 Uint8Array : false,
18791 Uint8ClampedArray : false
18792 };
18793
18794 exports.wsh = {
18795 ActiveXObject : true,
18796 Enumerator : true,
18797 GetObject : true,
18798 ScriptEngine : true,
18799 ScriptEngineBuildVersion : true,
18800 ScriptEngineMajorVersion : true,
18801 ScriptEngineMinorVersion : true,
18802 VBArray : true,
18803 WSH : true,
18804 WScript : true,
18805 XDomainRequest : true
18806 };
18807
18808 // Globals provided by popular JavaScript libraries.
18809
18810 exports.dojo = {
18811 dojo : false,
18812 dijit : false,
18813 dojox : false,
18814 define : false,
18815 "require": false
18816 };
18817
18818 exports.jquery = {
18819 "$" : false,
18820 jQuery : false
18821 };
18822
18823 exports.mootools = {
18824 "$" : false,
18825 "$$" : false,
18826 Asset : false,
18827 Browser : false,
18828 Chain : false,
18829 Class : false,
18830 Color : false,
18831 Cookie : false,
18832 Core : false,
18833 Document : false,
18834 DomReady : false,
18835 DOMEvent : false,
18836 DOMReady : false,
18837 Drag : false,
18838 Element : false,
18839 Elements : false,
18840 Event : false,
18841 Events : false,
18842 Fx : false,
18843 Group : false,
18844 Hash : false,
18845 HtmlTable : false,
18846 IFrame : false,
18847 IframeShim : false,
18848 InputValidator: false,
18849 instanceOf : false,
18850 Keyboard : false,
18851 Locale : false,
18852 Mask : false,
18853 MooTools : false,
18854 Native : false,
18855 Options : false,
18856 OverText : false,
18857 Request : false,
18858 Scroller : false,
18859 Slick : false,
18860 Slider : false,
18861 Sortables : false,
18862 Spinner : false,
18863 Swiff : false,
18864 Tips : false,
18865 Type : false,
18866 typeOf : false,
18867 URI : false,
18868 Window : false
18869 };
18870
18871 exports.prototypejs = {
18872 "$" : false,
18873 "$$" : false,
18874 "$A" : false,
18875 "$F" : false,
18876 "$H" : false,
18877 "$R" : false,
18878 "$break" : false,
18879 "$continue" : false,
18880 "$w" : false,
18881 Abstract : false,
18882 Ajax : false,
18883 Class : false,
18884 Enumerable : false,
18885 Element : false,
18886 Event : false,
18887 Field : false,
18888 Form : false,
18889 Hash : false,
18890 Insertion : false,
18891 ObjectRange : false,
18892 PeriodicalExecuter: false,
18893 Position : false,
18894 Prototype : false,
18895 Selector : false,
18896 Template : false,
18897 Toggle : false,
18898 Try : false,
18899 Autocompleter : false,
18900 Builder : false,
18901 Control : false,
18902 Draggable : false,
18903 Draggables : false,
18904 Droppables : false,
18905 Effect : false,
18906 Sortable : false,
18907 SortableObserver : false,
18908 Sound : false,
18909 Scriptaculous : false
18910 };
18911
18912 exports.yui = {
18913 YUI : false,
18914 Y : false,
18915 YUI_config: false
18916 };
18917
18918 exports.mocha = {
18919 // Global (for config etc.)
18920 mocha : false,
18921 // BDD
18922 describe : false,
18923 xdescribe : false,
18924 it : false,
18925 xit : false,
18926 context : false,
18927 xcontext : false,
18928 before : false,
18929 after : false,
18930 beforeEach : false,
18931 afterEach : false,
18932 // TDD
18933 suite : false,
18934 test : false,
18935 setup : false,
18936 teardown : false,
18937 suiteSetup : false,
18938 suiteTeardown : false
18939 };
18940
18941 exports.jasmine = {
18942 jasmine : false,
18943 describe : false,
18944 xdescribe : false,
18945 it : false,
18946 xit : false,
18947 beforeEach : false,
18948 afterEach : false,
18949 setFixtures : false,
18950 loadFixtures: false,
18951 spyOn : false,
18952 expect : false,
18953 // Jasmine 1.3
18954 runs : false,
18955 waitsFor : false,
18956 waits : false,
18957 // Jasmine 2.1
18958 beforeAll : false,
18959 afterAll : false,
18960 fail : false,
18961 fdescribe : false,
18962 fit : false,
18963 pending : false
18964 };
18965
18966 },{}],"jshint":[function(require,module,exports){
18967 /*!
18968 * JSHint, by JSHint Community.
18969 *
18970 * This file (and this file only) is licensed under the same slightly modified
18971 * MIT license that JSLint is. It stops evil-doers everywhere:
18972 *
18973 * Copyright (c) 2002 Douglas Crockford (www.JSLint.com)
18974 *
18975 * Permission is hereby granted, free of charge, to any person obtaining
18976 * a copy of this software and associated documentation files (the "Software"),
18977 * to deal in the Software without restriction, including without limitation
18978 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
18979 * and/or sell copies of the Software, and to permit persons to whom
18980 * the Software is furnished to do so, subject to the following conditions:
18981 *
18982 * The above copyright notice and this permission notice shall be included
18983 * in all copies or substantial portions of the Software.
18984 *
18985 * The Software shall be used for Good, not Evil.
18986 *
18987 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18988 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18989 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18990 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18991 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18992 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18993 * DEALINGS IN THE SOFTWARE.
18994 *
18995 */
18996
18997 /*jshint quotmark:double */
18998 /*exported console */
18999
19000 var _ = require("lodash");
19001 var events = require("events");
19002 var vars = require("./vars.js");
19003 var messages = require("./messages.js");
19004 var Lexer = require("./lex.js").Lexer;
19005 var reg = require("./reg.js");
19006 var state = require("./state.js").state;
19007 var style = require("./style.js");
19008 var options = require("./options.js");
19009 var scopeManager = require("./scope-manager.js");
19010
19011 // We need this module here because environments such as IE and Rhino
19012 // don't necessarilly expose the 'console' API and browserify uses
19013 // it to log things. It's a sad state of affair, really.
19014 var console = require("console-browserify");
19015
19016 // We build the application inside a function so that we produce only a singleton
19017 // variable. That function will be invoked immediately, and its return value is
19018 // the JSHINT function itself.
19019
19020 var JSHINT = (function() {
19021 "use strict";
19022
19023 var api, // Extension API
19024
19025 // These are operators that should not be used with the ! operator.
19026 bang = {
19027 "<" : true,
19028 "<=" : true,
19029 "==" : true,
19030 "===": true,
19031 "!==": true,
19032 "!=" : true,
19033 ">" : true,
19034 ">=" : true,
19035 "+" : true,
19036 "-" : true,
19037 "*" : true,
19038 "/" : true,
19039 "%" : true
19040 },
19041
19042 declared, // Globals that were declared using /*global ... */ syntax.
19043
19044 functionicity = [
19045 "closure", "exception", "global", "label",
19046 "outer", "unused", "var"
19047 ],
19048
19049 functions, // All of the functions
19050
19051 inblock,
19052 indent,
19053 lookahead,
19054 lex,
19055 member,
19056 membersOnly,
19057 predefined, // Global variables defined by option
19058
19059 stack,
19060 urls,
19061
19062 extraModules = [],
19063 emitter = new events.EventEmitter();
19064
19065 function checkOption(name, t) {
19066 name = name.trim();
19067
19068 if (/^[+-]W\d{3}$/g.test(name)) {
19069 return true;
19070 }
19071
19072 if (options.validNames.indexOf(name) === -1) {
19073 if (t.type !== "jslint" && !_.has(options.removed, name)) {
19074 error("E001", t, name);
19075 return false;
19076 }
19077 }
19078
19079 return true;
19080 }
19081
19082 function isString(obj) {
19083 return Object.prototype.toString.call(obj) === "[object String]";
19084 }
19085
19086 function isIdentifier(tkn, value) {
19087 if (!tkn)
19088 return false;
19089
19090 if (!tkn.identifier || tkn.value !== value)
19091 return false;
19092
19093 return true;
19094 }
19095
19096 function isReserved(token) {
19097 if (!token.reserved) {
19098 return false;
19099 }
19100 var meta = token.meta;
19101
19102 if (meta && meta.isFutureReservedWord) {
19103 if (meta.moduleOnly && !state.option.module) {
19104 return false;
19105 }
19106
19107 if (state.inES5()) {
19108 // ES3 FutureReservedWord in an ES5 environment.
19109 if (!meta.es5) {
19110 return false;
19111 }
19112
19113 // Some ES5 FutureReservedWord identifiers are active only
19114 // within a strict mode environment.
19115 if (meta.strictOnly) {
19116 if (!state.option.strict && !state.isStrict()) {
19117 return false;
19118 }
19119 }
19120
19121 if (token.isProperty) {
19122 return false;
19123 }
19124 }
19125 }
19126
19127 return true;
19128 }
19129
19130 function supplant(str, data) {
19131 return str.replace(/\{([^{}]*)\}/g, function(a, b) {
19132 var r = data[b];
19133 return typeof r === "string" || typeof r === "number" ? r : a;
19134 });
19135 }
19136
19137 function combine(dest, src) {
19138 Object.keys(src).forEach(function(name) {
19139 if (_.has(JSHINT.blacklist, name)) return;
19140 dest[name] = src[name];
19141 });
19142 }
19143
19144 function processenforceall() {
19145 if (state.option.enforceall) {
19146 for (var enforceopt in options.bool.enforcing) {
19147 if (state.option[enforceopt] === undefined &&
19148 !options.noenforceall[enforceopt]) {
19149 state.option[enforceopt] = true;
19150 }
19151 }
19152 for (var relaxopt in options.bool.relaxing) {
19153 if (state.option[relaxopt] === undefined) {
19154 state.option[relaxopt] = false;
19155 }
19156 }
19157 }
19158 }
19159
19160 /**
19161 * Apply all linting options according to the status of the `state` object.
19162 */
19163 function applyOptions() {
19164 var badESOpt = null;
19165 processenforceall();
19166
19167 /**
19168 * TODO: Remove in JSHint 3
19169 */
19170 badESOpt = state.inferEsVersion();
19171 if (badESOpt) {
19172 quit("E059", state.tokens.next, "esversion", badESOpt);
19173 }
19174
19175 if (state.inES5()) {
19176 combine(predefined, vars.ecmaIdentifiers[5]);
19177 }
19178
19179 if (state.inES6()) {
19180 combine(predefined, vars.ecmaIdentifiers[6]);
19181 }
19182
19183 /**
19184 * Use `in` to check for the presence of any explicitly-specified value for
19185 * `globalstrict` because both `true` and `false` should trigger an error.
19186 */
19187 if (state.option.strict === "global" && "globalstrict" in state.option) {
19188 quit("E059", state.tokens.next, "strict", "globalstrict");
19189 }
19190
19191 if (state.option.module) {
19192 /**
19193 * TODO: Extend this restriction to *all* ES6-specific options.
19194 */
19195 if (!state.inES6()) {
19196 warning("W134", state.tokens.next, "module", 6);
19197 }
19198 }
19199
19200 if (state.option.couch) {
19201 combine(predefined, vars.couch);
19202 }
19203
19204 if (state.option.qunit) {
19205 combine(predefined, vars.qunit);
19206 }
19207
19208 if (state.option.rhino) {
19209 combine(predefined, vars.rhino);
19210 }
19211
19212 if (state.option.shelljs) {
19213 combine(predefined, vars.shelljs);
19214 combine(predefined, vars.node);
19215 }
19216 if (state.option.typed) {
19217 combine(predefined, vars.typed);
19218 }
19219
19220 if (state.option.phantom) {
19221 combine(predefined, vars.phantom);
19222 }
19223
19224 if (state.option.prototypejs) {
19225 combine(predefined, vars.prototypejs);
19226 }
19227
19228 if (state.option.node) {
19229 combine(predefined, vars.node);
19230 combine(predefined, vars.typed);
19231 }
19232
19233 if (state.option.devel) {
19234 combine(predefined, vars.devel);
19235 }
19236
19237 if (state.option.dojo) {
19238 combine(predefined, vars.dojo);
19239 }
19240
19241 if (state.option.browser) {
19242 combine(predefined, vars.browser);
19243 combine(predefined, vars.typed);
19244 }
19245
19246 if (state.option.browserify) {
19247 combine(predefined, vars.browser);
19248 combine(predefined, vars.typed);
19249 combine(predefined, vars.browserify);
19250 }
19251
19252 if (state.option.nonstandard) {
19253 combine(predefined, vars.nonstandard);
19254 }
19255
19256 if (state.option.jasmine) {
19257 combine(predefined, vars.jasmine);
19258 }
19259
19260 if (state.option.jquery) {
19261 combine(predefined, vars.jquery);
19262 }
19263
19264 if (state.option.mootools) {
19265 combine(predefined, vars.mootools);
19266 }
19267
19268 if (state.option.worker) {
19269 combine(predefined, vars.worker);
19270 }
19271
19272 if (state.option.wsh) {
19273 combine(predefined, vars.wsh);
19274 }
19275
19276 if (state.option.yui) {
19277 combine(predefined, vars.yui);
19278 }
19279
19280 if (state.option.mocha) {
19281 combine(predefined, vars.mocha);
19282 }
19283 }
19284
19285 // Produce an error warning.
19286 function quit(code, token, a, b) {
19287 var percentage = Math.floor((token.line / state.lines.length) * 100);
19288 var message = messages.errors[code].desc;
19289
19290 var exception = {
19291 name: "JSHintError",
19292 line: token.line,
19293 character: token.from,
19294 message: message + " (" + percentage + "% scanned).",
19295 raw: message,
19296 code: code,
19297 a: a,
19298 b: b
19299 };
19300
19301 exception.reason = supplant(message, exception) + " (" + percentage +
19302 "% scanned).";
19303
19304 throw exception;
19305 }
19306
19307 function removeIgnoredMessages() {
19308 var ignored = state.ignoredLines;
19309
19310 if (_.isEmpty(ignored)) return;
19311 JSHINT.errors = _.reject(JSHINT.errors, function(err) { return ignored[err.line] });
19312 }
19313
19314 function warning(code, t, a, b, c, d) {
19315 var ch, l, w, msg;
19316
19317 if (/^W\d{3}$/.test(code)) {
19318 if (state.ignored[code])
19319 return;
19320
19321 msg = messages.warnings[code];
19322 } else if (/E\d{3}/.test(code)) {
19323 msg = messages.errors[code];
19324 } else if (/I\d{3}/.test(code)) {
19325 msg = messages.info[code];
19326 }
19327
19328 t = t || state.tokens.next || {};
19329 if (t.id === "(end)") { // `~
19330 t = state.tokens.curr;
19331 }
19332
19333 l = t.line;
19334 ch = t.from;
19335
19336 w = {
19337 id: "(error)",
19338 raw: msg.desc,
19339 code: msg.code,
19340 evidence: state.lines[l - 1] || "",
19341 line: l,
19342 character: ch,
19343 scope: JSHINT.scope,
19344 a: a,
19345 b: b,
19346 c: c,
19347 d: d
19348 };
19349
19350 w.reason = supplant(msg.desc, w);
19351 JSHINT.errors.push(w);
19352
19353 removeIgnoredMessages();
19354
19355 if (JSHINT.errors.length >= state.option.maxerr)
19356 quit("E043", t);
19357
19358 return w;
19359 }
19360
19361 function warningAt(m, l, ch, a, b, c, d) {
19362 return warning(m, {
19363 line: l,
19364 from: ch
19365 }, a, b, c, d);
19366 }
19367
19368 function error(m, t, a, b, c, d) {
19369 warning(m, t, a, b, c, d);
19370 }
19371
19372 function errorAt(m, l, ch, a, b, c, d) {
19373 return error(m, {
19374 line: l,
19375 from: ch
19376 }, a, b, c, d);
19377 }
19378
19379 // Tracking of "internal" scripts, like eval containing a static string
19380 function addEvalCode(elem, token) {
19381 JSHINT.internals.push({
19382 id: "(internal)",
19383 elem: elem,
19384 token: token,
19385 code: token.value.replace(/([^\\])(\\*)\2\\n/g, "$1\n")
19386 });
19387 }
19388
19389 /**
19390 * Process an inline linting directive
19391 *
19392 * @param {Token} directiveToken - the directive-bearing comment token
19393 * @param {Token} previous - the token that preceeds the directive
19394 */
19395 function lintingDirective(directiveToken, previous) {
19396 var body = directiveToken.body.split(",")
19397 .map(function(s) { return s.trim(); });
19398 var predef = {};
19399
19400 if (directiveToken.type === "falls through") {
19401 previous.caseFallsThrough = true;
19402 return;
19403 }
19404
19405 if (directiveToken.type === "globals") {
19406 body.forEach(function(g, idx) {
19407 g = g.split(":");
19408 var key = (g[0] || "").trim();
19409 var val = (g[1] || "").trim();
19410
19411 if (key === "-" || !key.length) {
19412 // Ignore trailing comma
19413 if (idx > 0 && idx === body.length - 1) {
19414 return;
19415 }
19416 error("E002", directiveToken);
19417 return;
19418 }
19419
19420 if (key.charAt(0) === "-") {
19421 key = key.slice(1);
19422 val = false;
19423
19424 JSHINT.blacklist[key] = key;
19425 delete predefined[key];
19426 } else {
19427 predef[key] = (val === "true");
19428 }
19429 });
19430
19431 combine(predefined, predef);
19432
19433 for (var key in predef) {
19434 if (_.has(predef, key)) {
19435 declared[key] = directiveToken;
19436 }
19437 }
19438 }
19439
19440 if (directiveToken.type === "exported") {
19441 body.forEach(function(e, idx) {
19442 if (!e.length) {
19443 // Ignore trailing comma
19444 if (idx > 0 && idx === body.length - 1) {
19445 return;
19446 }
19447 error("E002", directiveToken);
19448 return;
19449 }
19450
19451 state.funct["(scope)"].addExported(e);
19452 });
19453 }
19454
19455 if (directiveToken.type === "members") {
19456 membersOnly = membersOnly || {};
19457
19458 body.forEach(function(m) {
19459 var ch1 = m.charAt(0);
19460 var ch2 = m.charAt(m.length - 1);
19461
19462 if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) {
19463 m = m
19464 .substr(1, m.length - 2)
19465 .replace("\\\"", "\"");
19466 }
19467
19468 membersOnly[m] = false;
19469 });
19470 }
19471
19472 var numvals = [
19473 "maxstatements",
19474 "maxparams",
19475 "maxdepth",
19476 "maxcomplexity",
19477 "maxerr",
19478 "maxlen",
19479 "indent"
19480 ];
19481
19482 if (directiveToken.type === "jshint" || directiveToken.type === "jslint") {
19483 body.forEach(function(g) {
19484 g = g.split(":");
19485 var key = (g[0] || "").trim();
19486 var val = (g[1] || "").trim();
19487
19488 if (!checkOption(key, directiveToken)) {
19489 return;
19490 }
19491
19492 if (numvals.indexOf(key) >= 0) {
19493 // GH988 - numeric options can be disabled by setting them to `false`
19494 if (val !== "false") {
19495 val = +val;
19496
19497 if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) {
19498 error("E032", directiveToken, g[1].trim());
19499 return;
19500 }
19501
19502 state.option[key] = val;
19503 } else {
19504 state.option[key] = key === "indent" ? 4 : false;
19505 }
19506
19507 return;
19508 }
19509
19510 if (key === "validthis") {
19511 // `validthis` is valid only within a function scope.
19512
19513 if (state.funct["(global)"])
19514 return void error("E009");
19515
19516 if (val !== "true" && val !== "false")
19517 return void error("E002", directiveToken);
19518
19519 state.option.validthis = (val === "true");
19520 return;
19521 }
19522
19523 if (key === "quotmark") {
19524 switch (val) {
19525 case "true":
19526 case "false":
19527 state.option.quotmark = (val === "true");
19528 break;
19529 case "double":
19530 case "single":
19531 state.option.quotmark = val;
19532 break;
19533 default:
19534 error("E002", directiveToken);
19535 }
19536 return;
19537 }
19538
19539 if (key === "shadow") {
19540 switch (val) {
19541 case "true":
19542 state.option.shadow = true;
19543 break;
19544 case "outer":
19545 state.option.shadow = "outer";
19546 break;
19547 case "false":
19548 case "inner":
19549 state.option.shadow = "inner";
19550 break;
19551 default:
19552 error("E002", directiveToken);
19553 }
19554 return;
19555 }
19556
19557 if (key === "unused") {
19558 switch (val) {
19559 case "true":
19560 state.option.unused = true;
19561 break;
19562 case "false":
19563 state.option.unused = false;
19564 break;
19565 case "vars":
19566 case "strict":
19567 state.option.unused = val;
19568 break;
19569 default:
19570 error("E002", directiveToken);
19571 }
19572 return;
19573 }
19574
19575 if (key === "latedef") {
19576 switch (val) {
19577 case "true":
19578 state.option.latedef = true;
19579 break;
19580 case "false":
19581 state.option.latedef = false;
19582 break;
19583 case "nofunc":
19584 state.option.latedef = "nofunc";
19585 break;
19586 default:
19587 error("E002", directiveToken);
19588 }
19589 return;
19590 }
19591
19592 if (key === "ignore") {
19593 switch (val) {
19594 case "line":
19595 state.ignoredLines[directiveToken.line] = true;
19596 removeIgnoredMessages();
19597 break;
19598 default:
19599 error("E002", directiveToken);
19600 }
19601 return;
19602 }
19603
19604 if (key === "strict") {
19605 switch (val) {
19606 case "true":
19607 state.option.strict = true;
19608 break;
19609 case "false":
19610 state.option.strict = false;
19611 break;
19612 case "global":
19613 case "implied":
19614 state.option.strict = val;
19615 break;
19616 default:
19617 error("E002", directiveToken);
19618 }
19619 return;
19620 }
19621
19622 if (key === "module") {
19623 /**
19624 * TODO: Extend this restriction to *all* "environmental" options.
19625 */
19626 if (!hasParsedCode(state.funct)) {
19627 error("E055", directiveToken, "module");
19628 }
19629 }
19630
19631 if (key === "esversion") {
19632 switch (val) {
19633 case "3":
19634 case "5":
19635 case "6":
19636 case "2015":
19637 state.option.moz = false;
19638 state.option.esversion = +val;
19639 break;
19640 default:
19641 error("E002", directiveToken);
19642 }
19643 if (!hasParsedCode(state.funct)) {
19644 error("E055", directiveToken, "esversion");
19645 }
19646 return;
19647 }
19648
19649 var match = /^([+-])(W\d{3})$/g.exec(key);
19650 if (match) {
19651 // ignore for -W..., unignore for +W...
19652 state.ignored[match[2]] = (match[1] === "-");
19653 return;
19654 }
19655
19656 var tn;
19657 if (val === "true" || val === "false") {
19658 if (directiveToken.type === "jslint") {
19659 tn = options.renamed[key] || key;
19660 state.option[tn] = (val === "true");
19661
19662 if (options.inverted[tn] !== undefined) {
19663 state.option[tn] = !state.option[tn];
19664 }
19665 } else {
19666 state.option[key] = (val === "true");
19667 }
19668
19669 return;
19670 }
19671
19672 error("E002", directiveToken);
19673 });
19674
19675 applyOptions();
19676 }
19677 }
19678
19679 /**
19680 * Return a token beyond the token available in `state.tokens.next`. If no
19681 * such token exists, return the "(end)" token. This function is used to
19682 * determine parsing strategies in cases where the value of the next token
19683 * does not provide sufficient information, as is the case with `for` loops,
19684 * e.g.:
19685 *
19686 * for ( var i in ...
19687 *
19688 * versus:
19689 *
19690 * for ( var i = ...
19691 *
19692 * @param {number} [p] - offset of desired token; defaults to 0
19693 *
19694 * @returns {token}
19695 */
19696 function peek(p) {
19697 var i = p || 0, j = lookahead.length, t;
19698
19699 if (i < j) {
19700 return lookahead[i];
19701 }
19702
19703 while (j <= i) {
19704 t = lex.token();
19705
19706 // When the lexer is exhausted, this function should produce the "(end)"
19707 // token, even in cases where the requested token is beyond the end of
19708 // the input stream.
19709 if (!t) {
19710 // If the lookahead buffer is empty, the expected "(end)" token was
19711 // already emitted by the most recent invocation of `advance` and is
19712 // available as the next token.
19713 if (!lookahead.length) {
19714 return state.tokens.next;
19715 }
19716
19717 return lookahead[j - 1];
19718 }
19719
19720 lookahead[j] = t;
19721 j += 1;
19722 }
19723
19724 return t;
19725 }
19726
19727 function peekIgnoreEOL() {
19728 var i = 0;
19729 var t;
19730 do {
19731 t = peek(i++);
19732 } while (t.id === "(endline)");
19733 return t;
19734 }
19735
19736 // Produce the next token. It looks for programming errors.
19737
19738 function advance(id, t) {
19739
19740 switch (state.tokens.curr.id) {
19741 case "(number)":
19742 if (state.tokens.next.id === ".") {
19743 warning("W005", state.tokens.curr);
19744 }
19745 break;
19746 case "-":
19747 if (state.tokens.next.id === "-" || state.tokens.next.id === "--") {
19748 warning("W006");
19749 }
19750 break;
19751 case "+":
19752 if (state.tokens.next.id === "+" || state.tokens.next.id === "++") {
19753 warning("W007");
19754 }
19755 break;
19756 }
19757
19758 if (id && state.tokens.next.id !== id) {
19759 if (t) {
19760 if (state.tokens.next.id === "(end)") {
19761 error("E019", t, t.id);
19762 } else {
19763 error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value);
19764 }
19765 } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) {
19766 warning("W116", state.tokens.next, id, state.tokens.next.value);
19767 }
19768 }
19769
19770 state.tokens.prev = state.tokens.curr;
19771 state.tokens.curr = state.tokens.next;
19772 for (;;) {
19773 state.tokens.next = lookahead.shift() || lex.token();
19774
19775 if (!state.tokens.next) { // No more tokens left, give up
19776 quit("E041", state.tokens.curr);
19777 }
19778
19779 if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") {
19780 return;
19781 }
19782
19783 if (state.tokens.next.check) {
19784 state.tokens.next.check();
19785 }
19786
19787 if (state.tokens.next.isSpecial) {
19788 lintingDirective(state.tokens.next, state.tokens.curr);
19789 } else {
19790 if (state.tokens.next.id !== "(endline)") {
19791 break;
19792 }
19793 }
19794 }
19795 }
19796
19797 /**
19798 * Determine whether a given token is an operator.
19799 *
19800 * @param {token} token
19801 *
19802 * @returns {boolean}
19803 */
19804 function isOperator(token) {
19805 return token.first || token.right || token.left || token.id === "yield";
19806 }
19807
19808 function isEndOfExpr(curr, next) {
19809 if (arguments.length === 0) {
19810 curr = state.tokens.curr;
19811 next = state.tokens.next;
19812 }
19813
19814 if (next.id === ";" || next.id === "}" || next.id === ":") {
19815 return true;
19816 }
19817 if (next.infix === curr.infix || curr.ltBoundary === "after" ||
19818 next.ltBoundary === "before") {
19819 return curr.line !== startLine(next);
19820 }
19821 return false;
19822 }
19823
19824 // This is the heart of JSHINT, the Pratt parser. In addition to parsing, it
19825 // is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is
19826 // like .nud except that it is only used on the first token of a statement.
19827 // Having .fud makes it much easier to define statement-oriented languages like
19828 // JavaScript. I retained Pratt's nomenclature.
19829
19830 // .nud Null denotation
19831 // .fud First null denotation
19832 // .led Left denotation
19833 // lbp Left binding power
19834 // rbp Right binding power
19835
19836 // They are elements of the parsing method called Top Down Operator Precedence.
19837
19838 function expression(rbp, initial) {
19839 var left, isArray = false, isObject = false, isLetExpr = false;
19840
19841 state.nameStack.push();
19842
19843 // if current expression is a let expression
19844 if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") {
19845 if (!state.inMoz()) {
19846 warning("W118", state.tokens.next, "let expressions");
19847 }
19848 isLetExpr = true;
19849 // create a new block scope we use only for the current expression
19850 state.funct["(scope)"].stack();
19851 advance("let");
19852 advance("(");
19853 state.tokens.prev.fud();
19854 advance(")");
19855 }
19856
19857 if (state.tokens.next.id === "(end)")
19858 error("E006", state.tokens.curr);
19859
19860 var isDangerous =
19861 state.option.asi &&
19862 state.tokens.prev.line !== startLine(state.tokens.curr) &&
19863 _.contains(["]", ")"], state.tokens.prev.id) &&
19864 _.contains(["[", "("], state.tokens.curr.id);
19865
19866 if (isDangerous)
19867 warning("W014", state.tokens.curr, state.tokens.curr.id);
19868
19869 advance();
19870
19871 if (initial) {
19872 state.funct["(verb)"] = state.tokens.curr.value;
19873 state.tokens.curr.beginsStmt = true;
19874 }
19875
19876 if (initial === true && state.tokens.curr.fud) {
19877 left = state.tokens.curr.fud();
19878 } else {
19879 if (state.tokens.curr.nud) {
19880 left = state.tokens.curr.nud(rbp);
19881 } else {
19882 error("E030", state.tokens.curr, state.tokens.curr.id);
19883 }
19884
19885 while (rbp < state.tokens.next.lbp && !isEndOfExpr()) {
19886 isArray = state.tokens.curr.value === "Array";
19887 isObject = state.tokens.curr.value === "Object";
19888
19889 // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object()
19890 // Line breaks in IfStatement heads exist to satisfy the checkJSHint
19891 // "Line too long." error.
19892 if (left && (left.value || (left.first && left.first.value))) {
19893 // If the left.value is not "new", or the left.first.value is a "."
19894 // then safely assume that this is not "new Array()" and possibly
19895 // not "new Object()"...
19896 if (left.value !== "new" ||
19897 (left.first && left.first.value && left.first.value === ".")) {
19898 isArray = false;
19899 // ...In the case of Object, if the left.value and state.tokens.curr.value
19900 // are not equal, then safely assume that this not "new Object()"
19901 if (left.value !== state.tokens.curr.value) {
19902 isObject = false;
19903 }
19904 }
19905 }
19906
19907 advance();
19908
19909 if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
19910 warning("W009", state.tokens.curr);
19911 }
19912
19913 if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
19914 warning("W010", state.tokens.curr);
19915 }
19916
19917 if (left && state.tokens.curr.led) {
19918 left = state.tokens.curr.led(left);
19919 } else {
19920 error("E033", state.tokens.curr, state.tokens.curr.id);
19921 }
19922 }
19923 }
19924 if (isLetExpr) {
19925 state.funct["(scope)"].unstack();
19926 }
19927
19928 state.nameStack.pop();
19929
19930 return left;
19931 }
19932
19933
19934 // Functions for conformance of style.
19935
19936 function startLine(token) {
19937 return token.startLine || token.line;
19938 }
19939
19940 function nobreaknonadjacent(left, right) {
19941 left = left || state.tokens.curr;
19942 right = right || state.tokens.next;
19943 if (!state.option.laxbreak && left.line !== startLine(right)) {
19944 warning("W014", right, right.value);
19945 }
19946 }
19947
19948 function nolinebreak(t) {
19949 t = t || state.tokens.curr;
19950 if (t.line !== startLine(state.tokens.next)) {
19951 warning("E022", t, t.value);
19952 }
19953 }
19954
19955 function nobreakcomma(left, right) {
19956 if (left.line !== startLine(right)) {
19957 if (!state.option.laxcomma) {
19958 if (parseComma.first) {
19959 warning("I001");
19960 parseComma.first = false;
19961 }
19962 warning("W014", left, right.value);
19963 }
19964 }
19965 }
19966
19967 function parseComma(opts) {
19968 opts = opts || {};
19969
19970 if (!opts.peek) {
19971 nobreakcomma(state.tokens.curr, state.tokens.next);
19972 advance(",");
19973 } else {
19974 nobreakcomma(state.tokens.prev, state.tokens.curr);
19975 }
19976
19977 if (state.tokens.next.identifier && !(opts.property && state.inES5())) {
19978 // Keywords that cannot follow a comma operator.
19979 switch (state.tokens.next.value) {
19980 case "break":
19981 case "case":
19982 case "catch":
19983 case "continue":
19984 case "default":
19985 case "do":
19986 case "else":
19987 case "finally":
19988 case "for":
19989 case "if":
19990 case "in":
19991 case "instanceof":
19992 case "return":
19993 case "switch":
19994 case "throw":
19995 case "try":
19996 case "var":
19997 case "let":
19998 case "while":
19999 case "with":
20000 error("E024", state.tokens.next, state.tokens.next.value);
20001 return false;
20002 }
20003 }
20004
20005 if (state.tokens.next.type === "(punctuator)") {
20006 switch (state.tokens.next.value) {
20007 case "}":
20008 case "]":
20009 case ",":
20010 if (opts.allowTrailing) {
20011 return true;
20012 }
20013
20014 /* falls through */
20015 case ")":
20016 error("E024", state.tokens.next, state.tokens.next.value);
20017 return false;
20018 }
20019 }
20020 return true;
20021 }
20022
20023 // Functional constructors for making the symbols that will be inherited by
20024 // tokens.
20025
20026 function symbol(s, p) {
20027 var x = state.syntax[s];
20028 if (!x || typeof x !== "object") {
20029 state.syntax[s] = x = {
20030 id: s,
20031 lbp: p,
20032 value: s
20033 };
20034 }
20035 return x;
20036 }
20037
20038 function delim(s) {
20039 var x = symbol(s, 0);
20040 x.delim = true;
20041 return x;
20042 }
20043
20044 function stmt(s, f) {
20045 var x = delim(s);
20046 x.identifier = x.reserved = true;
20047 x.fud = f;
20048 return x;
20049 }
20050
20051 function blockstmt(s, f) {
20052 var x = stmt(s, f);
20053 x.block = true;
20054 return x;
20055 }
20056
20057 function reserveName(x) {
20058 var c = x.id.charAt(0);
20059 if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {
20060 x.identifier = x.reserved = true;
20061 }
20062 return x;
20063 }
20064
20065 function prefix(s, f) {
20066 var x = symbol(s, 150);
20067 reserveName(x);
20068
20069 x.nud = (typeof f === "function") ? f : function() {
20070 this.arity = "unary";
20071 this.right = expression(150);
20072
20073 if (this.id === "++" || this.id === "--") {
20074 if (state.option.plusplus) {
20075 warning("W016", this, this.id);
20076 } else if (this.right && (!this.right.identifier || isReserved(this.right)) &&
20077 this.right.id !== "." && this.right.id !== "[") {
20078 warning("W017", this);
20079 }
20080
20081 if (this.right && this.right.isMetaProperty) {
20082 error("E031", this);
20083 // detect increment/decrement of a const
20084 // in the case of a.b, right will be the "." punctuator
20085 } else if (this.right && this.right.identifier) {
20086 state.funct["(scope)"].block.modify(this.right.value, this);
20087 }
20088 }
20089
20090 return this;
20091 };
20092
20093 return x;
20094 }
20095
20096 function type(s, f) {
20097 var x = delim(s);
20098 x.type = s;
20099 x.nud = f;
20100 return x;
20101 }
20102
20103 function reserve(name, func) {
20104 var x = type(name, func);
20105 x.identifier = true;
20106 x.reserved = true;
20107 return x;
20108 }
20109
20110 function FutureReservedWord(name, meta) {
20111 var x = type(name, (meta && meta.nud) || function() {
20112 return this;
20113 });
20114
20115 meta = meta || {};
20116 meta.isFutureReservedWord = true;
20117
20118 x.value = name;
20119 x.identifier = true;
20120 x.reserved = true;
20121 x.meta = meta;
20122
20123 return x;
20124 }
20125
20126 function reservevar(s, v) {
20127 return reserve(s, function() {
20128 if (typeof v === "function") {
20129 v(this);
20130 }
20131 return this;
20132 });
20133 }
20134
20135 function infix(s, f, p, w) {
20136 var x = symbol(s, p);
20137 reserveName(x);
20138 x.infix = true;
20139 x.led = function(left) {
20140 if (!w) {
20141 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
20142 }
20143 if ((s === "in" || s === "instanceof") && left.id === "!") {
20144 warning("W018", left, "!");
20145 }
20146 if (typeof f === "function") {
20147 return f(left, this);
20148 } else {
20149 this.left = left;
20150 this.right = expression(p);
20151 return this;
20152 }
20153 };
20154 return x;
20155 }
20156
20157 function application(s) {
20158 var x = symbol(s, 42);
20159
20160 x.infix = true;
20161 x.led = function(left) {
20162 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
20163
20164 this.left = left;
20165 this.right = doFunction({ type: "arrow", loneArg: left });
20166 return this;
20167 };
20168 return x;
20169 }
20170
20171 function relation(s, f) {
20172 var x = symbol(s, 100);
20173
20174 x.infix = true;
20175 x.led = function(left) {
20176 nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
20177 this.left = left;
20178 var right = this.right = expression(100);
20179
20180 if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) {
20181 warning("W019", this);
20182 } else if (f) {
20183 f.apply(this, [left, right]);
20184 }
20185
20186 if (!left || !right) {
20187 quit("E041", state.tokens.curr);
20188 }
20189
20190 if (left.id === "!") {
20191 warning("W018", left, "!");
20192 }
20193
20194 if (right.id === "!") {
20195 warning("W018", right, "!");
20196 }
20197
20198 return this;
20199 };
20200 return x;
20201 }
20202
20203 var typeofValues = {};
20204 typeofValues.legacy = [
20205 // E4X extended the `typeof` operator to return "xml" for the XML and
20206 // XMLList types it introduced.
20207 // Ref: 11.3.2 The typeof Operator
20208 // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf
20209 "xml",
20210 // IE<9 reports "unknown" when the `typeof` operator is applied to an
20211 // object existing across a COM+ bridge. In lieu of official documentation
20212 // (which does not exist), see:
20213 // http://robertnyman.com/2005/12/21/what-is-typeof-unknown/
20214 "unknown"
20215 ];
20216 typeofValues.es3 = [
20217 "undefined", "boolean", "number", "string", "function", "object",
20218 ];
20219 typeofValues.es3 = typeofValues.es3.concat(typeofValues.legacy);
20220 typeofValues.es6 = typeofValues.es3.concat("symbol");
20221
20222 // Checks whether the 'typeof' operator is used with the correct
20223 // value. For docs on 'typeof' see:
20224 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
20225 function isTypoTypeof(left, right, state) {
20226 var values;
20227
20228 if (state.option.notypeof)
20229 return false;
20230
20231 if (!left || !right)
20232 return false;
20233
20234 values = state.inES6() ? typeofValues.es6 : typeofValues.es3;
20235
20236 if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)")
20237 return !_.contains(values, left.value);
20238
20239 return false;
20240 }
20241
20242 function isGlobalEval(left, state) {
20243 var isGlobal = false;
20244
20245 // permit methods to refer to an "eval" key in their own context
20246 if (left.type === "this" && state.funct["(context)"] === null) {
20247 isGlobal = true;
20248 }
20249 // permit use of "eval" members of objects
20250 else if (left.type === "(identifier)") {
20251 if (state.option.node && left.value === "global") {
20252 isGlobal = true;
20253 }
20254
20255 else if (state.option.browser && (left.value === "window" || left.value === "document")) {
20256 isGlobal = true;
20257 }
20258 }
20259
20260 return isGlobal;
20261 }
20262
20263 function findNativePrototype(left) {
20264 var natives = [
20265 "Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date",
20266 "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array",
20267 "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array",
20268 "Iterator", "Number", "NumberFormat", "Object", "RangeError",
20269 "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError",
20270 "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray",
20271 "URIError"
20272 ];
20273
20274 function walkPrototype(obj) {
20275 if (typeof obj !== "object") return;
20276 return obj.right === "prototype" ? obj : walkPrototype(obj.left);
20277 }
20278
20279 function walkNative(obj) {
20280 while (!obj.identifier && typeof obj.left === "object")
20281 obj = obj.left;
20282
20283 if (obj.identifier && natives.indexOf(obj.value) >= 0 &&
20284 state.funct["(scope)"].isPredefined(obj.value)) {
20285 return obj.value;
20286 }
20287 }
20288
20289 var prototype = walkPrototype(left);
20290 if (prototype) return walkNative(prototype);
20291 }
20292
20293 /**
20294 * Checks the left hand side of an assignment for issues, returns if ok
20295 * @param {token} left - the left hand side of the assignment
20296 * @param {token=} assignToken - the token for the assignment, used for reporting
20297 * @param {object=} options - optional object
20298 * @param {boolean} options.allowDestructuring - whether to allow destructuting binding
20299 * @returns {boolean} Whether the left hand side is OK
20300 */
20301 function checkLeftSideAssign(left, assignToken, options) {
20302
20303 var allowDestructuring = options && options.allowDestructuring;
20304
20305 assignToken = assignToken || left;
20306
20307 if (state.option.freeze) {
20308 var nativeObject = findNativePrototype(left);
20309 if (nativeObject)
20310 warning("W121", left, nativeObject);
20311 }
20312 if (checkPunctuator(left, "...")) {
20313 left = left.right;
20314 }
20315
20316 if (left.identifier && !left.isMetaProperty) {
20317 // reassign also calls modify
20318 // but we are specific in order to catch function re-assignment
20319 // and globals re-assignment
20320 state.funct["(scope)"].block.reassign(left.value, left);
20321 }
20322
20323 if (left.id === ".") {
20324 if (!left.left || left.left.value === "arguments" && !state.isStrict()) {
20325 warning("E031", assignToken);
20326 }
20327
20328 state.nameStack.set(state.tokens.prev);
20329 return true;
20330 } else if (left.id === "{" || left.id === "[") {
20331 if (!allowDestructuring || !left.destructAssign) {
20332 if (left.id === "{" || !left.left) {
20333 warning("E031", assignToken);
20334 } else if (left.left.value === "arguments" && !state.isStrict()) {
20335 warning("E031", assignToken);
20336 }
20337 }
20338
20339 if (left.id === "[") {
20340 state.nameStack.set(left.right);
20341 }
20342
20343 return true;
20344 } else if (left.identifier && !isReserved(left) && !left.isMetaProperty) {
20345 if (state.funct["(scope)"].labeltype(left.value) === "exception") {
20346 warning("W022", left);
20347 }
20348 state.nameStack.set(left);
20349 return true;
20350 }
20351
20352 if (left === state.syntax["function"]) {
20353 warning("W023", state.tokens.curr);
20354 } else {
20355 error("E031", assignToken);
20356 }
20357
20358 return false;
20359 }
20360
20361 function assignop(s, f, p) {
20362 var x = infix(s, typeof f === "function" ? f : function(left, that) {
20363 that.left = left;
20364
20365 checkLeftSideAssign(left, that, { allowDestructuring: true });
20366
20367 that.right = expression(10);
20368
20369 return that;
20370 }, p);
20371
20372 x.exps = true;
20373 x.assign = true;
20374 return x;
20375 }
20376
20377
20378 function bitwise(s, f, p) {
20379 var x = symbol(s, p);
20380 reserveName(x);
20381 x.infix = true;
20382 x.led = (typeof f === "function") ? f : function(left) {
20383 if (state.option.bitwise) {
20384 warning("W016", this, this.id);
20385 }
20386 this.left = left;
20387 this.right = expression(p);
20388 return this;
20389 };
20390 return x;
20391 }
20392
20393 function bitwiseassignop(s) {
20394 return assignop(s, function(left, that) {
20395 if (state.option.bitwise) {
20396 warning("W016", that, that.id);
20397 }
20398
20399 checkLeftSideAssign(left, that);
20400
20401 that.right = expression(10);
20402
20403 return that;
20404 }, 20);
20405 }
20406
20407 function suffix(s) {
20408 var x = symbol(s, 150);
20409
20410 x.led = function(left) {
20411 // this = suffix e.g. "++" punctuator
20412 // left = symbol operated e.g. "a" identifier or "a.b" punctuator
20413 if (state.option.plusplus) {
20414 warning("W016", this, this.id);
20415 } else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") {
20416 warning("W017", this);
20417 }
20418
20419 if (left.isMetaProperty) {
20420 error("E031", this);
20421 // detect increment/decrement of a const
20422 // in the case of a.b, left will be the "." punctuator
20423 } else if (left && left.identifier) {
20424 state.funct["(scope)"].block.modify(left.value, left);
20425 }
20426
20427 this.left = left;
20428 return this;
20429 };
20430 return x;
20431 }
20432
20433 // fnparam means that this identifier is being defined as a function
20434 // argument (see identifier())
20435 // prop means that this identifier is that of an object property
20436
20437 function optionalidentifier(fnparam, prop, preserve) {
20438 if (!state.tokens.next.identifier) {
20439 return;
20440 }
20441
20442 if (!preserve) {
20443 advance();
20444 }
20445
20446 var curr = state.tokens.curr;
20447 var val = state.tokens.curr.value;
20448
20449 if (!isReserved(curr)) {
20450 return val;
20451 }
20452
20453 if (prop) {
20454 if (state.inES5()) {
20455 return val;
20456 }
20457 }
20458
20459 if (fnparam && val === "undefined") {
20460 return val;
20461 }
20462
20463 warning("W024", state.tokens.curr, state.tokens.curr.id);
20464 return val;
20465 }
20466
20467 // fnparam means that this identifier is being defined as a function
20468 // argument
20469 // prop means that this identifier is that of an object property
20470 function identifier(fnparam, prop) {
20471 var i = optionalidentifier(fnparam, prop, false);
20472 if (i) {
20473 return i;
20474 }
20475
20476 // parameter destructuring with rest operator
20477 if (state.tokens.next.value === "...") {
20478 if (!state.inES6(true)) {
20479 warning("W119", state.tokens.next, "spread/rest operator", "6");
20480 }
20481 advance();
20482
20483 if (checkPunctuator(state.tokens.next, "...")) {
20484 warning("E024", state.tokens.next, "...");
20485 while (checkPunctuator(state.tokens.next, "...")) {
20486 advance();
20487 }
20488 }
20489
20490 if (!state.tokens.next.identifier) {
20491 warning("E024", state.tokens.curr, state.tokens.next.id);
20492 return;
20493 }
20494
20495 return identifier(fnparam, prop);
20496 } else {
20497 error("E030", state.tokens.next, state.tokens.next.value);
20498
20499 // The token should be consumed after a warning is issued so the parser
20500 // can continue as though an identifier were found. The semicolon token
20501 // should not be consumed in this way so that the parser interprets it as
20502 // a statement delimeter;
20503 if (state.tokens.next.id !== ";") {
20504 advance();
20505 }
20506 }
20507 }
20508
20509
20510 function reachable(controlToken) {
20511 var i = 0, t;
20512 if (state.tokens.next.id !== ";" || controlToken.inBracelessBlock) {
20513 return;
20514 }
20515 for (;;) {
20516 do {
20517 t = peek(i);
20518 i += 1;
20519 } while (t.id !== "(end)" && t.id === "(comment)");
20520
20521 if (t.reach) {
20522 return;
20523 }
20524 if (t.id !== "(endline)") {
20525 if (t.id === "function") {
20526 if (state.option.latedef === true) {
20527 warning("W026", t);
20528 }
20529 break;
20530 }
20531
20532 warning("W027", t, t.value, controlToken.value);
20533 break;
20534 }
20535 }
20536 }
20537
20538 /**
20539 * Consume the semicolon that delimits the statement currently being parsed,
20540 * emitting relevant warnings/errors as appropriate.
20541 *
20542 * @param {token} stmt - token describing the statement under consideration
20543 */
20544 function parseFinalSemicolon(stmt) {
20545 if (state.tokens.next.id !== ";") {
20546 // don't complain about unclosed templates / strings
20547 if (state.tokens.next.isUnclosed) return advance();
20548
20549 var sameLine = startLine(state.tokens.next) === state.tokens.curr.line &&
20550 state.tokens.next.id !== "(end)";
20551 var blockEnd = checkPunctuator(state.tokens.next, "}");
20552
20553 if (sameLine && !blockEnd && !(stmt.id === "do" && state.inES6(true))) {
20554 errorAt("E058", state.tokens.curr.line, state.tokens.curr.character);
20555 } else if (!state.option.asi) {
20556 // If this is the last statement in a block that ends on
20557 // the same line *and* option lastsemic is on, ignore the warning.
20558 // Otherwise, complain about missing semicolon.
20559 if (!(blockEnd && sameLine && state.option.lastsemic)) {
20560 warningAt("W033", state.tokens.curr.line, state.tokens.curr.character);
20561 }
20562 }
20563 } else {
20564 advance(";");
20565 }
20566 }
20567
20568 function statement() {
20569 var i = indent, r, t = state.tokens.next, hasOwnScope = false;
20570
20571 if (t.id === ";") {
20572 advance(";");
20573 return;
20574 }
20575
20576 // Is this a labelled statement?
20577 var res = isReserved(t);
20578
20579 // We're being more tolerant here: if someone uses
20580 // a FutureReservedWord as a label, we warn but proceed
20581 // anyway.
20582
20583 if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") {
20584 warning("W024", t, t.id);
20585 res = false;
20586 }
20587
20588 if (t.identifier && !res && peek().id === ":") {
20589 advance();
20590 advance(":");
20591
20592 hasOwnScope = true;
20593 state.funct["(scope)"].stack();
20594 state.funct["(scope)"].block.addBreakLabel(t.value, { token: state.tokens.curr });
20595
20596 if (!state.tokens.next.labelled && state.tokens.next.value !== "{") {
20597 warning("W028", state.tokens.next, t.value, state.tokens.next.value);
20598 }
20599
20600 state.tokens.next.label = t.value;
20601 t = state.tokens.next;
20602 }
20603
20604 // Is it a lonely block?
20605
20606 if (t.id === "{") {
20607 // Is it a switch case block?
20608 //
20609 // switch (foo) {
20610 // case bar: { <= here.
20611 // ...
20612 // }
20613 // }
20614 var iscase = (state.funct["(verb)"] === "case" && state.tokens.curr.value === ":");
20615 block(true, true, false, false, iscase);
20616
20617 if (hasOwnScope) {
20618 state.funct["(scope)"].unstack();
20619 }
20620
20621 return;
20622 }
20623
20624 // Parse the statement.
20625
20626 r = expression(0, true);
20627
20628 if (r && !(r.identifier && r.value === "function") &&
20629 !(r.type === "(punctuator)" && r.left &&
20630 r.left.identifier && r.left.value === "function")) {
20631 if (!state.isStrict() && state.stmtMissingStrict()) {
20632 warning("E007");
20633 }
20634 }
20635
20636 // Look for the final semicolon.
20637
20638 if (!t.block) {
20639 if (!state.option.expr && (!r || !r.exps)) {
20640 warning("W030", state.tokens.curr);
20641 } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") {
20642 warning("W031", t);
20643 }
20644 parseFinalSemicolon(t);
20645 }
20646
20647
20648 // Restore the indentation.
20649
20650 indent = i;
20651 if (hasOwnScope) {
20652 state.funct["(scope)"].unstack();
20653 }
20654 return r;
20655 }
20656
20657
20658 function statements() {
20659 var a = [], p;
20660
20661 while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") {
20662 if (state.tokens.next.id === ";") {
20663 p = peek();
20664
20665 if (!p || (p.id !== "(" && p.id !== "[")) {
20666 warning("W032");
20667 }
20668
20669 advance(";");
20670 } else {
20671 a.push(statement());
20672 }
20673 }
20674 return a;
20675 }
20676
20677
20678 /*
20679 * read all directives
20680 */
20681 function directives() {
20682 var current = state.tokens.next;
20683 while (state.tokens.next.id === "(string)") {
20684 var next = peekIgnoreEOL();
20685 if (!isEndOfExpr(current, next)) {
20686 break;
20687 }
20688 current = next;
20689
20690 advance();
20691 var directive = state.tokens.curr.value;
20692 if (state.directive[directive] ||
20693 (directive === "use strict" && state.option.strict === "implied")) {
20694 warning("W034", state.tokens.curr, directive);
20695 }
20696
20697 // there's no directive negation, so always set to true
20698 state.directive[directive] = true;
20699
20700 parseFinalSemicolon(current);
20701 }
20702
20703 if (state.isStrict()) {
20704 state.option.undef = true;
20705 }
20706 }
20707
20708
20709 /*
20710 * Parses a single block. A block is a sequence of statements wrapped in
20711 * braces.
20712 *
20713 * ordinary - true for everything but function bodies and try blocks.
20714 * stmt - true if block can be a single statement (e.g. in if/for/while).
20715 * isfunc - true if block is a function body
20716 * isfatarrow - true if its a body of a fat arrow function
20717 * iscase - true if block is a switch case block
20718 */
20719 function block(ordinary, stmt, isfunc, isfatarrow, iscase) {
20720 var a,
20721 b = inblock,
20722 old_indent = indent,
20723 m,
20724 t,
20725 line,
20726 d;
20727
20728 inblock = ordinary;
20729
20730 t = state.tokens.next;
20731
20732 var metrics = state.funct["(metrics)"];
20733 metrics.nestedBlockDepth += 1;
20734 metrics.verifyMaxNestedBlockDepthPerFunction();
20735
20736 if (state.tokens.next.id === "{") {
20737 advance("{");
20738
20739 // create a new block scope
20740 state.funct["(scope)"].stack();
20741 state.funct["(noblockscopedvar)"] = false;
20742
20743 line = state.tokens.curr.line;
20744 if (state.tokens.next.id !== "}") {
20745 indent += state.option.indent;
20746 while (!ordinary && state.tokens.next.from > indent) {
20747 indent += state.option.indent;
20748 }
20749
20750 if (isfunc) {
20751 m = {};
20752 for (d in state.directive) {
20753 if (_.has(state.directive, d)) {
20754 m[d] = state.directive[d];
20755 }
20756 }
20757 directives();
20758
20759 if (state.option.strict && state.funct["(context)"]["(global)"]) {
20760 if (!m["use strict"] && !state.isStrict()) {
20761 warning("E007");
20762 }
20763 }
20764 }
20765
20766 a = statements();
20767
20768 metrics.statementCount += a.length;
20769
20770 indent -= state.option.indent;
20771 }
20772
20773 advance("}", t);
20774
20775 if (isfunc) {
20776 state.funct["(scope)"].validateParams();
20777 if (m) {
20778 state.directive = m;
20779 }
20780 }
20781
20782 state.funct["(scope)"].unstack();
20783
20784 indent = old_indent;
20785 } else if (!ordinary) {
20786 if (isfunc) {
20787 state.funct["(scope)"].stack();
20788
20789 m = {};
20790 if (stmt && !isfatarrow && !state.inMoz()) {
20791 error("W118", state.tokens.curr, "function closure expressions");
20792 }
20793
20794 if (!stmt) {
20795 for (d in state.directive) {
20796 if (_.has(state.directive, d)) {
20797 m[d] = state.directive[d];
20798 }
20799 }
20800 }
20801 expression(10);
20802
20803 if (state.option.strict && state.funct["(context)"]["(global)"]) {
20804 if (!m["use strict"] && !state.isStrict()) {
20805 warning("E007");
20806 }
20807 }
20808
20809 state.funct["(scope)"].unstack();
20810 } else {
20811 error("E021", state.tokens.next, "{", state.tokens.next.value);
20812 }
20813 } else {
20814
20815 // check to avoid let declaration not within a block
20816 // though is fine inside for loop initializer section
20817 state.funct["(noblockscopedvar)"] = state.tokens.next.id !== "for";
20818 state.funct["(scope)"].stack();
20819
20820 if (!stmt || state.option.curly) {
20821 warning("W116", state.tokens.next, "{", state.tokens.next.value);
20822 }
20823
20824 state.tokens.next.inBracelessBlock = true;
20825 indent += state.option.indent;
20826 // test indentation only if statement is in new line
20827 a = [statement()];
20828 indent -= state.option.indent;
20829
20830 state.funct["(scope)"].unstack();
20831 delete state.funct["(noblockscopedvar)"];
20832 }
20833
20834 // Don't clear and let it propagate out if it is "break", "return" or similar in switch case
20835 switch (state.funct["(verb)"]) {
20836 case "break":
20837 case "continue":
20838 case "return":
20839 case "throw":
20840 if (iscase) {
20841 break;
20842 }
20843
20844 /* falls through */
20845 default:
20846 state.funct["(verb)"] = null;
20847 }
20848
20849 inblock = b;
20850 if (ordinary && state.option.noempty && (!a || a.length === 0)) {
20851 warning("W035", state.tokens.prev);
20852 }
20853 metrics.nestedBlockDepth -= 1;
20854 return a;
20855 }
20856
20857
20858 function countMember(m) {
20859 if (membersOnly && typeof membersOnly[m] !== "boolean") {
20860 warning("W036", state.tokens.curr, m);
20861 }
20862 if (typeof member[m] === "number") {
20863 member[m] += 1;
20864 } else {
20865 member[m] = 1;
20866 }
20867 }
20868
20869 // Build the syntax table by declaring the syntactic elements of the language.
20870
20871 type("(number)", function() {
20872 return this;
20873 });
20874
20875 type("(string)", function() {
20876 return this;
20877 });
20878
20879 state.syntax["(identifier)"] = {
20880 type: "(identifier)",
20881 lbp: 0,
20882 identifier: true,
20883
20884 nud: function() {
20885 var v = this.value;
20886
20887 // If this identifier is the lone parameter to a shorthand "fat arrow"
20888 // function definition, i.e.
20889 //
20890 // x => x;
20891 //
20892 // ...it should not be considered as a variable in the current scope. It
20893 // will be added to the scope of the new function when the next token is
20894 // parsed, so it can be safely ignored for now.
20895 if (state.tokens.next.id === "=>") {
20896 return this;
20897 }
20898
20899 if (!state.funct["(comparray)"].check(v)) {
20900 state.funct["(scope)"].block.use(v, state.tokens.curr);
20901 }
20902 return this;
20903 },
20904
20905 led: function() {
20906 error("E033", state.tokens.next, state.tokens.next.value);
20907 }
20908 };
20909
20910 var baseTemplateSyntax = {
20911 identifier: false,
20912 template: true,
20913 };
20914 state.syntax["(template)"] = _.extend({
20915 lbp: 155,
20916 type: "(template)",
20917 nud: doTemplateLiteral,
20918 led: doTemplateLiteral,
20919 noSubst: false
20920 }, baseTemplateSyntax);
20921
20922 state.syntax["(template middle)"] = _.extend({
20923 lbp: 0,
20924 type: "(template middle)",
20925 middle: true,
20926 noSubst: false
20927 }, baseTemplateSyntax);
20928
20929 state.syntax["(template tail)"] = _.extend({
20930 lbp: 0,
20931 type: "(template tail)",
20932 tail: true,
20933 noSubst: false
20934 }, baseTemplateSyntax);
20935
20936 state.syntax["(no subst template)"] = _.extend({
20937 lbp: 155,
20938 type: "(template)",
20939 nud: doTemplateLiteral,
20940 led: doTemplateLiteral,
20941 noSubst: true,
20942 tail: true // mark as tail, since it's always the last component
20943 }, baseTemplateSyntax);
20944
20945 type("(regexp)", function() {
20946 return this;
20947 });
20948
20949 // ECMAScript parser
20950
20951 delim("(endline)");
20952 (function(x) {
20953 x.line = x.from = 0;
20954 })(delim("(begin)"));
20955 delim("(end)").reach = true;
20956 delim("(error)").reach = true;
20957 delim("}").reach = true;
20958 delim(")");
20959 delim("]");
20960 delim("\"").reach = true;
20961 delim("'").reach = true;
20962 delim(";");
20963 delim(":").reach = true;
20964 delim("#");
20965
20966 reserve("else");
20967 reserve("case").reach = true;
20968 reserve("catch");
20969 reserve("default").reach = true;
20970 reserve("finally");
20971 reservevar("arguments", function(x) {
20972 if (state.isStrict() && state.funct["(global)"]) {
20973 warning("E008", x);
20974 }
20975 });
20976 reservevar("eval");
20977 reservevar("false");
20978 reservevar("Infinity");
20979 reservevar("null");
20980 reservevar("this", function(x) {
20981 if (state.isStrict() && !isMethod() &&
20982 !state.option.validthis && ((state.funct["(statement)"] &&
20983 state.funct["(name)"].charAt(0) > "Z") || state.funct["(global)"])) {
20984 warning("W040", x);
20985 }
20986 });
20987 reservevar("true");
20988 reservevar("undefined");
20989
20990 assignop("=", "assign", 20);
20991 assignop("+=", "assignadd", 20);
20992 assignop("-=", "assignsub", 20);
20993 assignop("*=", "assignmult", 20);
20994 assignop("/=", "assigndiv", 20).nud = function() {
20995 error("E014");
20996 };
20997 assignop("%=", "assignmod", 20);
20998
20999 bitwiseassignop("&=");
21000 bitwiseassignop("|=");
21001 bitwiseassignop("^=");
21002 bitwiseassignop("<<=");
21003 bitwiseassignop(">>=");
21004 bitwiseassignop(">>>=");
21005 infix(",", function(left, that) {
21006 var expr;
21007 that.exprs = [left];
21008
21009 if (state.option.nocomma) {
21010 warning("W127");
21011 }
21012
21013 if (!parseComma({ peek: true })) {
21014 return that;
21015 }
21016 while (true) {
21017 if (!(expr = expression(10))) {
21018 break;
21019 }
21020 that.exprs.push(expr);
21021 if (state.tokens.next.value !== "," || !parseComma()) {
21022 break;
21023 }
21024 }
21025 return that;
21026 }, 10, true);
21027
21028 infix("?", function(left, that) {
21029 increaseComplexityCount();
21030 that.left = left;
21031 that.right = expression(10);
21032 advance(":");
21033 that["else"] = expression(10);
21034 return that;
21035 }, 30);
21036
21037 var orPrecendence = 40;
21038 infix("||", function(left, that) {
21039 increaseComplexityCount();
21040 that.left = left;
21041 that.right = expression(orPrecendence);
21042 return that;
21043 }, orPrecendence);
21044 infix("&&", "and", 50);
21045 bitwise("|", "bitor", 70);
21046 bitwise("^", "bitxor", 80);
21047 bitwise("&", "bitand", 90);
21048 relation("==", function(left, right) {
21049 var eqnull = state.option.eqnull &&
21050 ((left && left.value) === "null" || (right && right.value) === "null");
21051
21052 switch (true) {
21053 case !eqnull && state.option.eqeqeq:
21054 this.from = this.character;
21055 warning("W116", this, "===", "==");
21056 break;
21057 case isTypoTypeof(right, left, state):
21058 warning("W122", this, right.value);
21059 break;
21060 case isTypoTypeof(left, right, state):
21061 warning("W122", this, left.value);
21062 break;
21063 }
21064
21065 return this;
21066 });
21067 relation("===", function(left, right) {
21068 if (isTypoTypeof(right, left, state)) {
21069 warning("W122", this, right.value);
21070 } else if (isTypoTypeof(left, right, state)) {
21071 warning("W122", this, left.value);
21072 }
21073 return this;
21074 });
21075 relation("!=", function(left, right) {
21076 var eqnull = state.option.eqnull &&
21077 ((left && left.value) === "null" || (right && right.value) === "null");
21078
21079 if (!eqnull && state.option.eqeqeq) {
21080 this.from = this.character;
21081 warning("W116", this, "!==", "!=");
21082 } else if (isTypoTypeof(right, left, state)) {
21083 warning("W122", this, right.value);
21084 } else if (isTypoTypeof(left, right, state)) {
21085 warning("W122", this, left.value);
21086 }
21087 return this;
21088 });
21089 relation("!==", function(left, right) {
21090 if (isTypoTypeof(right, left, state)) {
21091 warning("W122", this, right.value);
21092 } else if (isTypoTypeof(left, right, state)) {
21093 warning("W122", this, left.value);
21094 }
21095 return this;
21096 });
21097 relation("<");
21098 relation(">");
21099 relation("<=");
21100 relation(">=");
21101 bitwise("<<", "shiftleft", 120);
21102 bitwise(">>", "shiftright", 120);
21103 bitwise(">>>", "shiftrightunsigned", 120);
21104 infix("in", "in", 120);
21105 infix("instanceof", function(left, token) {
21106 var right;
21107 var scope = state.funct["(scope)"];
21108 token.left = left;
21109 token.right = right = expression(120);
21110
21111 // This condition reflects a syntax error which will be reported by the
21112 // `expression` function.
21113 if (!right) {
21114 return token;
21115 }
21116
21117 if (right.id === "(number)" ||
21118 right.id === "(string)" ||
21119 right.value === "null" ||
21120 (right.value === "undefined" && !scope.has("undefined")) ||
21121 right.arity === "unary" ||
21122 right.id === "{" ||
21123 (right.id === "[" && !right.right) ||
21124 right.id === "(regexp)" ||
21125 (right.id === "(template)" && !right.tag)) {
21126 error("E060");
21127 }
21128
21129 if (right.id === "function") {
21130 warning("W139");
21131 }
21132
21133 return token;
21134 }, 120);
21135 infix("+", function(left, that) {
21136 var right;
21137 that.left = left;
21138 that.right = right = expression(130);
21139
21140 if (left && right && left.id === "(string)" && right.id === "(string)") {
21141 left.value += right.value;
21142 left.character = right.character;
21143 if (!state.option.scripturl && reg.javascriptURL.test(left.value)) {
21144 warning("W050", left);
21145 }
21146 return left;
21147 }
21148
21149 return that;
21150 }, 130);
21151 prefix("+", "num");
21152 prefix("+++", function() {
21153 warning("W007");
21154 this.arity = "unary";
21155 this.right = expression(150);
21156 return this;
21157 });
21158 infix("+++", function(left) {
21159 warning("W007");
21160 this.left = left;
21161 this.right = expression(130);
21162 return this;
21163 }, 130);
21164 infix("-", "sub", 130);
21165 prefix("-", "neg");
21166 prefix("---", function() {
21167 warning("W006");
21168 this.arity = "unary";
21169 this.right = expression(150);
21170 return this;
21171 });
21172 infix("---", function(left) {
21173 warning("W006");
21174 this.left = left;
21175 this.right = expression(130);
21176 return this;
21177 }, 130);
21178 infix("*", "mult", 140);
21179 infix("/", "div", 140);
21180 infix("%", "mod", 140);
21181
21182 suffix("++");
21183 prefix("++", "preinc");
21184 state.syntax["++"].exps = true;
21185 state.syntax["++"].ltBoundary = "before";
21186
21187 suffix("--");
21188 prefix("--", "predec");
21189 state.syntax["--"].exps = true;
21190 state.syntax["--"].ltBoundary = "before";
21191
21192 prefix("delete", function() {
21193 var p = expression(10);
21194 if (!p) {
21195 return this;
21196 }
21197
21198 if (p.id !== "." && p.id !== "[") {
21199 warning("W051");
21200 }
21201 this.first = p;
21202
21203 // The `delete` operator accepts unresolvable references when not in strict
21204 // mode, so the operand may be undefined.
21205 if (p.identifier && !state.isStrict()) {
21206 p.forgiveUndef = true;
21207 }
21208 return this;
21209 }).exps = true;
21210
21211 prefix("~", function() {
21212 if (state.option.bitwise) {
21213 warning("W016", this, "~");
21214 }
21215 this.arity = "unary";
21216 this.right = expression(150);
21217 return this;
21218 });
21219
21220 prefix("...", function() {
21221 if (!state.inES6(true)) {
21222 warning("W119", this, "spread/rest operator", "6");
21223 }
21224
21225 // TODO: Allow all AssignmentExpression
21226 // once parsing permits.
21227 //
21228 // How to handle eg. number, boolean when the built-in
21229 // prototype of may have an @@iterator definition?
21230 //
21231 // Number.prototype[Symbol.iterator] = function * () {
21232 // yield this.valueOf();
21233 // };
21234 //
21235 // var a = [ ...1 ];
21236 // console.log(a); // [1];
21237 //
21238 // for (let n of [...10]) {
21239 // console.log(n);
21240 // }
21241 // // 10
21242 //
21243 //
21244 // Boolean.prototype[Symbol.iterator] = function * () {
21245 // yield this.valueOf();
21246 // };
21247 //
21248 // var a = [ ...true ];
21249 // console.log(a); // [true];
21250 //
21251 // for (let n of [...false]) {
21252 // console.log(n);
21253 // }
21254 // // false
21255 //
21256 if (!state.tokens.next.identifier &&
21257 state.tokens.next.type !== "(string)" &&
21258 !checkPunctuators(state.tokens.next, ["[", "("])) {
21259
21260 error("E030", state.tokens.next, state.tokens.next.value);
21261 }
21262 this.right = expression(150);
21263 return this;
21264 });
21265
21266 prefix("!", function() {
21267 this.arity = "unary";
21268 this.right = expression(150);
21269
21270 if (!this.right) { // '!' followed by nothing? Give up.
21271 quit("E041", this);
21272 }
21273
21274 if (bang[this.right.id] === true) {
21275 warning("W018", this, "!");
21276 }
21277 return this;
21278 });
21279
21280 prefix("typeof", (function() {
21281 var p = expression(150);
21282 this.first = this.right = p;
21283
21284 if (!p) { // 'typeof' followed by nothing? Give up.
21285 quit("E041", this);
21286 }
21287
21288 // The `typeof` operator accepts unresolvable references, so the operand
21289 // may be undefined.
21290 if (p.identifier) {
21291 p.forgiveUndef = true;
21292 }
21293 return this;
21294 }));
21295 prefix("new", function() {
21296 var mp = metaProperty("target", function() {
21297 if (!state.inES6(true)) {
21298 warning("W119", state.tokens.prev, "new.target", "6");
21299 }
21300 var inFunction, c = state.funct;
21301 while (c) {
21302 inFunction = !c["(global)"];
21303 if (!c["(arrow)"]) { break; }
21304 c = c["(context)"];
21305 }
21306 if (!inFunction) {
21307 warning("W136", state.tokens.prev, "new.target");
21308 }
21309 });
21310 if (mp) { return mp; }
21311
21312 var c = expression(155), i;
21313 if (c && c.id !== "function") {
21314 if (c.identifier) {
21315 c["new"] = true;
21316 switch (c.value) {
21317 case "Number":
21318 case "String":
21319 case "Boolean":
21320 case "Math":
21321 case "JSON":
21322 warning("W053", state.tokens.prev, c.value);
21323 break;
21324 case "Symbol":
21325 if (state.inES6()) {
21326 warning("W053", state.tokens.prev, c.value);
21327 }
21328 break;
21329 case "Function":
21330 if (!state.option.evil) {
21331 warning("W054");
21332 }
21333 break;
21334 case "Date":
21335 case "RegExp":
21336 case "this":
21337 break;
21338 default:
21339 if (c.id !== "function") {
21340 i = c.value.substr(0, 1);
21341 if (state.option.newcap && (i < "A" || i > "Z") &&
21342 !state.funct["(scope)"].isPredefined(c.value)) {
21343 warning("W055", state.tokens.curr);
21344 }
21345 }
21346 }
21347 } else {
21348 if (c.id !== "." && c.id !== "[" && c.id !== "(") {
21349 warning("W056", state.tokens.curr);
21350 }
21351 }
21352 } else {
21353 if (!state.option.supernew)
21354 warning("W057", this);
21355 }
21356 if (state.tokens.next.id !== "(" && !state.option.supernew) {
21357 warning("W058", state.tokens.curr, state.tokens.curr.value);
21358 }
21359 this.first = this.right = c;
21360 return this;
21361 });
21362 state.syntax["new"].exps = true;
21363
21364 prefix("void").exps = true;
21365
21366 infix(".", function(left, that) {
21367 var m = identifier(false, true);
21368
21369 if (typeof m === "string") {
21370 countMember(m);
21371 }
21372
21373 that.left = left;
21374 that.right = m;
21375
21376 if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") {
21377 warning("W001");
21378 }
21379
21380 if (left && left.value === "arguments" && (m === "callee" || m === "caller")) {
21381 if (state.option.noarg)
21382 warning("W059", left, m);
21383 else if (state.isStrict())
21384 error("E008");
21385 } else if (!state.option.evil && left && left.value === "document" &&
21386 (m === "write" || m === "writeln")) {
21387 warning("W060", left);
21388 }
21389
21390 if (!state.option.evil && (m === "eval" || m === "execScript")) {
21391 if (isGlobalEval(left, state)) {
21392 warning("W061");
21393 }
21394 }
21395
21396 return that;
21397 }, 160, true);
21398
21399 infix("(", function(left, that) {
21400 if (state.option.immed && left && !left.immed && left.id === "function") {
21401 warning("W062");
21402 }
21403
21404 var n = 0;
21405 var p = [];
21406
21407 if (left) {
21408 if (left.type === "(identifier)") {
21409 if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {
21410 if ("Array Number String Boolean Date Object Error Symbol".indexOf(left.value) === -1) {
21411 if (left.value === "Math") {
21412 warning("W063", left);
21413 } else if (state.option.newcap) {
21414 warning("W064", left);
21415 }
21416 }
21417 }
21418 }
21419 }
21420
21421 if (state.tokens.next.id !== ")") {
21422 for (;;) {
21423 p[p.length] = expression(10);
21424 n += 1;
21425 if (state.tokens.next.id !== ",") {
21426 break;
21427 }
21428 parseComma();
21429 }
21430 }
21431
21432 advance(")");
21433
21434 if (typeof left === "object") {
21435 if (!state.inES5() && left.value === "parseInt" && n === 1) {
21436 warning("W065", state.tokens.curr);
21437 }
21438 if (!state.option.evil) {
21439 if (left.value === "eval" || left.value === "Function" ||
21440 left.value === "execScript") {
21441 warning("W061", left);
21442
21443 // This conditional expression was initially implemented with a typo
21444 // which prevented the branch's execution in all cases. While
21445 // enabling the code will produce behavior that is consistent with
21446 // the other forms of code evaluation that follow, such a change is
21447 // also technically incompatable with prior versions of JSHint (due
21448 // to the fact that the behavior was never formally documented). This
21449 // branch should be enabled as part of a major release.
21450 //if (p[0] && p[0].id === "(string)") {
21451 // addEvalCode(left, p[0]);
21452 //}
21453 } else if (p[0] && p[0].id === "(string)" &&
21454 (left.value === "setTimeout" ||
21455 left.value === "setInterval")) {
21456 warning("W066", left);
21457 addEvalCode(left, p[0]);
21458
21459 // window.setTimeout/setInterval
21460 } else if (p[0] && p[0].id === "(string)" &&
21461 left.value === "." &&
21462 left.left.value === "window" &&
21463 (left.right === "setTimeout" ||
21464 left.right === "setInterval")) {
21465 warning("W066", left);
21466 addEvalCode(left, p[0]);
21467 }
21468 }
21469 if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "=>" &&
21470 left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?" &&
21471 !(state.inES6() && left["(name)"])) {
21472 warning("W067", that);
21473 }
21474 }
21475
21476 that.left = left;
21477 return that;
21478 }, 155, true).exps = true;
21479
21480 prefix("(", function(rbp) {
21481 var pn = state.tokens.next, pn1, i = -1;
21482 var ret, triggerFnExpr, first, last;
21483 var parens = 1;
21484 var opening = state.tokens.curr;
21485 var preceeding = state.tokens.prev;
21486 var isNecessary = !state.option.singleGroups;
21487
21488 do {
21489 if (pn.value === "(") {
21490 parens += 1;
21491 } else if (pn.value === ")") {
21492 parens -= 1;
21493 }
21494
21495 i += 1;
21496 pn1 = pn;
21497 pn = peek(i);
21498 } while (!(parens === 0 && pn1.value === ")") && pn.type !== "(end)");
21499
21500 if (state.tokens.next.id === "function") {
21501 triggerFnExpr = state.tokens.next.immed = true;
21502 }
21503
21504 // If the balanced grouping operator is followed by a "fat arrow", the
21505 // current token marks the beginning of a "fat arrow" function and parsing
21506 // should proceed accordingly.
21507 if (pn.value === "=>") {
21508 return doFunction({ type: "arrow", parsedOpening: true });
21509 }
21510
21511 var exprs = [];
21512
21513 if (state.tokens.next.id !== ")") {
21514 for (;;) {
21515 exprs.push(expression(10));
21516
21517 if (state.tokens.next.id !== ",") {
21518 break;
21519 }
21520
21521 if (state.option.nocomma) {
21522 warning("W127");
21523 }
21524
21525 parseComma();
21526 }
21527 }
21528
21529 advance(")", this);
21530 if (state.option.immed && exprs[0] && exprs[0].id === "function") {
21531 if (state.tokens.next.id !== "(" &&
21532 state.tokens.next.id !== "." && state.tokens.next.id !== "[") {
21533 warning("W068", this);
21534 }
21535 }
21536
21537 if (!exprs.length) {
21538 return;
21539 }
21540 if (exprs.length > 1) {
21541 ret = Object.create(state.syntax[","]);
21542 ret.exprs = exprs;
21543
21544 first = exprs[0];
21545 last = exprs[exprs.length - 1];
21546 } else {
21547 ret = first = last = exprs[0];
21548
21549 if (!isNecessary) {
21550 isNecessary =
21551 // Used to distinguish from an ExpressionStatement which may not
21552 // begin with the `{` and `function` tokens
21553 (opening.beginsStmt && (ret.id === "{" || triggerFnExpr || isFunctor(ret))) ||
21554 // Used to signal that a function expression is being supplied to
21555 // some other operator.
21556 (triggerFnExpr &&
21557 // For parenthesis wrapping a function expression to be considered
21558 // necessary, the grouping operator should be the left-hand-side of
21559 // some other operator--either within the parenthesis or directly
21560 // following them.
21561 (!isEndOfExpr() || state.tokens.prev.id !== "}")) ||
21562 // Used to demarcate an arrow function as the left-hand side of some
21563 // operator.
21564 (isFunctor(ret) && !isEndOfExpr()) ||
21565 // Used as the return value of a single-statement arrow function
21566 (ret.id === "{" && preceeding.id === "=>") ||
21567 // Used to delineate an integer number literal from a dereferencing
21568 // punctuator (otherwise interpreted as a decimal point)
21569 (ret.type === "(number)" &&
21570 checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)) ||
21571 // Used to wrap object destructuring assignment
21572 (opening.beginsStmt && ret.id === "=" && ret.left.id === "{");
21573 }
21574 }
21575
21576 if (ret) {
21577 // The operator may be necessary to override the default binding power of
21578 // neighboring operators (whenever there is an operator in use within the
21579 // first expression *or* the current group contains multiple expressions)
21580 if (!isNecessary && (isOperator(first) || ret.exprs)) {
21581 isNecessary =
21582 (rbp > first.lbp) ||
21583 (rbp > 0 && rbp === first.lbp) ||
21584 (!isEndOfExpr() && last.lbp < state.tokens.next.lbp);
21585 }
21586
21587 if (!isNecessary) {
21588 warning("W126", opening);
21589 }
21590
21591 ret.paren = true;
21592 }
21593
21594 return ret;
21595 });
21596
21597 application("=>");
21598
21599 infix("[", function(left, that) {
21600 var e = expression(10), s;
21601 if (e && e.type === "(string)") {
21602 if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) {
21603 if (isGlobalEval(left, state)) {
21604 warning("W061");
21605 }
21606 }
21607
21608 countMember(e.value);
21609 if (!state.option.sub && reg.identifier.test(e.value)) {
21610 s = state.syntax[e.value];
21611 if (!s || !isReserved(s)) {
21612 warning("W069", state.tokens.prev, e.value);
21613 }
21614 }
21615 }
21616 advance("]", that);
21617
21618 if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") {
21619 warning("W001");
21620 }
21621
21622 that.left = left;
21623 that.right = e;
21624 return that;
21625 }, 160, true);
21626
21627 function comprehensiveArrayExpression() {
21628 var res = {};
21629 res.exps = true;
21630 state.funct["(comparray)"].stack();
21631
21632 // Handle reversed for expressions, used in spidermonkey
21633 var reversed = false;
21634 if (state.tokens.next.value !== "for") {
21635 reversed = true;
21636 if (!state.inMoz()) {
21637 warning("W116", state.tokens.next, "for", state.tokens.next.value);
21638 }
21639 state.funct["(comparray)"].setState("use");
21640 res.right = expression(10);
21641 }
21642
21643 advance("for");
21644 if (state.tokens.next.value === "each") {
21645 advance("each");
21646 if (!state.inMoz()) {
21647 warning("W118", state.tokens.curr, "for each");
21648 }
21649 }
21650 advance("(");
21651 state.funct["(comparray)"].setState("define");
21652 res.left = expression(130);
21653 if (_.contains(["in", "of"], state.tokens.next.value)) {
21654 advance();
21655 } else {
21656 error("E045", state.tokens.curr);
21657 }
21658 state.funct["(comparray)"].setState("generate");
21659 expression(10);
21660
21661 advance(")");
21662 if (state.tokens.next.value === "if") {
21663 advance("if");
21664 advance("(");
21665 state.funct["(comparray)"].setState("filter");
21666 res.filter = expression(10);
21667 advance(")");
21668 }
21669
21670 if (!reversed) {
21671 state.funct["(comparray)"].setState("use");
21672 res.right = expression(10);
21673 }
21674
21675 advance("]");
21676 state.funct["(comparray)"].unstack();
21677 return res;
21678 }
21679
21680 prefix("[", function() {
21681 var blocktype = lookupBlockType();
21682 if (blocktype.isCompArray) {
21683 if (!state.option.esnext && !state.inMoz()) {
21684 warning("W118", state.tokens.curr, "array comprehension");
21685 }
21686 return comprehensiveArrayExpression();
21687 } else if (blocktype.isDestAssign) {
21688 this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true });
21689 return this;
21690 }
21691 var b = state.tokens.curr.line !== startLine(state.tokens.next);
21692 this.first = [];
21693 if (b) {
21694 indent += state.option.indent;
21695 if (state.tokens.next.from === indent + state.option.indent) {
21696 indent += state.option.indent;
21697 }
21698 }
21699 while (state.tokens.next.id !== "(end)") {
21700 while (state.tokens.next.id === ",") {
21701 if (!state.option.elision) {
21702 if (!state.inES5()) {
21703 // Maintain compat with old options --- ES5 mode without
21704 // elision=true will warn once per comma
21705 warning("W070");
21706 } else {
21707 warning("W128");
21708 do {
21709 advance(",");
21710 } while (state.tokens.next.id === ",");
21711 continue;
21712 }
21713 }
21714 advance(",");
21715 }
21716
21717 if (state.tokens.next.id === "]") {
21718 break;
21719 }
21720
21721 this.first.push(expression(10));
21722 if (state.tokens.next.id === ",") {
21723 parseComma({ allowTrailing: true });
21724 if (state.tokens.next.id === "]" && !state.inES5()) {
21725 warning("W070", state.tokens.curr);
21726 break;
21727 }
21728 } else {
21729 if (state.option.trailingcomma && state.inES5()) {
21730 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
21731 }
21732 break;
21733 }
21734 }
21735 if (b) {
21736 indent -= state.option.indent;
21737 }
21738 advance("]", this);
21739 return this;
21740 });
21741
21742
21743 function isMethod() {
21744 return state.funct["(statement)"] && state.funct["(statement)"].type === "class" ||
21745 state.funct["(context)"] && state.funct["(context)"]["(verb)"] === "class";
21746 }
21747
21748
21749 function isPropertyName(token) {
21750 return token.identifier || token.id === "(string)" || token.id === "(number)";
21751 }
21752
21753
21754 function propertyName(preserveOrToken) {
21755 var id;
21756 var preserve = true;
21757 if (typeof preserveOrToken === "object") {
21758 id = preserveOrToken;
21759 } else {
21760 preserve = preserveOrToken;
21761 id = optionalidentifier(false, true, preserve);
21762 }
21763
21764 if (!id) {
21765 if (state.tokens.next.id === "(string)") {
21766 id = state.tokens.next.value;
21767 if (!preserve) {
21768 advance();
21769 }
21770 } else if (state.tokens.next.id === "(number)") {
21771 id = state.tokens.next.value.toString();
21772 if (!preserve) {
21773 advance();
21774 }
21775 }
21776 } else if (typeof id === "object") {
21777 if (id.id === "(string)" || id.id === "(identifier)") id = id.value;
21778 else if (id.id === "(number)") id = id.value.toString();
21779 }
21780
21781 if (id === "hasOwnProperty") {
21782 warning("W001");
21783 }
21784
21785 return id;
21786 }
21787
21788 /**
21789 * @param {Object} [options]
21790 * @param {token} [options.loneArg] The argument to the function in cases
21791 * where it was defined using the
21792 * single-argument shorthand.
21793 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
21794 * already been parsed.
21795 * @returns {{ arity: number, params: Array.<string>}}
21796 */
21797 function functionparams(options) {
21798 var next;
21799 var paramsIds = [];
21800 var ident;
21801 var tokens = [];
21802 var t;
21803 var pastDefault = false;
21804 var pastRest = false;
21805 var arity = 0;
21806 var loneArg = options && options.loneArg;
21807
21808 if (loneArg && loneArg.identifier === true) {
21809 state.funct["(scope)"].addParam(loneArg.value, loneArg);
21810 return { arity: 1, params: [ loneArg.value ] };
21811 }
21812
21813 next = state.tokens.next;
21814
21815 if (!options || !options.parsedOpening) {
21816 advance("(");
21817 }
21818
21819 if (state.tokens.next.id === ")") {
21820 advance(")");
21821 return;
21822 }
21823
21824 function addParam(addParamArgs) {
21825 state.funct["(scope)"].addParam.apply(state.funct["(scope)"], addParamArgs);
21826 }
21827
21828 for (;;) {
21829 arity++;
21830 // are added to the param scope
21831 var currentParams = [];
21832
21833 if (_.contains(["{", "["], state.tokens.next.id)) {
21834 tokens = destructuringPattern();
21835 for (t in tokens) {
21836 t = tokens[t];
21837 if (t.id) {
21838 paramsIds.push(t.id);
21839 currentParams.push([t.id, t.token]);
21840 }
21841 }
21842 } else {
21843 if (checkPunctuator(state.tokens.next, "...")) pastRest = true;
21844 ident = identifier(true);
21845 if (ident) {
21846 paramsIds.push(ident);
21847 currentParams.push([ident, state.tokens.curr]);
21848 } else {
21849 // Skip invalid parameter.
21850 while (!checkPunctuators(state.tokens.next, [",", ")"])) advance();
21851 }
21852 }
21853
21854 // It is valid to have a regular argument after a default argument
21855 // since undefined can be used for missing parameters. Still warn as it is
21856 // a possible code smell.
21857 if (pastDefault) {
21858 if (state.tokens.next.id !== "=") {
21859 error("W138", state.tokens.current);
21860 }
21861 }
21862 if (state.tokens.next.id === "=") {
21863 if (!state.inES6()) {
21864 warning("W119", state.tokens.next, "default parameters", "6");
21865 }
21866 advance("=");
21867 pastDefault = true;
21868 expression(10);
21869 }
21870
21871 // now we have evaluated the default expression, add the variable to the param scope
21872 currentParams.forEach(addParam);
21873
21874 if (state.tokens.next.id === ",") {
21875 if (pastRest) {
21876 warning("W131", state.tokens.next);
21877 }
21878 parseComma();
21879 } else {
21880 advance(")", next);
21881 return { arity: arity, params: paramsIds };
21882 }
21883 }
21884 }
21885
21886 function functor(name, token, overwrites) {
21887 var funct = {
21888 "(name)" : name,
21889 "(breakage)" : 0,
21890 "(loopage)" : 0,
21891 "(tokens)" : {},
21892 "(properties)": {},
21893
21894 "(catch)" : false,
21895 "(global)" : false,
21896
21897 "(line)" : null,
21898 "(character)" : null,
21899 "(metrics)" : null,
21900 "(statement)" : null,
21901 "(context)" : null,
21902 "(scope)" : null,
21903 "(comparray)" : null,
21904 "(generator)" : null,
21905 "(arrow)" : null,
21906 "(params)" : null
21907 };
21908
21909 if (token) {
21910 _.extend(funct, {
21911 "(line)" : token.line,
21912 "(character)": token.character,
21913 "(metrics)" : createMetrics(token)
21914 });
21915 }
21916
21917 _.extend(funct, overwrites);
21918
21919 if (funct["(context)"]) {
21920 funct["(scope)"] = funct["(context)"]["(scope)"];
21921 funct["(comparray)"] = funct["(context)"]["(comparray)"];
21922 }
21923
21924 return funct;
21925 }
21926
21927 function isFunctor(token) {
21928 return "(scope)" in token;
21929 }
21930
21931 /**
21932 * Determine if the parser has begun parsing executable code.
21933 *
21934 * @param {Token} funct - The current "functor" token
21935 *
21936 * @returns {boolean}
21937 */
21938 function hasParsedCode(funct) {
21939 return funct["(global)"] && !funct["(verb)"];
21940 }
21941
21942 /**
21943 * This function is used as both a null-denotation method *and* a
21944 * left-denotation method, meaning the first parameter is overloaded.
21945 */
21946 function doTemplateLiteral(leftOrRbp) {
21947 // ASSERT: this.type === "(template)"
21948 // jshint validthis: true
21949 var ctx = this.context;
21950 var noSubst = this.noSubst;
21951 var depth = this.depth;
21952 var left = typeof leftOrRbp === "number" ? null : leftOrRbp;
21953
21954 if (!noSubst) {
21955 while (!end()) {
21956 if (!state.tokens.next.template || state.tokens.next.depth > depth) {
21957 expression(0); // should probably have different rbp?
21958 } else {
21959 // skip template start / middle
21960 advance();
21961 }
21962 }
21963 }
21964
21965 return {
21966 id: "(template)",
21967 type: "(template)",
21968 tag: left
21969 };
21970
21971 function end() {
21972 if (state.tokens.curr.template && state.tokens.curr.tail &&
21973 state.tokens.curr.context === ctx) return true;
21974 var complete = (state.tokens.next.template && state.tokens.next.tail &&
21975 state.tokens.next.context === ctx);
21976 if (complete) advance();
21977 return complete || state.tokens.next.isUnclosed;
21978 }
21979 }
21980
21981 /**
21982 * @param {Object} [options]
21983 * @param {token} [options.name] The identifier belonging to the function (if
21984 * any)
21985 * @param {boolean} [options.statement] The statement that triggered creation
21986 * of the current function.
21987 * @param {string} [options.type] If specified, either "generator" or "arrow"
21988 * @param {token} [options.loneArg] The argument to the function in cases
21989 * where it was defined using the
21990 * single-argument shorthand
21991 * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
21992 * already been parsed
21993 * @param {token} [options.classExprBinding] Define a function with this
21994 * identifier in the new function's
21995 * scope, mimicking the bahavior of
21996 * class expression names within
21997 * the body of member functions.
21998 */
21999 function doFunction(options) {
22000 var f, token, name, statement, classExprBinding, isGenerator, isArrow, ignoreLoopFunc;
22001 var oldOption = state.option;
22002 var oldIgnored = state.ignored;
22003
22004 if (options) {
22005 name = options.name;
22006 statement = options.statement;
22007 classExprBinding = options.classExprBinding;
22008 isGenerator = options.type === "generator";
22009 isArrow = options.type === "arrow";
22010 ignoreLoopFunc = options.ignoreLoopFunc;
22011 }
22012
22013 state.option = Object.create(state.option);
22014 state.ignored = Object.create(state.ignored);
22015
22016 state.funct = functor(name || state.nameStack.infer(), state.tokens.next, {
22017 "(statement)": statement,
22018 "(context)": state.funct,
22019 "(arrow)": isArrow,
22020 "(generator)": isGenerator
22021 });
22022
22023 f = state.funct;
22024 token = state.tokens.curr;
22025 token.funct = state.funct;
22026
22027 functions.push(state.funct);
22028
22029 // So that the function is available to itself and referencing itself is not
22030 // seen as a closure, add the function name to a new scope, but do not
22031 // test for unused (unused: false)
22032 // it is a new block scope so that params can override it, it can be block scoped
22033 // but declarations inside the function don't cause already declared error
22034 state.funct["(scope)"].stack("functionouter");
22035 var internallyAccessibleName = name || classExprBinding;
22036 if (internallyAccessibleName) {
22037 state.funct["(scope)"].block.add(internallyAccessibleName,
22038 classExprBinding ? "class" : "function", state.tokens.curr, false);
22039 }
22040
22041 // create the param scope (params added in functionparams)
22042 state.funct["(scope)"].stack("functionparams");
22043
22044 var paramsInfo = functionparams(options);
22045
22046 if (paramsInfo) {
22047 state.funct["(params)"] = paramsInfo.params;
22048 state.funct["(metrics)"].arity = paramsInfo.arity;
22049 state.funct["(metrics)"].verifyMaxParametersPerFunction();
22050 } else {
22051 state.funct["(metrics)"].arity = 0;
22052 }
22053
22054 if (isArrow) {
22055 if (!state.inES6(true)) {
22056 warning("W119", state.tokens.curr, "arrow function syntax (=>)", "6");
22057 }
22058
22059 if (!options.loneArg) {
22060 advance("=>");
22061 }
22062 }
22063
22064 block(false, true, true, isArrow);
22065
22066 if (!state.option.noyield && isGenerator &&
22067 state.funct["(generator)"] !== "yielded") {
22068 warning("W124", state.tokens.curr);
22069 }
22070
22071 state.funct["(metrics)"].verifyMaxStatementsPerFunction();
22072 state.funct["(metrics)"].verifyMaxComplexityPerFunction();
22073 state.funct["(unusedOption)"] = state.option.unused;
22074 state.option = oldOption;
22075 state.ignored = oldIgnored;
22076 state.funct["(last)"] = state.tokens.curr.line;
22077 state.funct["(lastcharacter)"] = state.tokens.curr.character;
22078
22079 // unstack the params scope
22080 state.funct["(scope)"].unstack(); // also does usage and label checks
22081
22082 // unstack the function outer stack
22083 state.funct["(scope)"].unstack();
22084
22085 state.funct = state.funct["(context)"];
22086
22087 if (!ignoreLoopFunc && !state.option.loopfunc && state.funct["(loopage)"]) {
22088 // If the function we just parsed accesses any non-local variables
22089 // trigger a warning. Otherwise, the function is safe even within
22090 // a loop.
22091 if (f["(isCapturing)"]) {
22092 warning("W083", token);
22093 }
22094 }
22095
22096 return f;
22097 }
22098
22099 function createMetrics(functionStartToken) {
22100 return {
22101 statementCount: 0,
22102 nestedBlockDepth: -1,
22103 ComplexityCount: 1,
22104 arity: 0,
22105
22106 verifyMaxStatementsPerFunction: function() {
22107 if (state.option.maxstatements &&
22108 this.statementCount > state.option.maxstatements) {
22109 warning("W071", functionStartToken, this.statementCount);
22110 }
22111 },
22112
22113 verifyMaxParametersPerFunction: function() {
22114 if (_.isNumber(state.option.maxparams) &&
22115 this.arity > state.option.maxparams) {
22116 warning("W072", functionStartToken, this.arity);
22117 }
22118 },
22119
22120 verifyMaxNestedBlockDepthPerFunction: function() {
22121 if (state.option.maxdepth &&
22122 this.nestedBlockDepth > 0 &&
22123 this.nestedBlockDepth === state.option.maxdepth + 1) {
22124 warning("W073", null, this.nestedBlockDepth);
22125 }
22126 },
22127
22128 verifyMaxComplexityPerFunction: function() {
22129 var max = state.option.maxcomplexity;
22130 var cc = this.ComplexityCount;
22131 if (max && cc > max) {
22132 warning("W074", functionStartToken, cc);
22133 }
22134 }
22135 };
22136 }
22137
22138 function increaseComplexityCount() {
22139 state.funct["(metrics)"].ComplexityCount += 1;
22140 }
22141
22142 // Parse assignments that were found instead of conditionals.
22143 // For example: if (a = 1) { ... }
22144
22145 function checkCondAssignment(expr) {
22146 var id, paren;
22147 if (expr) {
22148 id = expr.id;
22149 paren = expr.paren;
22150 if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) {
22151 id = expr.id;
22152 paren = paren || expr.paren;
22153 }
22154 }
22155 switch (id) {
22156 case "=":
22157 case "+=":
22158 case "-=":
22159 case "*=":
22160 case "%=":
22161 case "&=":
22162 case "|=":
22163 case "^=":
22164 case "/=":
22165 if (!paren && !state.option.boss) {
22166 warning("W084");
22167 }
22168 }
22169 }
22170
22171 /**
22172 * @param {object} props Collection of property descriptors for a given
22173 * object.
22174 */
22175 function checkProperties(props) {
22176 // Check for lonely setters if in the ES5 mode.
22177 if (state.inES5()) {
22178 for (var name in props) {
22179 if (props[name] && props[name].setterToken && !props[name].getterToken) {
22180 warning("W078", props[name].setterToken);
22181 }
22182 }
22183 }
22184 }
22185
22186 function metaProperty(name, c) {
22187 if (checkPunctuator(state.tokens.next, ".")) {
22188 var left = state.tokens.curr.id;
22189 advance(".");
22190 var id = identifier();
22191 state.tokens.curr.isMetaProperty = true;
22192 if (name !== id) {
22193 error("E057", state.tokens.prev, left, id);
22194 } else {
22195 c();
22196 }
22197 return state.tokens.curr;
22198 }
22199 }
22200
22201 (function(x) {
22202 x.nud = function() {
22203 var b, f, i, p, t, isGeneratorMethod = false, nextVal;
22204 var props = Object.create(null); // All properties, including accessors
22205
22206 b = state.tokens.curr.line !== startLine(state.tokens.next);
22207 if (b) {
22208 indent += state.option.indent;
22209 if (state.tokens.next.from === indent + state.option.indent) {
22210 indent += state.option.indent;
22211 }
22212 }
22213
22214 var blocktype = lookupBlockType();
22215 if (blocktype.isDestAssign) {
22216 this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true });
22217 return this;
22218 }
22219
22220 for (;;) {
22221 if (state.tokens.next.id === "}") {
22222 break;
22223 }
22224
22225 nextVal = state.tokens.next.value;
22226 if (state.tokens.next.identifier &&
22227 (peekIgnoreEOL().id === "," || peekIgnoreEOL().id === "}")) {
22228 if (!state.inES6()) {
22229 warning("W104", state.tokens.next, "object short notation", "6");
22230 }
22231 i = propertyName(true);
22232 saveProperty(props, i, state.tokens.next);
22233
22234 expression(10);
22235
22236 } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) {
22237 advance(nextVal);
22238
22239 if (!state.inES5()) {
22240 error("E034");
22241 }
22242
22243 i = propertyName();
22244
22245 // ES6 allows for get() {...} and set() {...} method
22246 // definition shorthand syntax, so we don't produce an error
22247 // if linting ECMAScript 6 code.
22248 if (!i && !state.inES6()) {
22249 error("E035");
22250 }
22251
22252 // We don't want to save this getter unless it's an actual getter
22253 // and not an ES6 concise method
22254 if (i) {
22255 saveAccessor(nextVal, props, i, state.tokens.curr);
22256 }
22257
22258 t = state.tokens.next;
22259 f = doFunction();
22260 p = f["(params)"];
22261
22262 // Don't warn about getter/setter pairs if this is an ES6 concise method
22263 if (nextVal === "get" && i && p) {
22264 warning("W076", t, p[0], i);
22265 } else if (nextVal === "set" && i && f["(metrics)"].arity !== 1) {
22266 warning("W077", t, i);
22267 }
22268 } else {
22269 if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") {
22270 if (!state.inES6()) {
22271 warning("W104", state.tokens.next, "generator functions", "6");
22272 }
22273 advance("*");
22274 isGeneratorMethod = true;
22275 } else {
22276 isGeneratorMethod = false;
22277 }
22278
22279 if (state.tokens.next.id === "[") {
22280 i = computedPropertyName();
22281 state.nameStack.set(i);
22282 } else {
22283 state.nameStack.set(state.tokens.next);
22284 i = propertyName();
22285 saveProperty(props, i, state.tokens.next);
22286
22287 if (typeof i !== "string") {
22288 break;
22289 }
22290 }
22291
22292 if (state.tokens.next.value === "(") {
22293 if (!state.inES6()) {
22294 warning("W104", state.tokens.curr, "concise methods", "6");
22295 }
22296 doFunction({ type: isGeneratorMethod ? "generator" : null });
22297 } else {
22298 advance(":");
22299 expression(10);
22300 }
22301 }
22302
22303 countMember(i);
22304
22305 if (state.tokens.next.id === ",") {
22306 parseComma({ allowTrailing: true, property: true });
22307 if (state.tokens.next.id === ",") {
22308 warning("W070", state.tokens.curr);
22309 } else if (state.tokens.next.id === "}" && !state.inES5()) {
22310 warning("W070", state.tokens.curr);
22311 }
22312 } else {
22313 if (state.option.trailingcomma && state.inES5()) {
22314 warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
22315 }
22316 break;
22317 }
22318 }
22319 if (b) {
22320 indent -= state.option.indent;
22321 }
22322 advance("}", this);
22323
22324 checkProperties(props);
22325
22326 return this;
22327 };
22328 x.fud = function() {
22329 error("E036", state.tokens.curr);
22330 };
22331 }(delim("{")));
22332
22333 function destructuringPattern(options) {
22334 var isAssignment = options && options.assignment;
22335
22336 if (!state.inES6()) {
22337 warning("W104", state.tokens.curr,
22338 isAssignment ? "destructuring assignment" : "destructuring binding", "6");
22339 }
22340
22341 return destructuringPatternRecursive(options);
22342 }
22343
22344 function destructuringPatternRecursive(options) {
22345 var ids;
22346 var identifiers = [];
22347 var openingParsed = options && options.openingParsed;
22348 var isAssignment = options && options.assignment;
22349 var recursiveOptions = isAssignment ? { assignment: isAssignment } : null;
22350 var firstToken = openingParsed ? state.tokens.curr : state.tokens.next;
22351
22352 var nextInnerDE = function() {
22353 var ident;
22354 if (checkPunctuators(state.tokens.next, ["[", "{"])) {
22355 ids = destructuringPatternRecursive(recursiveOptions);
22356 for (var id in ids) {
22357 id = ids[id];
22358 identifiers.push({ id: id.id, token: id.token });
22359 }
22360 } else if (checkPunctuator(state.tokens.next, ",")) {
22361 identifiers.push({ id: null, token: state.tokens.curr });
22362 } else if (checkPunctuator(state.tokens.next, "(")) {
22363 advance("(");
22364 nextInnerDE();
22365 advance(")");
22366 } else {
22367 var is_rest = checkPunctuator(state.tokens.next, "...");
22368
22369 if (isAssignment) {
22370 var assignTarget = expression(20);
22371 if (assignTarget) {
22372 checkLeftSideAssign(assignTarget);
22373
22374 // if the target was a simple identifier, add it to the list to return
22375 if (assignTarget.identifier) {
22376 ident = assignTarget.value;
22377 }
22378 }
22379 } else {
22380 ident = identifier();
22381 }
22382 if (ident) {
22383 identifiers.push({ id: ident, token: state.tokens.curr });
22384 }
22385 return is_rest;
22386 }
22387 return false;
22388 };
22389 var assignmentProperty = function() {
22390 var id;
22391 if (checkPunctuator(state.tokens.next, "[")) {
22392 advance("[");
22393 expression(10);
22394 advance("]");
22395 advance(":");
22396 nextInnerDE();
22397 } else if (state.tokens.next.id === "(string)" ||
22398 state.tokens.next.id === "(number)") {
22399 advance();
22400 advance(":");
22401 nextInnerDE();
22402 } else {
22403 // this id will either be the property name or the property name and the assigning identifier
22404 id = identifier();
22405 if (checkPunctuator(state.tokens.next, ":")) {
22406 advance(":");
22407 nextInnerDE();
22408 } else if (id) {
22409 // in this case we are assigning (not declaring), so check assignment
22410 if (isAssignment) {
22411 checkLeftSideAssign(state.tokens.curr);
22412 }
22413 identifiers.push({ id: id, token: state.tokens.curr });
22414 }
22415 }
22416 };
22417
22418 var id, value;
22419 if (checkPunctuator(firstToken, "[")) {
22420 if (!openingParsed) {
22421 advance("[");
22422 }
22423 if (checkPunctuator(state.tokens.next, "]")) {
22424 warning("W137", state.tokens.curr);
22425 }
22426 var element_after_rest = false;
22427 while (!checkPunctuator(state.tokens.next, "]")) {
22428 if (nextInnerDE() && !element_after_rest &&
22429 checkPunctuator(state.tokens.next, ",")) {
22430 warning("W130", state.tokens.next);
22431 element_after_rest = true;
22432 }
22433 if (checkPunctuator(state.tokens.next, "=")) {
22434 if (checkPunctuator(state.tokens.prev, "...")) {
22435 advance("]");
22436 } else {
22437 advance("=");
22438 }
22439 id = state.tokens.prev;
22440 value = expression(10);
22441 if (value && value.type === "undefined") {
22442 warning("W080", id, id.value);
22443 }
22444 }
22445 if (!checkPunctuator(state.tokens.next, "]")) {
22446 advance(",");
22447 }
22448 }
22449 advance("]");
22450 } else if (checkPunctuator(firstToken, "{")) {
22451
22452 if (!openingParsed) {
22453 advance("{");
22454 }
22455 if (checkPunctuator(state.tokens.next, "}")) {
22456 warning("W137", state.tokens.curr);
22457 }
22458 while (!checkPunctuator(state.tokens.next, "}")) {
22459 assignmentProperty();
22460 if (checkPunctuator(state.tokens.next, "=")) {
22461 advance("=");
22462 id = state.tokens.prev;
22463 value = expression(10);
22464 if (value && value.type === "undefined") {
22465 warning("W080", id, id.value);
22466 }
22467 }
22468 if (!checkPunctuator(state.tokens.next, "}")) {
22469 advance(",");
22470 if (checkPunctuator(state.tokens.next, "}")) {
22471 // Trailing comma
22472 // ObjectBindingPattern: { BindingPropertyList , }
22473 break;
22474 }
22475 }
22476 }
22477 advance("}");
22478 }
22479 return identifiers;
22480 }
22481
22482 function destructuringPatternMatch(tokens, value) {
22483 var first = value.first;
22484
22485 if (!first)
22486 return;
22487
22488 _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function(val) {
22489 var token = val[0];
22490 var value = val[1];
22491
22492 if (token && value)
22493 token.first = value;
22494 else if (token && token.first && !value)
22495 warning("W080", token.first, token.first.value);
22496 });
22497 }
22498
22499 function blockVariableStatement(type, statement, context) {
22500 // used for both let and const statements
22501
22502 var prefix = context && context.prefix;
22503 var inexport = context && context.inexport;
22504 var isLet = type === "let";
22505 var isConst = type === "const";
22506 var tokens, lone, value, letblock;
22507
22508 if (!state.inES6()) {
22509 warning("W104", state.tokens.curr, type, "6");
22510 }
22511
22512 if (isLet && state.tokens.next.value === "(") {
22513 if (!state.inMoz()) {
22514 warning("W118", state.tokens.next, "let block");
22515 }
22516 advance("(");
22517 state.funct["(scope)"].stack();
22518 letblock = true;
22519 } else if (state.funct["(noblockscopedvar)"]) {
22520 error("E048", state.tokens.curr, isConst ? "Const" : "Let");
22521 }
22522
22523 statement.first = [];
22524 for (;;) {
22525 var names = [];
22526 if (_.contains(["{", "["], state.tokens.next.value)) {
22527 tokens = destructuringPattern();
22528 lone = false;
22529 } else {
22530 tokens = [ { id: identifier(), token: state.tokens.curr } ];
22531 lone = true;
22532 }
22533
22534 if (!prefix && isConst && state.tokens.next.id !== "=") {
22535 warning("E012", state.tokens.curr, state.tokens.curr.value);
22536 }
22537
22538 for (var t in tokens) {
22539 if (tokens.hasOwnProperty(t)) {
22540 t = tokens[t];
22541 if (state.funct["(scope)"].block.isGlobal()) {
22542 if (predefined[t.id] === false) {
22543 warning("W079", t.token, t.id);
22544 }
22545 }
22546 if (t.id && !state.funct["(noblockscopedvar)"]) {
22547 state.funct["(scope)"].addlabel(t.id, {
22548 type: type,
22549 token: t.token });
22550 names.push(t.token);
22551 }
22552 }
22553 }
22554
22555 if (state.tokens.next.id === "=") {
22556 advance("=");
22557 if (!prefix && peek(0).id === "=" && state.tokens.next.identifier) {
22558 warning("W120", state.tokens.next, state.tokens.next.value);
22559 }
22560 var id = state.tokens.prev;
22561 // don't accept `in` in expression if prefix is used for ForIn/Of loop.
22562 value = expression(prefix ? 120 : 10);
22563 if (!prefix && value && value.type === "undefined") {
22564 warning("W080", id, id.value);
22565 }
22566 if (lone) {
22567 tokens[0].first = value;
22568 } else {
22569 destructuringPatternMatch(names, value);
22570 }
22571 }
22572
22573 if (!prefix) {
22574 for (t in tokens) {
22575 if (tokens.hasOwnProperty(t)) {
22576 t = tokens[t];
22577 state.funct["(scope)"].initialize(t.id);
22578
22579 if (lone && inexport) {
22580 state.funct["(scope)"].setExported(t.token.value, t.token);
22581 }
22582 }
22583 }
22584 }
22585
22586 statement.first = statement.first.concat(names);
22587
22588 if (state.tokens.next.id !== ",") {
22589 break;
22590 }
22591 parseComma();
22592 }
22593 if (letblock) {
22594 advance(")");
22595 block(true, true);
22596 statement.block = true;
22597 state.funct["(scope)"].unstack();
22598 }
22599
22600 return statement;
22601 }
22602
22603 var conststatement = stmt("const", function(context) {
22604 return blockVariableStatement("const", this, context);
22605 });
22606 conststatement.exps = true;
22607
22608 var letstatement = stmt("let", function(context) {
22609 return blockVariableStatement("let", this, context);
22610 });
22611 letstatement.exps = true;
22612
22613 var varstatement = stmt("var", function(context) {
22614 var prefix = context && context.prefix;
22615 var inexport = context && context.inexport;
22616 var tokens, lone, value;
22617
22618 this.first = [];
22619 for (;;) {
22620 var names = [];
22621 if (_.contains(["{", "["], state.tokens.next.value)) {
22622 tokens = destructuringPattern();
22623 lone = false;
22624 } else {
22625 tokens = [ { id: identifier(), token: state.tokens.curr } ];
22626 lone = true;
22627 }
22628
22629 if (state.option.varstmt) {
22630 warning("W132", this);
22631 }
22632
22633 this.first = this.first.concat(names);
22634
22635 for (var t in tokens) {
22636 if (tokens.hasOwnProperty(t)) {
22637 t = tokens[t];
22638 if (state.funct["(global)"] && !state.impliedClosure()) {
22639 if (predefined[t.id] === false) {
22640 warning("W079", t.token, t.id);
22641 } else if (state.option.futurehostile === false) {
22642 if ((!state.inES5() && vars.ecmaIdentifiers[5][t.id] === false) ||
22643 (!state.inES6() && vars.ecmaIdentifiers[6][t.id] === false)) {
22644 warning("W129", t.token, t.id);
22645 }
22646 }
22647 }
22648 if (t.id) {
22649 state.funct["(scope)"].addlabel(t.id, {
22650 type: "var",
22651 token: t.token });
22652
22653 if (lone && inexport) {
22654 state.funct["(scope)"].setExported(t.id, t.token);
22655 }
22656 names.push(t.token);
22657 }
22658 }
22659 }
22660
22661 if (state.tokens.next.id === "=") {
22662 state.nameStack.set(state.tokens.curr);
22663
22664 advance("=");
22665 if (peek(0).id === "=" && state.tokens.next.identifier) {
22666 if (!prefix &&
22667 !state.funct["(params)"] ||
22668 state.funct["(params)"].indexOf(state.tokens.next.value) === -1) {
22669 warning("W120", state.tokens.next, state.tokens.next.value);
22670 }
22671 }
22672 var id = state.tokens.prev;
22673 // don't accept `in` in expression if prefix is used for ForIn/Of loop.
22674 value = expression(prefix ? 120 : 10);
22675 if (value && !prefix && !state.funct["(loopage)"] && value.type === "undefined") {
22676 warning("W080", id, id.value);
22677 }
22678 if (lone) {
22679 tokens[0].first = value;
22680 } else {
22681 destructuringPatternMatch(names, value);
22682 }
22683 }
22684
22685 if (state.tokens.next.id !== ",") {
22686 break;
22687 }
22688 parseComma();
22689 }
22690
22691 return this;
22692 });
22693 varstatement.exps = true;
22694
22695 blockstmt("class", function(rbp) {
22696 return classdef.call(this, rbp, true);
22697 });
22698
22699 function classdef(rbp, isStatement) {
22700
22701 /*jshint validthis:true */
22702 if (!state.inES6()) {
22703 warning("W104", state.tokens.curr, "class", "6");
22704 }
22705 if (isStatement) {
22706 // BindingIdentifier
22707 this.name = identifier();
22708
22709 state.funct["(scope)"].addlabel(this.name, {
22710 type: "class",
22711 token: state.tokens.curr });
22712
22713 } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") {
22714 // BindingIdentifier(opt)
22715 this.name = identifier();
22716 this.namedExpr = true;
22717 } else {
22718 this.name = state.nameStack.infer();
22719 }
22720
22721 classtail(this);
22722
22723 if (isStatement) {
22724 state.funct["(scope)"].initialize(this.name);
22725 }
22726
22727 return this;
22728 }
22729
22730 function classtail(c) {
22731 var wasInClassBody = state.inClassBody;
22732 // ClassHeritage(opt)
22733 if (state.tokens.next.value === "extends") {
22734 advance("extends");
22735 c.heritage = expression(10);
22736 }
22737
22738 state.inClassBody = true;
22739 advance("{");
22740 // ClassBody(opt)
22741 c.body = classbody(c);
22742 advance("}");
22743 state.inClassBody = wasInClassBody;
22744 }
22745
22746 function classbody(c) {
22747 var name;
22748 var isStatic;
22749 var isGenerator;
22750 var getset;
22751 var props = Object.create(null);
22752 var staticProps = Object.create(null);
22753 var computed;
22754 for (var i = 0; state.tokens.next.id !== "}"; ++i) {
22755 name = state.tokens.next;
22756 isStatic = false;
22757 isGenerator = false;
22758 getset = null;
22759
22760 // The ES6 grammar for ClassElement includes the `;` token, but it is
22761 // defined only as a placeholder to facilitate future language
22762 // extensions. In ES6 code, it serves no purpose.
22763 if (name.id === ";") {
22764 warning("W032");
22765 advance(";");
22766 continue;
22767 }
22768
22769 if (name.id === "*") {
22770 isGenerator = true;
22771 advance("*");
22772 name = state.tokens.next;
22773 }
22774 if (name.id === "[") {
22775 name = computedPropertyName();
22776 computed = true;
22777 } else if (isPropertyName(name)) {
22778 // Non-Computed PropertyName
22779 advance();
22780 computed = false;
22781 if (name.identifier && name.value === "static") {
22782 if (checkPunctuator(state.tokens.next, "*")) {
22783 isGenerator = true;
22784 advance("*");
22785 }
22786 if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") {
22787 computed = state.tokens.next.id === "[";
22788 isStatic = true;
22789 name = state.tokens.next;
22790 if (state.tokens.next.id === "[") {
22791 name = computedPropertyName();
22792 } else advance();
22793 }
22794 }
22795
22796 if (name.identifier && (name.value === "get" || name.value === "set")) {
22797 if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") {
22798 computed = state.tokens.next.id === "[";
22799 getset = name;
22800 name = state.tokens.next;
22801 if (state.tokens.next.id === "[") {
22802 name = computedPropertyName();
22803 } else advance();
22804 }
22805 }
22806 } else {
22807 warning("W052", state.tokens.next, state.tokens.next.value || state.tokens.next.type);
22808 advance();
22809 continue;
22810 }
22811
22812 if (!checkPunctuator(state.tokens.next, "(")) {
22813 // error --- class properties must be methods
22814 error("E054", state.tokens.next, state.tokens.next.value);
22815 while (state.tokens.next.id !== "}" &&
22816 !checkPunctuator(state.tokens.next, "(")) {
22817 advance();
22818 }
22819 if (state.tokens.next.value !== "(") {
22820 doFunction({ statement: c });
22821 }
22822 }
22823
22824 if (!computed) {
22825 // We don't know how to determine if we have duplicate computed property names :(
22826 if (getset) {
22827 saveAccessor(
22828 getset.value, isStatic ? staticProps : props, name.value, name, true, isStatic);
22829 } else {
22830 if (name.value === "constructor") {
22831 state.nameStack.set(c);
22832 } else {
22833 state.nameStack.set(name);
22834 }
22835 saveProperty(isStatic ? staticProps : props, name.value, name, true, isStatic);
22836 }
22837 }
22838
22839 if (getset && name.value === "constructor") {
22840 var propDesc = getset.value === "get" ? "class getter method" : "class setter method";
22841 error("E049", name, propDesc, "constructor");
22842 } else if (name.value === "prototype") {
22843 error("E049", name, "class method", "prototype");
22844 }
22845
22846 propertyName(name);
22847
22848 doFunction({
22849 statement: c,
22850 type: isGenerator ? "generator" : null,
22851 classExprBinding: c.namedExpr ? c.name : null
22852 });
22853 }
22854
22855 checkProperties(props);
22856 }
22857
22858 blockstmt("function", function(context) {
22859 var inexport = context && context.inexport;
22860 var generator = false;
22861 if (state.tokens.next.value === "*") {
22862 advance("*");
22863 if (state.inES6(true)) {
22864 generator = true;
22865 } else {
22866 warning("W119", state.tokens.curr, "function*", "6");
22867 }
22868 }
22869 if (inblock) {
22870 warning("W082", state.tokens.curr);
22871 }
22872 var i = optionalidentifier();
22873
22874 state.funct["(scope)"].addlabel(i, {
22875 type: "function",
22876 token: state.tokens.curr });
22877
22878 if (i === undefined) {
22879 warning("W025");
22880 } else if (inexport) {
22881 state.funct["(scope)"].setExported(i, state.tokens.prev);
22882 }
22883
22884 doFunction({
22885 name: i,
22886 statement: this,
22887 type: generator ? "generator" : null,
22888 ignoreLoopFunc: inblock // a declaration may already have warned
22889 });
22890 if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) {
22891 error("E039");
22892 }
22893 return this;
22894 });
22895
22896 prefix("function", function() {
22897 var generator = false;
22898
22899 if (state.tokens.next.value === "*") {
22900 if (!state.inES6()) {
22901 warning("W119", state.tokens.curr, "function*", "6");
22902 }
22903 advance("*");
22904 generator = true;
22905 }
22906
22907 var i = optionalidentifier();
22908 doFunction({ name: i, type: generator ? "generator" : null });
22909 return this;
22910 });
22911
22912 blockstmt("if", function() {
22913 var t = state.tokens.next;
22914 increaseComplexityCount();
22915 state.condition = true;
22916 advance("(");
22917 var expr = expression(0);
22918
22919 if (!expr) {
22920 quit("E041", this);
22921 }
22922
22923 checkCondAssignment(expr);
22924
22925 // When the if is within a for-in loop, check if the condition
22926 // starts with a negation operator
22927 var forinifcheck = null;
22928 if (state.option.forin && state.forinifcheckneeded) {
22929 state.forinifcheckneeded = false; // We only need to analyze the first if inside the loop
22930 forinifcheck = state.forinifchecks[state.forinifchecks.length - 1];
22931 if (expr.type === "(punctuator)" && expr.value === "!") {
22932 forinifcheck.type = "(negative)";
22933 } else {
22934 forinifcheck.type = "(positive)";
22935 }
22936 }
22937
22938 advance(")", t);
22939 state.condition = false;
22940 var s = block(true, true);
22941
22942 // When the if is within a for-in loop and the condition has a negative form,
22943 // check if the body contains nothing but a continue statement
22944 if (forinifcheck && forinifcheck.type === "(negative)") {
22945 if (s && s[0] && s[0].type === "(identifier)" && s[0].value === "continue") {
22946 forinifcheck.type = "(negative-with-continue)";
22947 }
22948 }
22949
22950 if (state.tokens.next.id === "else") {
22951 advance("else");
22952 if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") {
22953 statement();
22954 } else {
22955 block(true, true);
22956 }
22957 }
22958 return this;
22959 });
22960
22961 blockstmt("try", function() {
22962 var b;
22963
22964 function doCatch() {
22965 advance("catch");
22966 advance("(");
22967
22968 state.funct["(scope)"].stack("catchparams");
22969
22970 if (checkPunctuators(state.tokens.next, ["[", "{"])) {
22971 var tokens = destructuringPattern();
22972 _.each(tokens, function(token) {
22973 if (token.id) {
22974 state.funct["(scope)"].addParam(token.id, token, "exception");
22975 }
22976 });
22977 } else if (state.tokens.next.type !== "(identifier)") {
22978 warning("E030", state.tokens.next, state.tokens.next.value);
22979 } else {
22980 // only advance if we have an identifier so we can continue parsing in the most common error - that no param is given.
22981 state.funct["(scope)"].addParam(identifier(), state.tokens.curr, "exception");
22982 }
22983
22984 if (state.tokens.next.value === "if") {
22985 if (!state.inMoz()) {
22986 warning("W118", state.tokens.curr, "catch filter");
22987 }
22988 advance("if");
22989 expression(0);
22990 }
22991
22992 advance(")");
22993
22994 block(false);
22995
22996 state.funct["(scope)"].unstack();
22997 }
22998
22999 block(true);
23000
23001 while (state.tokens.next.id === "catch") {
23002 increaseComplexityCount();
23003 if (b && (!state.inMoz())) {
23004 warning("W118", state.tokens.next, "multiple catch blocks");
23005 }
23006 doCatch();
23007 b = true;
23008 }
23009
23010 if (state.tokens.next.id === "finally") {
23011 advance("finally");
23012 block(true);
23013 return;
23014 }
23015
23016 if (!b) {
23017 error("E021", state.tokens.next, "catch", state.tokens.next.value);
23018 }
23019
23020 return this;
23021 });
23022
23023 blockstmt("while", function() {
23024 var t = state.tokens.next;
23025 state.funct["(breakage)"] += 1;
23026 state.funct["(loopage)"] += 1;
23027 increaseComplexityCount();
23028 advance("(");
23029 checkCondAssignment(expression(0));
23030 advance(")", t);
23031 block(true, true);
23032 state.funct["(breakage)"] -= 1;
23033 state.funct["(loopage)"] -= 1;
23034 return this;
23035 }).labelled = true;
23036
23037 blockstmt("with", function() {
23038 var t = state.tokens.next;
23039 if (state.isStrict()) {
23040 error("E010", state.tokens.curr);
23041 } else if (!state.option.withstmt) {
23042 warning("W085", state.tokens.curr);
23043 }
23044
23045 advance("(");
23046 expression(0);
23047 advance(")", t);
23048 block(true, true);
23049
23050 return this;
23051 });
23052
23053 blockstmt("switch", function() {
23054 var t = state.tokens.next;
23055 var g = false;
23056 var noindent = false;
23057
23058 state.funct["(breakage)"] += 1;
23059 advance("(");
23060 checkCondAssignment(expression(0));
23061 advance(")", t);
23062 t = state.tokens.next;
23063 advance("{");
23064
23065 if (state.tokens.next.from === indent)
23066 noindent = true;
23067
23068 if (!noindent)
23069 indent += state.option.indent;
23070
23071 this.cases = [];
23072
23073 for (;;) {
23074 switch (state.tokens.next.id) {
23075 case "case":
23076 switch (state.funct["(verb)"]) {
23077 case "yield":
23078 case "break":
23079 case "case":
23080 case "continue":
23081 case "return":
23082 case "switch":
23083 case "throw":
23084 break;
23085 default:
23086 // You can tell JSHint that you don't use break intentionally by
23087 // adding a comment /* falls through */ on a line just before
23088 // the next `case`.
23089 if (!state.tokens.curr.caseFallsThrough) {
23090 warning("W086", state.tokens.curr, "case");
23091 }
23092 }
23093
23094 advance("case");
23095 this.cases.push(expression(0));
23096 increaseComplexityCount();
23097 g = true;
23098 advance(":");
23099 state.funct["(verb)"] = "case";
23100 break;
23101 case "default":
23102 switch (state.funct["(verb)"]) {
23103 case "yield":
23104 case "break":
23105 case "continue":
23106 case "return":
23107 case "throw":
23108 break;
23109 default:
23110 // Do not display a warning if 'default' is the first statement or if
23111 // there is a special /* falls through */ comment.
23112 if (this.cases.length) {
23113 if (!state.tokens.curr.caseFallsThrough) {
23114 warning("W086", state.tokens.curr, "default");
23115 }
23116 }
23117 }
23118
23119 advance("default");
23120 g = true;
23121 advance(":");
23122 break;
23123 case "}":
23124 if (!noindent)
23125 indent -= state.option.indent;
23126
23127 advance("}", t);
23128 state.funct["(breakage)"] -= 1;
23129 state.funct["(verb)"] = undefined;
23130 return;
23131 case "(end)":
23132 error("E023", state.tokens.next, "}");
23133 return;
23134 default:
23135 indent += state.option.indent;
23136 if (g) {
23137 switch (state.tokens.curr.id) {
23138 case ",":
23139 error("E040");
23140 return;
23141 case ":":
23142 g = false;
23143 statements();
23144 break;
23145 default:
23146 error("E025", state.tokens.curr);
23147 return;
23148 }
23149 } else {
23150 if (state.tokens.curr.id === ":") {
23151 advance(":");
23152 error("E024", state.tokens.curr, ":");
23153 statements();
23154 } else {
23155 error("E021", state.tokens.next, "case", state.tokens.next.value);
23156 return;
23157 }
23158 }
23159 indent -= state.option.indent;
23160 }
23161 }
23162 return this;
23163 }).labelled = true;
23164
23165 stmt("debugger", function() {
23166 if (!state.option.debug) {
23167 warning("W087", this);
23168 }
23169 return this;
23170 }).exps = true;
23171
23172 (function() {
23173 var x = stmt("do", function() {
23174 state.funct["(breakage)"] += 1;
23175 state.funct["(loopage)"] += 1;
23176 increaseComplexityCount();
23177
23178 this.first = block(true, true);
23179 advance("while");
23180 var t = state.tokens.next;
23181 advance("(");
23182 checkCondAssignment(expression(0));
23183 advance(")", t);
23184 state.funct["(breakage)"] -= 1;
23185 state.funct["(loopage)"] -= 1;
23186 return this;
23187 });
23188 x.labelled = true;
23189 x.exps = true;
23190 }());
23191
23192 blockstmt("for", function() {
23193 var s, t = state.tokens.next;
23194 var letscope = false;
23195 var foreachtok = null;
23196
23197 if (t.value === "each") {
23198 foreachtok = t;
23199 advance("each");
23200 if (!state.inMoz()) {
23201 warning("W118", state.tokens.curr, "for each");
23202 }
23203 }
23204
23205 increaseComplexityCount();
23206 advance("(");
23207
23208 // what kind of for(…) statement it is? for(…of…)? for(…in…)? for(…;…;…)?
23209 var nextop; // contains the token of the "in" or "of" operator
23210 var i = 0;
23211 var inof = ["in", "of"];
23212 var level = 0; // BindingPattern "level" --- level 0 === no BindingPattern
23213 var comma; // First comma punctuator at level 0
23214 var initializer; // First initializer at level 0
23215 var bindingPower;
23216 var targets;
23217 var target;
23218
23219 // If initial token is a BindingPattern, count it as such.
23220 if (checkPunctuators(state.tokens.next, ["{", "["])) ++level;
23221 do {
23222 nextop = peek(i);
23223 ++i;
23224 if (checkPunctuators(nextop, ["{", "["])) ++level;
23225 else if (checkPunctuators(nextop, ["}", "]"])) --level;
23226 if (level < 0) break;
23227 if (level === 0) {
23228 if (!comma && checkPunctuator(nextop, ",")) comma = nextop;
23229 else if (!initializer && checkPunctuator(nextop, "=")) initializer = nextop;
23230 }
23231 } while (level > 0 || !_.contains(inof, nextop.value) && nextop.value !== ";" &&
23232 nextop.type !== "(end)"); // Is this a JSCS bug? This looks really weird.
23233
23234 // if we're in a for (… in|of …) statement
23235 if (_.contains(inof, nextop.value)) {
23236 if (nextop.value === "of") {
23237 bindingPower = 20;
23238 if (!state.inES6()) {
23239 warning("W104", nextop, "for of", "6");
23240 }
23241 } else {
23242 bindingPower = 0;
23243 }
23244
23245 if (initializer) {
23246 error("W133", comma, nextop.value, "initializer is forbidden");
23247 }
23248
23249 if (comma) {
23250 error("W133", comma, nextop.value, "more than one ForBinding");
23251 }
23252
23253 if (state.tokens.next.id === "var") {
23254 advance("var");
23255 state.tokens.curr.fud({ prefix: true });
23256 } else if (state.tokens.next.id === "let" || state.tokens.next.id === "const") {
23257 advance(state.tokens.next.id);
23258 // create a new block scope
23259 letscope = true;
23260 state.funct["(scope)"].stack();
23261 state.tokens.curr.fud({ prefix: true });
23262 } else {
23263 targets = [];
23264
23265 // The following parsing logic recognizes initializers and the comma
23266 // operator despite the fact that they are not supported by the
23267 // grammar. Doing so allows JSHint to emit more a meaningful error
23268 // message (i.e. W133) in response to a common programming mistake.
23269 do {
23270 if (checkPunctuators(state.tokens.next, ["{", "["])) {
23271 destructuringPattern({ assignment: true }).forEach(function(elem) {
23272 this.push(elem.token);
23273 }, targets);
23274 } else {
23275 target = expression(120);
23276
23277 if (target.type === "(identifier)") {
23278 targets.push(target);
23279 }
23280
23281 checkLeftSideAssign(target, nextop);
23282 }
23283
23284 if (checkPunctuator(state.tokens.next, "=")) {
23285 advance("=");
23286 expression(120);
23287 }
23288
23289 if (checkPunctuator(state.tokens.next, ",")) {
23290 advance(",");
23291 }
23292 } while (state.tokens.next !== nextop);
23293
23294 // In the event of a syntax error, do no issue warnings regarding the
23295 // implicit creation of bindings.
23296 if (!initializer && !comma) {
23297 targets.forEach(function(token) {
23298 if (!state.funct["(scope)"].has(token.value)) {
23299 warning("W088", token, token.value);
23300 }
23301 });
23302 }
23303 }
23304
23305 advance(nextop.value);
23306 // The binding power is variable because for-in statements accept any
23307 // Expression in this position, while for-of statements are limited to
23308 // AssignmentExpressions. For example:
23309 //
23310 // for ( LeftHandSideExpression in Expression ) Statement
23311 // for ( LeftHandSideExpression of AssignmentExpression ) Statement
23312 expression(bindingPower);
23313 advance(")", t);
23314
23315 if (nextop.value === "in" && state.option.forin) {
23316 state.forinifcheckneeded = true;
23317
23318 if (state.forinifchecks === undefined) {
23319 state.forinifchecks = [];
23320 }
23321
23322 // Push a new for-in-if check onto the stack. The type will be modified
23323 // when the loop's body is parsed and a suitable if statement exists.
23324 state.forinifchecks.push({
23325 type: "(none)"
23326 });
23327 }
23328
23329 state.funct["(breakage)"] += 1;
23330 state.funct["(loopage)"] += 1;
23331
23332 s = block(true, true);
23333
23334 if (nextop.value === "in" && state.option.forin) {
23335 if (state.forinifchecks && state.forinifchecks.length > 0) {
23336 var check = state.forinifchecks.pop();
23337
23338 if (// No if statement or not the first statement in loop body
23339 s && s.length > 0 && (typeof s[0] !== "object" || s[0].value !== "if") ||
23340 // Positive if statement is not the only one in loop body
23341 check.type === "(positive)" && s.length > 1 ||
23342 // Negative if statement but no continue
23343 check.type === "(negative)") {
23344 warning("W089", this);
23345 }
23346 }
23347
23348 // Reset the flag in case no if statement was contained in the loop body
23349 state.forinifcheckneeded = false;
23350 }
23351
23352 state.funct["(breakage)"] -= 1;
23353 state.funct["(loopage)"] -= 1;
23354 } else {
23355 if (foreachtok) {
23356 error("E045", foreachtok);
23357 }
23358 if (state.tokens.next.id !== ";") {
23359 if (state.tokens.next.id === "var") {
23360 advance("var");
23361 state.tokens.curr.fud();
23362 } else if (state.tokens.next.id === "let") {
23363 advance("let");
23364 // create a new block scope
23365 letscope = true;
23366 state.funct["(scope)"].stack();
23367 state.tokens.curr.fud();
23368 } else {
23369 for (;;) {
23370 expression(0, "for");
23371 if (state.tokens.next.id !== ",") {
23372 break;
23373 }
23374 parseComma();
23375 }
23376 }
23377 }
23378 nolinebreak(state.tokens.curr);
23379 advance(";");
23380
23381 // start loopage after the first ; as the next two expressions are executed
23382 // on every loop
23383 state.funct["(loopage)"] += 1;
23384 if (state.tokens.next.id !== ";") {
23385 checkCondAssignment(expression(0));
23386 }
23387 nolinebreak(state.tokens.curr);
23388 advance(";");
23389 if (state.tokens.next.id === ";") {
23390 error("E021", state.tokens.next, ")", ";");
23391 }
23392 if (state.tokens.next.id !== ")") {
23393 for (;;) {
23394 expression(0, "for");
23395 if (state.tokens.next.id !== ",") {
23396 break;
23397 }
23398 parseComma();
23399 }
23400 }
23401 advance(")", t);
23402 state.funct["(breakage)"] += 1;
23403 block(true, true);
23404 state.funct["(breakage)"] -= 1;
23405 state.funct["(loopage)"] -= 1;
23406
23407 }
23408 // unstack loop blockscope
23409 if (letscope) {
23410 state.funct["(scope)"].unstack();
23411 }
23412 return this;
23413 }).labelled = true;
23414
23415
23416 stmt("break", function() {
23417 var v = state.tokens.next.value;
23418
23419 if (!state.option.asi)
23420 nolinebreak(this);
23421
23422 if (state.tokens.next.id !== ";" && !state.tokens.next.reach &&
23423 state.tokens.curr.line === startLine(state.tokens.next)) {
23424 if (!state.funct["(scope)"].funct.hasBreakLabel(v)) {
23425 warning("W090", state.tokens.next, v);
23426 }
23427 this.first = state.tokens.next;
23428 advance();
23429 } else {
23430 if (state.funct["(breakage)"] === 0)
23431 warning("W052", state.tokens.next, this.value);
23432 }
23433
23434 reachable(this);
23435
23436 return this;
23437 }).exps = true;
23438
23439
23440 stmt("continue", function() {
23441 var v = state.tokens.next.value;
23442
23443 if (state.funct["(breakage)"] === 0 || !state.funct["(loopage)"]) {
23444 warning("W052", state.tokens.next, this.value);
23445 }
23446
23447 if (!state.option.asi)
23448 nolinebreak(this);
23449
23450 if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
23451 if (state.tokens.curr.line === startLine(state.tokens.next)) {
23452 if (!state.funct["(scope)"].funct.hasBreakLabel(v)) {
23453 warning("W090", state.tokens.next, v);
23454 }
23455 this.first = state.tokens.next;
23456 advance();
23457 }
23458 }
23459
23460 reachable(this);
23461
23462 return this;
23463 }).exps = true;
23464
23465
23466 stmt("return", function() {
23467 if (this.line === startLine(state.tokens.next)) {
23468 if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
23469 this.first = expression(0);
23470
23471 if (this.first &&
23472 this.first.type === "(punctuator)" && this.first.value === "=" &&
23473 !this.first.paren && !state.option.boss) {
23474 warningAt("W093", this.first.line, this.first.character);
23475 }
23476 }
23477 } else {
23478 if (state.tokens.next.type === "(punctuator)" &&
23479 ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) {
23480 nolinebreak(this); // always warn (Line breaking error)
23481 }
23482 }
23483
23484 reachable(this);
23485
23486 return this;
23487 }).exps = true;
23488
23489 (function(x) {
23490 x.exps = true;
23491 x.lbp = 25;
23492 x.ltBoundary = "after";
23493 }(prefix("yield", function() {
23494 if (state.inMoz()) {
23495 return mozYield.call(this);
23496 }
23497 var prev = state.tokens.prev;
23498
23499 if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) {
23500 error("E061", this);
23501 }
23502
23503 if (state.inES6(true) && !state.funct["(generator)"]) {
23504 // If it's a yield within a catch clause inside a generator then that's ok
23505 if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) {
23506 error("E046", state.tokens.curr, "yield");
23507 }
23508 } else if (!state.inES6()) {
23509 warning("W104", state.tokens.curr, "yield", "6");
23510 }
23511 state.funct["(generator)"] = "yielded";
23512 var delegatingYield = false;
23513
23514 if (state.tokens.next.value === "*") {
23515 delegatingYield = true;
23516 advance("*");
23517 }
23518
23519 // Parse operand
23520 if (!isEndOfExpr() && state.tokens.next.id !== ",") {
23521 if (state.tokens.next.nud) {
23522
23523 nobreaknonadjacent(state.tokens.curr, state.tokens.next);
23524 this.first = expression(10);
23525
23526 if (this.first.type === "(punctuator)" && this.first.value === "=" &&
23527 !this.first.paren && !state.option.boss) {
23528 warningAt("W093", this.first.line, this.first.character);
23529 }
23530 } else if (state.tokens.next.led) {
23531 if (state.tokens.next.id !== ",") {
23532 error("W017", state.tokens.next);
23533 }
23534 }
23535 }
23536
23537 return this;
23538 })));
23539
23540 /**
23541 * Parsing logic for non-standard Mozilla implementation of `yield`
23542 * expressions.
23543 */
23544 var mozYield = function() {
23545 var prev = state.tokens.prev;
23546 if (state.inES6(true) && !state.funct["(generator)"]) {
23547 // If it's a yield within a catch clause inside a generator then that's ok
23548 if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) {
23549 error("E046", state.tokens.curr, "yield");
23550 }
23551 }
23552 state.funct["(generator)"] = "yielded";
23553 var delegatingYield = false;
23554
23555 if (state.tokens.next.value === "*") {
23556 delegatingYield = true;
23557 advance("*");
23558 }
23559
23560 if (this.line === startLine(state.tokens.next)) {
23561 if (delegatingYield ||
23562 (state.tokens.next.id !== ";" && !state.option.asi &&
23563 !state.tokens.next.reach && state.tokens.next.nud)) {
23564
23565 nobreaknonadjacent(state.tokens.curr, state.tokens.next);
23566 this.first = expression(10);
23567
23568 if (this.first.type === "(punctuator)" && this.first.value === "=" &&
23569 !this.first.paren && !state.option.boss) {
23570 warningAt("W093", this.first.line, this.first.character);
23571 }
23572 }
23573
23574 if (state.tokens.next.id !== ")" &&
23575 (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) {
23576 error("E050", this);
23577 }
23578 } else if (!state.option.asi) {
23579 nolinebreak(this); // always warn (Line breaking error)
23580 }
23581 return this;
23582 };
23583
23584 stmt("throw", function() {
23585 nolinebreak(this);
23586 this.first = expression(20);
23587
23588 reachable(this);
23589
23590 return this;
23591 }).exps = true;
23592
23593 stmt("import", function() {
23594 if (!state.funct["(scope)"].block.isGlobal()) {
23595 error("E053", state.tokens.curr, "Import");
23596 }
23597
23598 if (!state.inES6()) {
23599 warning("W119", state.tokens.curr, "import", "6");
23600 }
23601
23602 if (state.tokens.next.type === "(string)") {
23603 // ModuleSpecifier :: StringLiteral
23604 advance("(string)");
23605 return this;
23606 }
23607
23608 if (state.tokens.next.identifier) {
23609 // ImportClause :: ImportedDefaultBinding
23610 this.name = identifier();
23611 // Import bindings are immutable (see ES6 8.1.1.5.5)
23612 state.funct["(scope)"].addlabel(this.name, {
23613 type: "import",
23614 initialized: true,
23615 token: state.tokens.curr });
23616
23617 if (state.tokens.next.value === ",") {
23618 // ImportClause :: ImportedDefaultBinding , NameSpaceImport
23619 // ImportClause :: ImportedDefaultBinding , NamedImports
23620 advance(",");
23621 // At this point, we intentionally fall through to continue matching
23622 // either NameSpaceImport or NamedImports.
23623 // Discussion:
23624 // https://github.com/jshint/jshint/pull/2144#discussion_r23978406
23625 } else {
23626 advance("from");
23627 advance("(string)");
23628 return this;
23629 }
23630 }
23631
23632 if (state.tokens.next.id === "*") {
23633 // ImportClause :: NameSpaceImport
23634 advance("*");
23635 advance("as");
23636 if (state.tokens.next.identifier) {
23637 this.name = identifier();
23638 // Import bindings are immutable (see ES6 8.1.1.5.5)
23639 state.funct["(scope)"].addlabel(this.name, {
23640 type: "import",
23641 initialized: true,
23642 token: state.tokens.curr });
23643 }
23644 } else {
23645 // ImportClause :: NamedImports
23646 advance("{");
23647 for (;;) {
23648 if (state.tokens.next.value === "}") {
23649 advance("}");
23650 break;
23651 }
23652 var importName;
23653 if (state.tokens.next.type === "default") {
23654 importName = "default";
23655 advance("default");
23656 } else {
23657 importName = identifier();
23658 }
23659 if (state.tokens.next.value === "as") {
23660 advance("as");
23661 importName = identifier();
23662 }
23663
23664 // Import bindings are immutable (see ES6 8.1.1.5.5)
23665 state.funct["(scope)"].addlabel(importName, {
23666 type: "import",
23667 initialized: true,
23668 token: state.tokens.curr });
23669
23670 if (state.tokens.next.value === ",") {
23671 advance(",");
23672 } else if (state.tokens.next.value === "}") {
23673 advance("}");
23674 break;
23675 } else {
23676 error("E024", state.tokens.next, state.tokens.next.value);
23677 break;
23678 }
23679 }
23680 }
23681
23682 // FromClause
23683 advance("from");
23684 advance("(string)");
23685 return this;
23686 }).exps = true;
23687
23688 stmt("export", function() {
23689 var ok = true;
23690 var token;
23691 var identifier;
23692
23693 if (!state.inES6()) {
23694 warning("W119", state.tokens.curr, "export", "6");
23695 ok = false;
23696 }
23697
23698 if (!state.funct["(scope)"].block.isGlobal()) {
23699 error("E053", state.tokens.curr, "Export");
23700 ok = false;
23701 }
23702
23703 if (state.tokens.next.value === "*") {
23704 // ExportDeclaration :: export * FromClause
23705 advance("*");
23706 advance("from");
23707 advance("(string)");
23708 return this;
23709 }
23710
23711 if (state.tokens.next.type === "default") {
23712 // ExportDeclaration ::
23713 // export default [lookahead ∉ { function, class }] AssignmentExpression[In] ;
23714 // export default HoistableDeclaration
23715 // export default ClassDeclaration
23716 state.nameStack.set(state.tokens.next);
23717 advance("default");
23718 var exportType = state.tokens.next.id;
23719 if (exportType === "function" || exportType === "class") {
23720 this.block = true;
23721 }
23722
23723 token = peek();
23724
23725 expression(10);
23726
23727 identifier = token.value;
23728
23729 if (this.block) {
23730 state.funct["(scope)"].addlabel(identifier, {
23731 type: exportType,
23732 initialized: true,
23733 token: token });
23734
23735 state.funct["(scope)"].setExported(identifier, token);
23736 }
23737
23738 return this;
23739 }
23740
23741 if (state.tokens.next.value === "{") {
23742 // ExportDeclaration :: export ExportClause
23743 advance("{");
23744 var exportedTokens = [];
23745 for (;;) {
23746 if (!state.tokens.next.identifier) {
23747 error("E030", state.tokens.next, state.tokens.next.value);
23748 }
23749 advance();
23750
23751 exportedTokens.push(state.tokens.curr);
23752
23753 if (state.tokens.next.value === "as") {
23754 advance("as");
23755 if (!state.tokens.next.identifier) {
23756 error("E030", state.tokens.next, state.tokens.next.value);
23757 }
23758 advance();
23759 }
23760
23761 if (state.tokens.next.value === ",") {
23762 advance(",");
23763 } else if (state.tokens.next.value === "}") {
23764 advance("}");
23765 break;
23766 } else {
23767 error("E024", state.tokens.next, state.tokens.next.value);
23768 break;
23769 }
23770 }
23771 if (state.tokens.next.value === "from") {
23772 // ExportDeclaration :: export ExportClause FromClause
23773 advance("from");
23774 advance("(string)");
23775 } else if (ok) {
23776 exportedTokens.forEach(function(token) {
23777 state.funct["(scope)"].setExported(token.value, token);
23778 });
23779 }
23780 return this;
23781 }
23782
23783 if (state.tokens.next.id === "var") {
23784 // ExportDeclaration :: export VariableStatement
23785 advance("var");
23786 state.tokens.curr.fud({ inexport:true });
23787 } else if (state.tokens.next.id === "let") {
23788 // ExportDeclaration :: export VariableStatement
23789 advance("let");
23790 state.tokens.curr.fud({ inexport:true });
23791 } else if (state.tokens.next.id === "const") {
23792 // ExportDeclaration :: export VariableStatement
23793 advance("const");
23794 state.tokens.curr.fud({ inexport:true });
23795 } else if (state.tokens.next.id === "function") {
23796 // ExportDeclaration :: export Declaration
23797 this.block = true;
23798 advance("function");
23799 state.syntax["function"].fud({ inexport:true });
23800 } else if (state.tokens.next.id === "class") {
23801 // ExportDeclaration :: export Declaration
23802 this.block = true;
23803 advance("class");
23804 var classNameToken = state.tokens.next;
23805 state.syntax["class"].fud();
23806 state.funct["(scope)"].setExported(classNameToken.value, classNameToken);
23807 } else {
23808 error("E024", state.tokens.next, state.tokens.next.value);
23809 }
23810
23811 return this;
23812 }).exps = true;
23813
23814 // Future Reserved Words
23815
23816 FutureReservedWord("abstract");
23817 FutureReservedWord("await", { es5: true, moduleOnly: true });
23818 FutureReservedWord("boolean");
23819 FutureReservedWord("byte");
23820 FutureReservedWord("char");
23821 FutureReservedWord("class", { es5: true, nud: classdef });
23822 FutureReservedWord("double");
23823 FutureReservedWord("enum", { es5: true });
23824 FutureReservedWord("export", { es5: true });
23825 FutureReservedWord("extends", { es5: true });
23826 FutureReservedWord("final");
23827 FutureReservedWord("float");
23828 FutureReservedWord("goto");
23829 FutureReservedWord("implements", { es5: true, strictOnly: true });
23830 FutureReservedWord("import", { es5: true });
23831 FutureReservedWord("int");
23832 FutureReservedWord("interface", { es5: true, strictOnly: true });
23833 FutureReservedWord("long");
23834 FutureReservedWord("native");
23835 FutureReservedWord("package", { es5: true, strictOnly: true });
23836 FutureReservedWord("private", { es5: true, strictOnly: true });
23837 FutureReservedWord("protected", { es5: true, strictOnly: true });
23838 FutureReservedWord("public", { es5: true, strictOnly: true });
23839 FutureReservedWord("short");
23840 FutureReservedWord("static", { es5: true, strictOnly: true });
23841 FutureReservedWord("super", { es5: true });
23842 FutureReservedWord("synchronized");
23843 FutureReservedWord("transient");
23844 FutureReservedWord("volatile");
23845
23846 // this function is used to determine whether a squarebracket or a curlybracket
23847 // expression is a comprehension array, destructuring assignment or a json value.
23848
23849 var lookupBlockType = function() {
23850 var pn, pn1, prev;
23851 var i = -1;
23852 var bracketStack = 0;
23853 var ret = {};
23854 if (checkPunctuators(state.tokens.curr, ["[", "{"])) {
23855 bracketStack += 1;
23856 }
23857 do {
23858 prev = i === -1 ? state.tokens.curr : pn;
23859 pn = i === -1 ? state.tokens.next : peek(i);
23860 pn1 = peek(i + 1);
23861 i = i + 1;
23862 if (checkPunctuators(pn, ["[", "{"])) {
23863 bracketStack += 1;
23864 } else if (checkPunctuators(pn, ["]", "}"])) {
23865 bracketStack -= 1;
23866 }
23867 if (bracketStack === 1 && pn.identifier && pn.value === "for" &&
23868 !checkPunctuator(prev, ".")) {
23869 ret.isCompArray = true;
23870 ret.notJson = true;
23871 break;
23872 }
23873 if (bracketStack === 0 && checkPunctuators(pn, ["}", "]"])) {
23874 if (pn1.value === "=") {
23875 ret.isDestAssign = true;
23876 ret.notJson = true;
23877 break;
23878 } else if (pn1.value === ".") {
23879 ret.notJson = true;
23880 break;
23881 }
23882 }
23883 if (checkPunctuator(pn, ";")) {
23884 ret.isBlock = true;
23885 ret.notJson = true;
23886 }
23887 } while (bracketStack > 0 && pn.id !== "(end)");
23888 return ret;
23889 };
23890
23891 function saveProperty(props, name, tkn, isClass, isStatic) {
23892 var msg = ["key", "class method", "static class method"];
23893 msg = msg[(isClass || false) + (isStatic || false)];
23894 if (tkn.identifier) {
23895 name = tkn.value;
23896 }
23897
23898 if (props[name] && name !== "__proto__") {
23899 warning("W075", state.tokens.next, msg, name);
23900 } else {
23901 props[name] = Object.create(null);
23902 }
23903
23904 props[name].basic = true;
23905 props[name].basictkn = tkn;
23906 }
23907
23908 /**
23909 * @param {string} accessorType - Either "get" or "set"
23910 * @param {object} props - a collection of all properties of the object to
23911 * which the current accessor is being assigned
23912 * @param {object} tkn - the identifier token representing the accessor name
23913 * @param {boolean} isClass - whether the accessor is part of an ES6 Class
23914 * definition
23915 * @param {boolean} isStatic - whether the accessor is a static method
23916 */
23917 function saveAccessor(accessorType, props, name, tkn, isClass, isStatic) {
23918 var flagName = accessorType === "get" ? "getterToken" : "setterToken";
23919 var msg = "";
23920
23921 if (isClass) {
23922 if (isStatic) {
23923 msg += "static ";
23924 }
23925 msg += accessorType + "ter method";
23926 } else {
23927 msg = "key";
23928 }
23929
23930 state.tokens.curr.accessorType = accessorType;
23931 state.nameStack.set(tkn);
23932
23933 if (props[name]) {
23934 if ((props[name].basic || props[name][flagName]) && name !== "__proto__") {
23935 warning("W075", state.tokens.next, msg, name);
23936 }
23937 } else {
23938 props[name] = Object.create(null);
23939 }
23940
23941 props[name][flagName] = tkn;
23942 }
23943
23944 function computedPropertyName() {
23945 advance("[");
23946 if (!state.inES6()) {
23947 warning("W119", state.tokens.curr, "computed property names", "6");
23948 }
23949 var value = expression(10);
23950 advance("]");
23951 return value;
23952 }
23953
23954 /**
23955 * Test whether a given token is a punctuator matching one of the specified values
23956 * @param {Token} token
23957 * @param {Array.<string>} values
23958 * @returns {boolean}
23959 */
23960 function checkPunctuators(token, values) {
23961 if (token.type === "(punctuator)") {
23962 return _.contains(values, token.value);
23963 }
23964 return false;
23965 }
23966
23967 /**
23968 * Test whether a given token is a punctuator matching the specified value
23969 * @param {Token} token
23970 * @param {string} value
23971 * @returns {boolean}
23972 */
23973 function checkPunctuator(token, value) {
23974 return token.type === "(punctuator)" && token.value === value;
23975 }
23976
23977 // Check whether this function has been reached for a destructuring assign with undeclared values
23978 function destructuringAssignOrJsonValue() {
23979 // lookup for the assignment (ECMAScript 6 only)
23980 // if it has semicolons, it is a block, so go parse it as a block
23981 // or it's not a block, but there are assignments, check for undeclared variables
23982
23983 var block = lookupBlockType();
23984 if (block.notJson) {
23985 if (!state.inES6() && block.isDestAssign) {
23986 warning("W104", state.tokens.curr, "destructuring assignment", "6");
23987 }
23988 statements();
23989 // otherwise parse json value
23990 } else {
23991 state.option.laxbreak = true;
23992 state.jsonMode = true;
23993 jsonValue();
23994 }
23995 }
23996
23997 // array comprehension parsing function
23998 // parses and defines the three states of the list comprehension in order
23999 // to avoid defining global variables, but keeping them to the list comprehension scope
24000 // only. The order of the states are as follows:
24001 // * "use" which will be the returned iterative part of the list comprehension
24002 // * "define" which will define the variables local to the list comprehension
24003 // * "filter" which will help filter out values
24004
24005 var arrayComprehension = function() {
24006 var CompArray = function() {
24007 this.mode = "use";
24008 this.variables = [];
24009 };
24010 var _carrays = [];
24011 var _current;
24012 function declare(v) {
24013 var l = _current.variables.filter(function(elt) {
24014 // if it has, change its undef state
24015 if (elt.value === v) {
24016 elt.undef = false;
24017 return v;
24018 }
24019 }).length;
24020 return l !== 0;
24021 }
24022 function use(v) {
24023 var l = _current.variables.filter(function(elt) {
24024 // and if it has been defined
24025 if (elt.value === v && !elt.undef) {
24026 if (elt.unused === true) {
24027 elt.unused = false;
24028 }
24029 return v;
24030 }
24031 }).length;
24032 // otherwise we warn about it
24033 return (l === 0);
24034 }
24035 return { stack: function() {
24036 _current = new CompArray();
24037 _carrays.push(_current);
24038 },
24039 unstack: function() {
24040 _current.variables.filter(function(v) {
24041 if (v.unused)
24042 warning("W098", v.token, v.raw_text || v.value);
24043 if (v.undef)
24044 state.funct["(scope)"].block.use(v.value, v.token);
24045 });
24046 _carrays.splice(-1, 1);
24047 _current = _carrays[_carrays.length - 1];
24048 },
24049 setState: function(s) {
24050 if (_.contains(["use", "define", "generate", "filter"], s))
24051 _current.mode = s;
24052 },
24053 check: function(v) {
24054 if (!_current) {
24055 return;
24056 }
24057 // When we are in "use" state of the list comp, we enqueue that var
24058 if (_current && _current.mode === "use") {
24059 if (use(v)) {
24060 _current.variables.push({
24061 funct: state.funct,
24062 token: state.tokens.curr,
24063 value: v,
24064 undef: true,
24065 unused: false
24066 });
24067 }
24068 return true;
24069 // When we are in "define" state of the list comp,
24070 } else if (_current && _current.mode === "define") {
24071 // check if the variable has been used previously
24072 if (!declare(v)) {
24073 _current.variables.push({
24074 funct: state.funct,
24075 token: state.tokens.curr,
24076 value: v,
24077 undef: false,
24078 unused: true
24079 });
24080 }
24081 return true;
24082 // When we are in the "generate" state of the list comp,
24083 } else if (_current && _current.mode === "generate") {
24084 state.funct["(scope)"].block.use(v, state.tokens.curr);
24085 return true;
24086 // When we are in "filter" state,
24087 } else if (_current && _current.mode === "filter") {
24088 // we check whether current variable has been declared
24089 if (use(v)) {
24090 // if not we warn about it
24091 state.funct["(scope)"].block.use(v, state.tokens.curr);
24092 }
24093 return true;
24094 }
24095 return false;
24096 }
24097 };
24098 };
24099
24100
24101 // Parse JSON
24102
24103 function jsonValue() {
24104 function jsonObject() {
24105 var o = {}, t = state.tokens.next;
24106 advance("{");
24107 if (state.tokens.next.id !== "}") {
24108 for (;;) {
24109 if (state.tokens.next.id === "(end)") {
24110 error("E026", state.tokens.next, t.line);
24111 } else if (state.tokens.next.id === "}") {
24112 warning("W094", state.tokens.curr);
24113 break;
24114 } else if (state.tokens.next.id === ",") {
24115 error("E028", state.tokens.next);
24116 } else if (state.tokens.next.id !== "(string)") {
24117 warning("W095", state.tokens.next, state.tokens.next.value);
24118 }
24119 if (o[state.tokens.next.value] === true) {
24120 warning("W075", state.tokens.next, "key", state.tokens.next.value);
24121 } else if ((state.tokens.next.value === "__proto__" &&
24122 !state.option.proto) || (state.tokens.next.value === "__iterator__" &&
24123 !state.option.iterator)) {
24124 warning("W096", state.tokens.next, state.tokens.next.value);
24125 } else {
24126 o[state.tokens.next.value] = true;
24127 }
24128 advance();
24129 advance(":");
24130 jsonValue();
24131 if (state.tokens.next.id !== ",") {
24132 break;
24133 }
24134 advance(",");
24135 }
24136 }
24137 advance("}");
24138 }
24139
24140 function jsonArray() {
24141 var t = state.tokens.next;
24142 advance("[");
24143 if (state.tokens.next.id !== "]") {
24144 for (;;) {
24145 if (state.tokens.next.id === "(end)") {
24146 error("E027", state.tokens.next, t.line);
24147 } else if (state.tokens.next.id === "]") {
24148 warning("W094", state.tokens.curr);
24149 break;
24150 } else if (state.tokens.next.id === ",") {
24151 error("E028", state.tokens.next);
24152 }
24153 jsonValue();
24154 if (state.tokens.next.id !== ",") {
24155 break;
24156 }
24157 advance(",");
24158 }
24159 }
24160 advance("]");
24161 }
24162
24163 switch (state.tokens.next.id) {
24164 case "{":
24165 jsonObject();
24166 break;
24167 case "[":
24168 jsonArray();
24169 break;
24170 case "true":
24171 case "false":
24172 case "null":
24173 case "(number)":
24174 case "(string)":
24175 advance();
24176 break;
24177 case "-":
24178 advance("-");
24179 advance("(number)");
24180 break;
24181 default:
24182 error("E003", state.tokens.next);
24183 }
24184 }
24185
24186 /**
24187 * Lint dynamically-evaluated code, appending any resulting errors/warnings
24188 * into the global `errors` array.
24189 *
24190 * @param {array} internals - collection of "internals" objects describing
24191 * string tokens that contain evaluated code
24192 * @param {object} options - linting options to apply
24193 * @param {object} globals - globally-defined bindings for the evaluated code
24194 */
24195 function lintEvalCode(internals, options, globals) {
24196 var priorErrorCount, idx, jdx, internal;
24197
24198 for (idx = 0; idx < internals.length; idx += 1) {
24199 internal = internals[idx];
24200 options.scope = internal.elem;
24201 priorErrorCount = JSHINT.errors.length;
24202
24203 itself(internal.code, options, globals);
24204
24205 for (jdx = priorErrorCount; jdx < JSHINT.errors.length; jdx += 1) {
24206 JSHINT.errors[jdx].line += internal.token.line - 1;
24207 }
24208 }
24209 }
24210
24211 var escapeRegex = function(str) {
24212 return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
24213 };
24214
24215 // The actual JSHINT function itself.
24216 var itself = function(s, o, g) {
24217 var x, reIgnoreStr, reIgnore;
24218 var optionKeys;
24219 var newOptionObj = {};
24220 var newIgnoredObj = {};
24221
24222 o = _.clone(o);
24223 state.reset();
24224
24225 if (o && o.scope) {
24226 JSHINT.scope = o.scope;
24227 } else {
24228 JSHINT.errors = [];
24229 JSHINT.undefs = [];
24230 JSHINT.internals = [];
24231 JSHINT.blacklist = {};
24232 JSHINT.scope = "(main)";
24233 }
24234
24235 predefined = Object.create(null);
24236 combine(predefined, vars.ecmaIdentifiers[3]);
24237 combine(predefined, vars.reservedVars);
24238
24239 combine(predefined, g || {});
24240
24241 declared = Object.create(null);
24242 var exported = Object.create(null); // Variables that live outside the current file
24243
24244 function each(obj, cb) {
24245 if (!obj)
24246 return;
24247
24248 if (!Array.isArray(obj) && typeof obj === "object")
24249 obj = Object.keys(obj);
24250
24251 obj.forEach(cb);
24252 }
24253
24254 if (o) {
24255 each(o.predef || null, function(item) {
24256 var slice, prop;
24257
24258 if (item[0] === "-") {
24259 slice = item.slice(1);
24260 JSHINT.blacklist[slice] = slice;
24261 // remove from predefined if there
24262 delete predefined[slice];
24263 } else {
24264 prop = Object.getOwnPropertyDescriptor(o.predef, item);
24265 predefined[item] = prop ? prop.value : false;
24266 }
24267 });
24268
24269 each(o.exported || null, function(item) {
24270 exported[item] = true;
24271 });
24272
24273 delete o.predef;
24274 delete o.exported;
24275
24276 optionKeys = Object.keys(o);
24277 for (x = 0; x < optionKeys.length; x++) {
24278 if (/^-W\d{3}$/g.test(optionKeys[x])) {
24279 newIgnoredObj[optionKeys[x].slice(1)] = true;
24280 } else {
24281 var optionKey = optionKeys[x];
24282 newOptionObj[optionKey] = o[optionKey];
24283 }
24284 }
24285 }
24286
24287 state.option = newOptionObj;
24288 state.ignored = newIgnoredObj;
24289
24290 state.option.indent = state.option.indent || 4;
24291 state.option.maxerr = state.option.maxerr || 50;
24292
24293 indent = 1;
24294
24295 var scopeManagerInst = scopeManager(state, predefined, exported, declared);
24296 scopeManagerInst.on("warning", function(ev) {
24297 warning.apply(null, [ ev.code, ev.token].concat(ev.data));
24298 });
24299
24300 scopeManagerInst.on("error", function(ev) {
24301 error.apply(null, [ ev.code, ev.token ].concat(ev.data));
24302 });
24303
24304 state.funct = functor("(global)", null, {
24305 "(global)" : true,
24306 "(scope)" : scopeManagerInst,
24307 "(comparray)" : arrayComprehension(),
24308 "(metrics)" : createMetrics(state.tokens.next)
24309 });
24310
24311 functions = [state.funct];
24312 urls = [];
24313 stack = null;
24314 member = {};
24315 membersOnly = null;
24316 inblock = false;
24317 lookahead = [];
24318
24319 if (!isString(s) && !Array.isArray(s)) {
24320 errorAt("E004", 0);
24321 return false;
24322 }
24323
24324 api = {
24325 get isJSON() {
24326 return state.jsonMode;
24327 },
24328
24329 getOption: function(name) {
24330 return state.option[name] || null;
24331 },
24332
24333 getCache: function(name) {
24334 return state.cache[name];
24335 },
24336
24337 setCache: function(name, value) {
24338 state.cache[name] = value;
24339 },
24340
24341 warn: function(code, data) {
24342 warningAt.apply(null, [ code, data.line, data.char ].concat(data.data));
24343 },
24344
24345 on: function(names, listener) {
24346 names.split(" ").forEach(function(name) {
24347 emitter.on(name, listener);
24348 }.bind(this));
24349 }
24350 };
24351
24352 emitter.removeAllListeners();
24353 (extraModules || []).forEach(function(func) {
24354 func(api);
24355 });
24356
24357 state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"];
24358
24359 if (o && o.ignoreDelimiters) {
24360
24361 if (!Array.isArray(o.ignoreDelimiters)) {
24362 o.ignoreDelimiters = [o.ignoreDelimiters];
24363 }
24364
24365 o.ignoreDelimiters.forEach(function(delimiterPair) {
24366 if (!delimiterPair.start || !delimiterPair.end)
24367 return;
24368
24369 reIgnoreStr = escapeRegex(delimiterPair.start) +
24370 "[\\s\\S]*?" +
24371 escapeRegex(delimiterPair.end);
24372
24373 reIgnore = new RegExp(reIgnoreStr, "ig");
24374
24375 s = s.replace(reIgnore, function(match) {
24376 return match.replace(/./g, " ");
24377 });
24378 });
24379 }
24380
24381 lex = new Lexer(s);
24382
24383 lex.on("warning", function(ev) {
24384 warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data));
24385 });
24386
24387 lex.on("error", function(ev) {
24388 errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data));
24389 });
24390
24391 lex.on("fatal", function(ev) {
24392 quit("E041", ev);
24393 });
24394
24395 lex.on("Identifier", function(ev) {
24396 emitter.emit("Identifier", ev);
24397 });
24398
24399 lex.on("String", function(ev) {
24400 emitter.emit("String", ev);
24401 });
24402
24403 lex.on("Number", function(ev) {
24404 emitter.emit("Number", ev);
24405 });
24406
24407 // Check options
24408 for (var name in o) {
24409 if (_.has(o, name)) {
24410 checkOption(name, state.tokens.curr);
24411 }
24412 }
24413
24414 try {
24415 applyOptions();
24416
24417 // combine the passed globals after we've assumed all our options
24418 combine(predefined, g || {});
24419
24420 //reset values
24421 parseComma.first = true;
24422
24423 advance();
24424 switch (state.tokens.next.id) {
24425 case "{":
24426 case "[":
24427 destructuringAssignOrJsonValue();
24428 break;
24429 default:
24430 directives();
24431
24432 if (state.directive["use strict"]) {
24433 if (!state.allowsGlobalUsd()) {
24434 warning("W097", state.tokens.prev);
24435 }
24436 }
24437
24438 statements();
24439 }
24440
24441 if (state.tokens.next.id !== "(end)") {
24442 quit("E041", state.tokens.curr);
24443 }
24444
24445 state.funct["(scope)"].unstack();
24446
24447 } catch (err) {
24448 if (err && err.name === "JSHintError") {
24449 var nt = state.tokens.next || {};
24450 JSHINT.errors.push({
24451 scope : "(main)",
24452 raw : err.raw,
24453 code : err.code,
24454 reason : err.reason,
24455 line : err.line || nt.line,
24456 character : err.character || nt.from
24457 });
24458 } else {
24459 throw err;
24460 }
24461 }
24462
24463 // Loop over the listed "internals", and check them as well.
24464 if (JSHINT.scope === "(main)") {
24465 lintEvalCode(JSHINT.internals, o || {}, g);
24466 }
24467
24468 return JSHINT.errors.length === 0;
24469 };
24470
24471 // Modules.
24472 itself.addModule = function(func) {
24473 extraModules.push(func);
24474 };
24475
24476 itself.addModule(style.register);
24477
24478 // Data summary.
24479 itself.data = function() {
24480 var data = {
24481 functions: [],
24482 options: state.option
24483 };
24484
24485 var fu, f, i, j, n, globals;
24486
24487 if (itself.errors.length) {
24488 data.errors = itself.errors;
24489 }
24490
24491 if (state.jsonMode) {
24492 data.json = true;
24493 }
24494
24495 var impliedGlobals = state.funct["(scope)"].getImpliedGlobals();
24496 if (impliedGlobals.length > 0) {
24497 data.implieds = impliedGlobals;
24498 }
24499
24500 if (urls.length > 0) {
24501 data.urls = urls;
24502 }
24503
24504 globals = state.funct["(scope)"].getUsedOrDefinedGlobals();
24505 if (globals.length > 0) {
24506 data.globals = globals;
24507 }
24508
24509 for (i = 1; i < functions.length; i += 1) {
24510 f = functions[i];
24511 fu = {};
24512
24513 for (j = 0; j < functionicity.length; j += 1) {
24514 fu[functionicity[j]] = [];
24515 }
24516
24517 for (j = 0; j < functionicity.length; j += 1) {
24518 if (fu[functionicity[j]].length === 0) {
24519 delete fu[functionicity[j]];
24520 }
24521 }
24522
24523 fu.name = f["(name)"];
24524 fu.param = f["(params)"];
24525 fu.line = f["(line)"];
24526 fu.character = f["(character)"];
24527 fu.last = f["(last)"];
24528 fu.lastcharacter = f["(lastcharacter)"];
24529
24530 fu.metrics = {
24531 complexity: f["(metrics)"].ComplexityCount,
24532 parameters: f["(metrics)"].arity,
24533 statements: f["(metrics)"].statementCount
24534 };
24535
24536 data.functions.push(fu);
24537 }
24538
24539 var unuseds = state.funct["(scope)"].getUnuseds();
24540 if (unuseds.length > 0) {
24541 data.unused = unuseds;
24542 }
24543
24544 for (n in member) {
24545 if (typeof member[n] === "number") {
24546 data.member = member;
24547 break;
24548 }
24549 }
24550
24551 return data;
24552 };
24553
24554 itself.jshint = itself;
24555
24556 return itself;
24557 }());
24558
24559 // Make JSHINT a Node module, if possible.
24560 if (typeof exports === "object" && exports) {
24561 exports.JSHINT = JSHINT;
24562 }
24563
24564 },{"./lex.js":13,"./messages.js":14,"./options.js":16,"./reg.js":17,"./scope-manager.js":18,"./state.js":19,"./style.js":20,"./vars.js":21,"console-browserify":10,"events":5,"lodash":12}]},{},[]);
24565
24566 JSHINT = require('jshint').JSHINT;
24567 if (typeof exports === 'object' && exports) exports.JSHINT = JSHINT;
24568 }());